diff --git a/share/qtcreator/dumper/dumper.py b/share/qtcreator/dumper/dumper.py index 373fd8e4ec83c3cd1efa804ce902a863ae590eb5..6521aa1f6dd5fc729f571de9d01055047a8858ad 100644 --- a/share/qtcreator/dumper/dumper.py +++ b/share/qtcreator/dumper/dumper.py @@ -1333,16 +1333,19 @@ class Dumper: value = item.value realtype = value.type - type = realtype; + type = value.type.unqualified() format = self.itemFormat(item) - if type.code == gdb.TYPE_CODE_REF: + typedefStrippedType = stripTypedefs(type) + + if typedefStrippedType.code == gdb.TYPE_CODE_REF: try: # This throws "RuntimeError: Attempt to dereference a # generic pointer." with MinGW's gcc 4.5 when it "identifies" # a "QWidget &" as "void &". type = type.target() - value = value.cast(type) + typedefStrippedType = typedefStrippedType.target() + value = value.cast(typedefStrippedType) item.value = value except RuntimeError: value = item.value @@ -1372,8 +1375,6 @@ class Dumper: except: pass - typedefStrippedType = stripTypedefs(type) - if typedefStrippedType.code == gdb.TYPE_CODE_INT: if self.alienSource and str(type) == "unsigned long long": strlen = value % (1L<<32) @@ -1404,7 +1405,7 @@ class Dumper: self.putNumChild(0) return - if value.type.code == gdb.TYPE_CODE_ARRAY: + if typedefStrippedType.code == gdb.TYPE_CODE_ARRAY: targettype = realtype.target() self.putAddress(value.address) self.putType(realtype) @@ -1603,9 +1604,9 @@ class Dumper: #warn("INAME: %s " % item.iname) #warn("INAMES: %s " % self.expandedINames) #warn("EXPANDED: %s " % (item.iname in self.expandedINames)) - fields = extractFields(type) + fields = extractFields(typedefStrippedType) - self.putType(type) + self.putType(realtype) try: self.putAddress(item.value.address) except: diff --git a/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp b/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp index b31f1627f5bbf9fbedabaca6cacf12989ccf20b0..e013b8512b4cb38bd5f95c8d9ed9669431e51973 100644 --- a/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp +++ b/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp @@ -2418,14 +2418,6 @@ QString fooxx() return "bababa"; } -int testReference() -{ - QString a = "hello"; - const QString &b = fooxx(); - const QString c = "world"; - return a.size() + b.size() + c.size(); -} - namespace basic { @@ -2645,6 +2637,30 @@ namespace basic { dummyStatement(&i, &d, &s); } + void testReference1() + { + int a = 43; + const int &b = a; + typedef int &Ref; + const int c = 44; + const Ref d = a; + // <=== Break here. + dummyStatement(&a, &b); + dummyStatement(&c, &d); + } + + void testReference2() + { + QString a = "hello"; + const QString &b = fooxx(); + typedef QString &Ref; + const QString c = "world"; + const Ref d = a; + // <=== Break here. + dummyStatement(&a, &b); + dummyStatement(&c, &d); + } + void testBasic() { testChar(); @@ -2658,6 +2674,8 @@ namespace basic { testStringWithNewline(); testMemoryView(); testColoredMemoryView(); + testReference1(); + testReference2(); } } // namespace basic @@ -3290,11 +3308,14 @@ namespace bug5799 { s2.m1 = 5; S4 s4; s4.m1 = 5; - S1 arr[10]; + S1 a1[10]; + typedef S1 Array[10]; + Array a2; // <=== Break here. // Expand s2 and s4. // Check there is no <unavailable synchronous data> - dummyStatement(&s2, &s4, &arr); + dummyStatement(&s2, &s4); + dummyStatement(&a1, &a2); } } // namespace bug5799 @@ -3406,7 +3427,6 @@ int main(int argc, char *argv[]) testPeekAndPoke3(); testFunctionPointer(); testAnonymous(); - testReference(); //testEndlessLoop(); //testEndlessRecursion(); testQStack();