diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/semexprs.nim | 2 | ||||
-rw-r--r-- | compiler/semstmts.nim | 2 | ||||
-rw-r--r-- | compiler/semtypes.nim | 5 |
3 files changed, 7 insertions, 2 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 7c4fcd881..8169e359a 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1129,9 +1129,9 @@ proc builtinFieldAccess(c: PContext, n: PNode, flags: TExprFlags): PNode = # reset to prevent 'nil' bug: see "tests/reject/tenumitems.nim": ty = n.sons[0].typ return nil - ty = skipTypes(ty, {tyGenericInst, tyVar, tyPtr, tyRef, tyAlias}) if ty.kind in tyUserTypeClasses and ty.isResolvedUserTypeClass: ty = ty.lastSon + ty = skipTypes(ty, {tyGenericInst, tyVar, tyPtr, tyRef, tyAlias}) while tfBorrowDot in ty.flags: ty = ty.skipTypes({tyDistinct}) var check: PNode = nil if ty.kind == tyObject: diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 56435bbf1..ee4203299 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -467,6 +467,8 @@ proc hasEmpty(typ: PType): bool = proc makeDeref(n: PNode): PNode = var t = skipTypes(n.typ, {tyGenericInst, tyAlias}) + if t.kind in tyUserTypeClasses and t.isResolvedUserTypeClass: + t = t.lastSon result = n if t.kind == tyVar: result = newNodeIT(nkHiddenDeref, n.info, t.sons[0]) diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index 4c7786f61..0c2dd2f96 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -1415,7 +1415,10 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType = result = errorType(c) else: result = typeExpr.typ.base - if result.isMetaType: + if result.isMetaType and + result.kind != tyUserTypeClass: + # the dot expression may refer to a concept type in + # a different module. allow a normal alias then. let preprocessed = semGenericStmt(c, n) result = makeTypeFromExpr(c, preprocessed.copyTree) else: |