diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py
index 8955c09612a4853ab942ac0c673e60232aebd252..2d0df4275a4681a011c60d27318f1bac19eaf206 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 428373ad3204a3d216314090717d1e26fb8e95b3..4ca65badb0f234f321b631c7d4a9aead5bfcdd61 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 fba59c77c93c3236e7000ec60bee804fd3de9f5e..7b08bb3514cc4dbdb709f727eae6e2afcffd6077 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",