diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 8e32589ea3..ec718e49fd 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -727,20 +727,31 @@ template isLocalSym(sym: PSym): bool = sym.kind in {skProc, skFunc, skIterator} and sfGlobal notin sym.flags -template isLocalVarSym(n: PNode): bool = - n.kind == nkSym and isLocalSym(n.sym) - proc usesLocalVar(n: PNode): bool = - result = false - for z in 1 ..< n.len: - if n[z].isLocalVarSym: - return true - elif n[z].kind in nkCallKinds: - if usesLocalVar(n[z]): + case n.kind + of nkSym: + result = isLocalSym(n.sym) + of nkCallKinds, nkObjConstr: + result = false + for i in 1 ..< n.len: + if usesLocalVar(n[i]): return true + of nkTupleConstr, nkPar, nkBracket, nkCurly: + result = false + for i in 0 ..< n.len: + if usesLocalVar(n[i]): + return true + of nkDotExpr, nkCheckedFieldExpr, + nkBracketExpr, nkAddr, nkHiddenAddr, + nkObjDownConv, nkObjUpConv: + result = usesLocalVar(n[0]) + of nkHiddenStdConv, nkHiddenSubConv, nkCast, nkExprColonExpr: + result = usesLocalVar(n[1]) + else: + result = false proc globalVarInitCheck(c: PContext, n: PNode) = - if n.isLocalVarSym or n.kind in nkCallKinds and usesLocalVar(n): + if usesLocalVar(n): localError(c.config, n.info, errCannotAssignToGlobal) const