From ab92c14bbedbc1acfc63d189989b1ee427411b6a Mon Sep 17 00:00:00 2001
From: hjk <hjk121@nokiamail.com>
Date: Thu, 24 Oct 2013 17:38:57 +0200
Subject: [PATCH] Debugger: Fix std::complex dumper for LLDB

Change-Id: I5ffb0f60039bb05f8467e925e71cf710a0712791
Reviewed-by: hjk <hjk121@nokiamail.com>
---
 share/qtcreator/debugger/gdbbridge.py | 15 +++++++++++++--
 share/qtcreator/debugger/stdtypes.py  |  5 ++---
 tests/auto/debugger/tst_dumpers.cpp   |  6 ++++--
 3 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py
index 8955c09612a..2d0df4275a4 100644
--- a/share/qtcreator/debugger/gdbbridge.py
+++ b/share/qtcreator/debugger/gdbbridge.py
@@ -1215,7 +1215,14 @@ class Dumper(DumperBase):
         return toInteger(value.address)
 
     def createPointerValue(self, address, pointeeType):
-        return gdb.Value(address).cast(pointeeType.pointer())
+        # This might not always work:
+        # a Python 3 based GDB due to the bug addressed in
+        # https://sourceware.org/ml/gdb-patches/2013-09/msg00571.html
+        try:
+            return gdb.Value(address).cast(pointeeType.pointer())
+        except:
+            # Try _some_ fallback (good enough for the std::complex dumper)
+            return gdb.parse_and_eval("(%s*)%s" % (pointeeType, address))
 
     def intSize(self):
         return 4
@@ -1227,7 +1234,11 @@ class Dumper(DumperBase):
         return self.lookupType('void*').sizeof == 4
 
     def createValue(self, address, referencedType):
-        return gdb.Value(address).cast(referencedType.pointer()).dereference()
+        try:
+            return gdb.Value(address).cast(referencedType.pointer()).dereference()
+        except:
+            # Try _some_ fallback (good enough for the std::complex dumper)
+            return gdb.parse_and_eval("{%s}%s" % (referencedType, address))
 
     def readRawMemory(self, addr, size):
         mem = gdb.selected_inferior().read_memory(addr, size)
diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py
index 428373ad320..4ca65badb0f 100644
--- a/share/qtcreator/debugger/stdtypes.py
+++ b/share/qtcreator/debugger/stdtypes.py
@@ -79,9 +79,8 @@ def qdump__std____1__array(d, value):
 
 def qdump__std__complex(d, value):
     innerType = d.templateArgument(value.type, 0)
-    base = value.address.cast(innerType.pointer())
-    real = base.dereference()
-    imag = (base + 1).dereference()
+    real = value.cast(innerType)
+    imag = d.createValue(d.addressOf(value) + innerType.sizeof, innerType)
     d.putValue("(%f, %f)" % (real, imag));
     d.putNumChild(2)
     if d.isExpanded():
diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp
index fba59c77c93..7b08bb3514c 100644
--- a/tests/auto/debugger/tst_dumpers.cpp
+++ b/tests/auto/debugger/tst_dumpers.cpp
@@ -2469,8 +2469,10 @@ void tst_Dumpers::dumper_data()
 
     QTest::newRow("StdComplex")
             << Data("#include <complex>\n",
-                    "std::complex<double> c(1, 2);\n")
-               % Check("c", "(1.000000, 2.000000)", "std::complex<double>");
+                    "std::complex<double> c(1, 2);\n"
+                    "unused(&c);\n")
+               % Check("c", "(1.000000, 2.000000)", "std::complex<double>")
+               % CheckType("c.real", "double");
 
     QTest::newRow("CComplexGdb")
             << Data("#include <complex.h>\n",
-- 
GitLab