summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/ccgexprs.nim3
-rw-r--r--compiler/ccgtypes.nim5
-rw-r--r--tests/destructor/tarc3.nim25
3 files changed, 29 insertions, 4 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index eed29ff4b..885ee3486 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -2818,11 +2818,10 @@ proc getNullValueAux(p: BProc; t: PType; obj, constOrNil: PNode,
     # designated initilization is the only way to init non first element of unions
     # branches are allowed to have no members (b.len == 0), in this case they don't need initializer
     if  b.kind == nkRecList and b.len > 0:
-      result.add "._i" & $selectedBranch & " = {"
+      result.add "._" &  mangleRecFieldName(p.module, obj[0].sym) & "_" & $selectedBranch & " = {"
       getNullValueAux(p, t,  b, constOrNil, result, countB, isConst, info)
       result.add "}"
     elif b.kind == nkSym:
-      result.add "." & lastSon(obj[selectedBranch]).sym.loc.r & " = "
       getNullValueAux(p, t,  b, constOrNil, result, countB, isConst, info)
     result.add "}"
     
diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim
index 2bcaa5dc3..905f8999e 100644
--- a/compiler/ccgtypes.nim
+++ b/compiler/ccgtypes.nim
@@ -525,7 +525,8 @@ proc genRecordFieldsAux(m: BModule, n: PNode,
       of nkOfBranch, nkElse:
         let k = lastSon(n[i])
         if k.kind != nkSym:
-          let a = genRecordFieldsAux(m, k, rectype, check, unionPrefix & "_i" & $i & ".")
+          let structName = "_" & mangleRecFieldName(m, n[0].sym) & "_" & $i
+          let a = genRecordFieldsAux(m, k, rectype, check, unionPrefix & $structName & ".")
           if a != nil:
             if tfPacked notin rectype.flags:
               unionBody.add("struct {")
@@ -535,7 +536,7 @@ proc genRecordFieldsAux(m: BModule, n: PNode,
               else:
                 unionBody.addf("#pragma pack(push, 1)$nstruct{", [])
             unionBody.add(a)
-            unionBody.addf("} _i$1;$n", [rope($i)])
+            unionBody.addf("} $1;$n", [structName])
             if tfPacked in rectype.flags and hasAttribute notin CC[m.config.cCompiler].props:
               unionBody.addf("#pragma pack(pop)$n", [])
         else:
diff --git a/tests/destructor/tarc3.nim b/tests/destructor/tarc3.nim
index d3b9639ad..55d0ea42d 100644
--- a/tests/destructor/tarc3.nim
+++ b/tests/destructor/tarc3.nim
@@ -41,6 +41,30 @@ type
     of tkInt64, tkComma..tkString: ff: seq[float]
     else: str1*: string
   
+  Token4* = object
+    case kind*: TokenKind
+    of tkNumber: numVal*: float
+    of tkInt64, tkComma..tkString: ff: seq[float]
+    else: str1*: string
+    case kind2*: TokenKind
+    of tkNumber: 
+      numVal2*: float
+      intSeqVal3*: seq[int]
+    of tkInt64, tkComma..tkString: 
+      case kind3*: TokenKind
+      of tkNumber: numVal3*: float
+      of tkInt64, tkComma..tkString: 
+        ff3: seq[float]
+        ff5: string
+      else: 
+        str3*: string
+        mysrq: seq[int]
+    else: 
+      case kind4*: TokenKind
+      of tkNumber: numVal4*: float
+      of tkInt64, tkComma..tkString: ff4: seq[float]
+      else: str4*: string
+  
   BaseLexer* = object of RootObj
     input*: string
     pos*: Natural
@@ -58,6 +82,7 @@ type
     tok: Token
     tok2: Token2
     tok3: Token3
+    tok4: Token4
     allowTrailingComma: bool
     allowIdentifierObjectKey: bool