@@ -735,15 +735,14 @@ proc pickBestMatch(c: var SemContext; m: openArray[Match]): int =
735
735
other = - 1
736
736
if other >= 0 : result = - 2 # ambiguous
737
737
738
- const
739
- ConceptProcY = CchoiceY
740
-
741
738
type MagicCallKind = enum
742
739
NonMagicCall , MagicCall , MagicCallNeedsSemcheck
743
740
744
741
proc addFn (c: var SemContext ; fn: FnCandidate ; fnOrig: Cursor ; args: openArray [Item ]): MagicCallKind =
745
742
result = NonMagicCall
746
- if fn.kind in RoutineKinds :
743
+ if fn.fromConcept and fn.sym != SymId (0 ):
744
+ c.dest.add identToken (symToIdent (fn.sym), fnOrig.info)
745
+ elif fn.kind in RoutineKinds :
747
746
assert fn.sym != SymId (0 )
748
747
let res = tryLoadSym (fn.sym)
749
748
if res.status == LacksNothing :
@@ -772,8 +771,6 @@ proc addFn(c: var SemContext; fn: FnCandidate; fnOrig: Cursor; args: openArray[I
772
771
error " broken `magic`: expected ')', but got: " , n
773
772
if result == NonMagicCall :
774
773
c.dest.add symToken (fn.sym, fnOrig.info)
775
- elif fn.kind == ConceptProcY and fn.sym != SymId (0 ):
776
- c.dest.add identToken (symToIdent (fn.sym), fnOrig.info)
777
774
else :
778
775
c.dest.addSubtree fnOrig
779
776
@@ -848,7 +845,7 @@ proc maybeAddConceptMethods(c: var SemContext; fn: StrId; typevar: SymId; cands:
848
845
if prc.kind == SymbolDef and sameIdent (prc.symId, fn):
849
846
var d = ops
850
847
skipToParams d
851
- cands.addUnique FnCandidate (kind: ConceptProcY , sym: prc.symId, typ: d)
848
+ cands.addUnique FnCandidate (kind: sk , sym: prc.symId, typ: d, fromConcept: true )
852
849
skip ops
853
850
854
851
proc considerTypeboundOps (c: var SemContext ; m: var seq [Match ]; candidates: FnCandidates ; args: openArray [Item ], genericArgs: Cursor , hasNamedArgs: bool ) =
@@ -2407,7 +2404,10 @@ proc semConceptType(c: var SemContext; n: var Cursor) =
2407
2404
if n.stmtKind != StmtsS :
2408
2405
error " (stmts) expected, but got: " , n
2409
2406
takeToken c, n
2407
+ let oldScopeKind = c.currentScope.kind
2410
2408
withNewScope c:
2409
+ # make syms of routines in toplevel concept also toplevel:
2410
+ c.currentScope.kind = oldScopeKind
2411
2411
while true :
2412
2412
let k = n.symKind
2413
2413
if k in RoutineKinds :
@@ -3962,7 +3962,9 @@ proc semFor(c: var SemContext; it: var Item) =
3962
3962
var isMacroLike = false
3963
3963
if c.dest[beforeCall+ 1 ].kind == Symbol and c.isIterator (c.dest[beforeCall+ 1 ].symId):
3964
3964
discard " fine"
3965
- elif iterCall.typ.typeKind == UntypedT :
3965
+ elif iterCall.typ.typeKind == UntypedT or
3966
+ # for iterators from concepts in generic context:
3967
+ c.dest[beforeCall+ 1 ].kind == Ident :
3966
3968
isMacroLike = true
3967
3969
else :
3968
3970
buildErr c, it.n.info, " iterator expected"
0 commit comments