From e3e6797fe5287d1f4d62611fe96df5f0439df22e Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Mon, 15 Feb 2010 16:59:00 +0100
Subject: [PATCH] debugger: fix display and editing of nested anonymous
 structures

---
 share/qtcreator/gdbmacros/dumper.py     | 39 ++++++++++++++++++++-----
 tests/manual/gdbdebugger/simple/app.cpp | 20 +++++++++++++
 2 files changed, 52 insertions(+), 7 deletions(-)

diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index 9082a752f05..a70d5a002f8 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -178,6 +178,17 @@ def listOfBreakpoints(d):
         bp = Breakpoint()
 
 
+# Creates a list of field names of an anon union or struct
+def listOfFields(type):
+    fields = []
+    for field in type.fields():
+        if len(field.name) > 0:
+            fields += field.name
+        else:
+            fields += listOfFields(field.type)
+    return fields
+
+
 def listOfLocals(varList):
     try:
         frame = gdb.selected_frame()
@@ -1148,22 +1159,36 @@ class Dumper:
                         self.putField("iname", child.iname)
                         self.safePutItemHelper(child)
                         self.endHash()
-                    elif field.name == "":
+                    elif len(field.name) == 0:
                         # Anonymous union. We need a dummy name to distinguish
                         # multiple anonymous unions in the struct.
-                        iname = "%s.#%d" % (item.iname, anonNumber)
                         anonNumber += 1
+                        iname = "%s.#%d" % (item.iname, anonNumber)
+
+                        #innerType = item.value.type.target()
+                        #self.putType(innerType)
+                        #self.childTypes.append(
+                        #    stripClassTag(str(innerType)))
+                        #self.putItemHelper(
+                        #    Item(item.value.dereference(), item.iname, None, None))
+                        #self.childTypes.pop()
+                        #isHandled = True
+
                         self.beginHash()
                         self.putField("iname", iname)
-                        self.putField("name", "<n/a>")
+                        self.putField("name", "#%d" % anonNumber)
                         self.putField("value", " ")
                         self.putField("type", "<anonymous union>")
                         if self.isExpandedIName(iname):
                             self.beginChildren()
-                            for f in field.type.fields():
-                                child = Item(item.value[f.name],
-                                    item.iname, f.name, f.name)
-                                self.safePutItem(child)
+                            fields = listOfFields(field.type)
+                            for field in fields:
+                                value = item.value[field]
+                                child = Item(value, item.iname, field, field)
+                                self.beginHash()
+                                self.put('addr="%s",' % cleanAddress(value.address))
+                                self.safePutItemHelper(child)
+                                self.endHash();
                             self.endChildren()
                         self.endHash()
                     else:
diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp
index 204990ca3a5..ad38df67904 100644
--- a/tests/manual/gdbdebugger/simple/app.cpp
+++ b/tests/manual/gdbdebugger/simple/app.cpp
@@ -212,6 +212,25 @@ void testArray()
     }
 }
 
+struct TestAnonymous
+{
+    union {
+        struct { int i; int b; };
+        struct { float f; };
+        double d;
+    };
+};
+
+// union { struct { int a; }; struct { int b; }; };
+
+void testAnonymous()
+{
+    TestAnonymous a;
+    a.i = 1;
+    a.i = 2;
+    a.i = 3;
+}
+
 void testQByteArray()
 {
     QByteArray ba = "Hello";
@@ -1415,6 +1434,7 @@ int testReference()
 
 int main(int argc, char *argv[])
 {
+    testAnonymous();
     testReference();
     //testEndlessRecursion();
     testQStack();
-- 
GitLab