re PR libstdc++/64695 (FAIL: libstdc++-prettyprinters/cxx11.cc)
authorJonathan Wakely <jwakely@redhat.com>
Fri, 20 Feb 2015 14:40:00 +0000 (14:40 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 20 Feb 2015 14:40:00 +0000 (14:40 +0000)
PR libstdc++/64695
* python/libstdcxx/v6/printers.py (StdTuplePrinter): Handle new
tuple layout.

From-SVN: r220871

libstdc++-v3/ChangeLog
libstdc++-v3/python/libstdcxx/v6/printers.py

index 79a3bd75f244b2bbdfa6a099212fd1efe0f23560..fed16573f0321cb01e7bc4d02e957f77d23c30df 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-20  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/64695
+       * python/libstdcxx/v6/printers.py (StdTuplePrinter): Handle new
+       tuple layout.
+
 2015-02-19  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/58357
index 12631836eeb1634e9b1ba8d93ffc1b02f3a03dc7..5a414c59a7aa18be59f11607c07e9f6d8802543f 100644 (file)
@@ -327,22 +327,35 @@ class StdTuplePrinter:
             return self
 
         def __next__ (self):
-            nodes = self.head.type.fields ()
             # Check for further recursions in the inheritance tree.
+            # For a GCC 5+ tuple self.head is None after visiting all nodes:
+            if not self.head:
+                raise StopIteration
+            nodes = self.head.type.fields ()
+            # For a GCC 4.x tuple there is a final node with no fields:
             if len (nodes) == 0:
                 raise StopIteration
             # Check that this iteration has an expected structure.
-            if len (nodes) != 2:
+            if len (nodes) > 2:
                 raise ValueError("Cannot parse more than 2 nodes in a tuple tree.")
 
-            # - Left node is the next recursion parent.
-            # - Right node is the actual class contained in the tuple.
+            if len (nodes) == 1:
+                # This is the last node of a GCC 5+ std::tuple.
+                impl = self.head.cast (nodes[0].type)
+                self.head = None
+            else:
+                # Either a node before the last node, or the last node of
+                # a GCC 4.x tuple (which has an empty parent).
+
+                # - Left node is the next recursion parent.
+                # - Right node is the actual class contained in the tuple.
 
-            # Process right node.
-            impl = self.head.cast (nodes[1].type)
+                # Process right node.
+                impl = self.head.cast (nodes[1].type)
+
+                # Process left node and set it as head.
+                self.head  = self.head.cast (nodes[0].type)
 
-            # Process left node and set it as head.
-            self.head  = self.head.cast (nodes[0].type)
             self.count = self.count + 1
 
             # Finally, check the implementation.  If it is