From c3e5c6c326747cf0acbe0e4f3d8dc71f9332a76e Mon Sep 17 00:00:00 2001 From: Zahary Karadjov Date: Fri, 30 Jun 2017 18:19:37 +0300 Subject: treat var modifiers inside the concept body correctly: #1033 --- compiler/semexprs.nim | 7 ++++++- compiler/semtypes.nim | 17 ++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) (limited to 'compiler') diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 9322b0873..291e02505 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -2206,9 +2206,14 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = message(n.info, warnDeprecated, "bind") result = semExpr(c, n.sons[0], flags) of nkTypeOfExpr, nkTupleTy, nkTupleClassTy, nkRefTy..nkEnumTy, nkStaticTy: + if c.matchedConcept != nil and n.len == 1: + let modifier = n.modifierTypeKindOfNode + if modifier != tyNone: + var baseType = semExpr(c, n[0]).typ.skipTypes({tyTypeDesc}) + result.typ = c.makeTypeDesc(c.newTypeWithSons(modifier, @[baseType])) + return var typ = semTypeNode(c, n, nil).skipTypes({tyTypeDesc}) result.typ = makeTypeDesc(c, typ) - #result = symNodeFromType(c, typ, n.info) of nkCall, nkInfix, nkPrefix, nkPostfix, nkCommand, nkCallStrLit: # check if it is an expression macro: checkMinSonsLen(n, 1) diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index de71f1632..6804a65f7 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -1202,6 +1202,15 @@ proc freshType(res, prev: PType): PType {.inline.} = else: result = res +template modifierTypeKindOfNode(n: PNode): TTypeKind = + case n.kind + of nkVarTy: tyVar + of nkRefTy: tyRef + of nkPtrTy: tyPtr + of nkStaticTy: tyStatic + of nkTypeOfExpr: tyTypeDesc + else: tyNone + proc semTypeClass(c: PContext, n: PNode, prev: PType): PType = # if n.sonsLen == 0: return newConstraint(c, tyTypeClass) if nfBase2 in n.flags: @@ -1227,13 +1236,7 @@ proc semTypeClass(c: PContext, n: PNode, prev: PType): PType = dummyName: PNode dummyType: PType - let modifier = case param.kind - of nkVarTy: tyVar - of nkRefTy: tyRef - of nkPtrTy: tyPtr - of nkStaticTy: tyStatic - of nkTypeOfExpr: tyTypeDesc - else: tyNone + let modifier = param.modifierTypeKindOfNode if modifier != tyNone: dummyName = param[0] -- cgit 1.4.1-2-gfad0