@@ -311,7 +311,7 @@ proc isOwnedSym(c: PContext; n: PNode): bool =
311
311
let s = qualifiedLookUp(c, n, {})
312
312
result = s != nil and sfSystemModule in s.owner.flags and s.name.s == " owned"
313
313
314
- proc semConv(c: PContext, n: PNode; expectedType: PType = nil ): PNode =
314
+ proc semConv(c: PContext, n: PNode; flags: TExprFlags = {}, expectedType: PType = nil ): PNode =
315
315
if n.len != 2 :
316
316
localError(c.config, n.info, " a type conversion takes exactly one argument" )
317
317
return n
@@ -358,7 +358,7 @@ proc semConv(c: PContext, n: PNode; expectedType: PType = nil): PNode =
358
358
if n[1 ].kind == nkExprEqExpr and
359
359
targetType.skipTypes(abstractPtrs).kind == tyObject:
360
360
localError(c.config, n.info, " object construction uses ':', not '='" )
361
- var op = semExprWithType(c, n[1 ])
361
+ var op = semExprWithType(c, n[1 ], flags * {efDetermineType} )
362
362
if op.kind == nkClosedSymChoice and op.len > 0 and
363
363
op[0 ].sym.kind == skEnumField: # resolves overloadedable enums
364
364
op = ambiguousSymChoice(c, n, op)
@@ -373,7 +373,9 @@ proc semConv(c: PContext, n: PNode; expectedType: PType = nil): PNode =
373
373
# here or needs to be overwritten too then.
374
374
result .add op
375
375
376
- if targetType.kind == tyGenericParam:
376
+ if targetType.kind == tyGenericParam or
377
+ (op.typ != nil and op.typ.kind == tyFromExpr and c.inGenericContext > 0 ):
378
+ # expression is compiled early in a generic body
377
379
result .typ = makeTypeFromExpr(c, copyTree(result ))
378
380
return result
379
381
@@ -1068,7 +1070,7 @@ proc semIndirectOp(c: PContext, n: PNode, flags: TExprFlags; expectedType: PType
1068
1070
t = skipTypes(n[0 ].typ, abstractInst+ {tyOwned}- {tyTypeDesc, tyDistinct})
1069
1071
if t != nil and t.kind == tyTypeDesc:
1070
1072
if n.len == 1 : return semObjConstr(c, n, flags, expectedType)
1071
- return semConv(c, n)
1073
+ return semConv(c, n, flags )
1072
1074
1073
1075
let nOrig = n.copyTree
1074
1076
semOpAux(c, n)
@@ -3110,7 +3112,7 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}, expectedType: PType
3110
3112
# XXX think about this more (``set`` procs)
3111
3113
let ambig = c.isAmbiguous
3112
3114
if not (n[0 ].kind in {nkClosedSymChoice, nkOpenSymChoice, nkIdent} and ambig) and n.len == 2 :
3113
- result = semConv(c, n, expectedType)
3115
+ result = semConv(c, n, flags, expectedType)
3114
3116
elif ambig and n.len == 1 :
3115
3117
errorUseQualifier(c, n.info, s)
3116
3118
elif n.len == 1 :
0 commit comments