diff --git a/src/nifc/codegen.nim b/src/nifc/codegen.nim index 0677f41f..d1ac09f5 100644 --- a/src/nifc/codegen.nim +++ b/src/nifc/codegen.nim @@ -331,6 +331,25 @@ type VarKind = enum IsLocal, IsGlobal, IsThreadlocal, IsConst +proc isLiteral(t: Tree; n: NodePos): bool = + case t[n].kind + of IntLit, UIntLit, FloatLit, + CharLit, StrLit, FalseC, TrueC, InfC, NegInfC, NanC, SufC: + result = true + of AconstrC: + result = true + for ch in sonsFromX(t, n): + if not isLiteral(t, ch): + return false + of OconstrC: + result = true + for ch in sonsFromX(t, n): + let (_, value) = sons2(t, ch) + if not isLiteral(t, value): + return false + else: + result = false + proc genVarDecl(c: var GeneratedCode; t: Tree; n: NodePos; vk: VarKind; toExtern = false) = let d = asVarDecl(t, n) genCLineDir(c, t, info(t, n)) @@ -350,11 +369,23 @@ proc genVarDecl(c: var GeneratedCode; t: Tree; n: NodePos; vk: VarKind; toExtern if vis == StaticC: c.code.insert(Token(StaticKeyword), beforeDecl) if t[d.value].kind != Empty: - c.add AsgnOpr - if vk != IsLocal: inc c.inSimpleInit - genx c, t, d.value - if vk != IsLocal: dec c.inSimpleInit - c.add Semicolon + if vk == IsGlobal and not isLiteral(t, d.value): + c.add Semicolon + moveToInitSection: + c.add name + c.add AsgnOpr + inc c.inSimpleInit + genx c, t, d.value + dec c.inSimpleInit + c.add Semicolon + else: + c.add AsgnOpr + if vk != IsLocal: inc c.inSimpleInit + genx c, t, d.value + if vk != IsLocal: dec c.inSimpleInit + c.add Semicolon + else: + c.add Semicolon else: error c.m, "expected SymbolDef but got: ", t, n diff --git a/tests/nimony/sysbasics/ttoplevelvars.nim b/tests/nimony/sysbasics/ttoplevelvars.nim new file mode 100644 index 00000000..faa57123 --- /dev/null +++ b/tests/nimony/sysbasics/ttoplevelvars.nim @@ -0,0 +1,17 @@ +var x = 1 +var y = 2 +x = y +var z = x + +const a = 1 +var m = a + +let s = x +let n = 3 + +proc foo = + var m = a + let g = x + const s = a + +foo() \ No newline at end of file