diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 79a3bd75f24..fed16573f03 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,9 @@ +2015-02-20 Jonathan Wakely + + PR libstdc++/64695 + * python/libstdcxx/v6/printers.py (StdTuplePrinter): Handle new + tuple layout. + 2015-02-19 Jonathan Wakely PR libstdc++/58357 diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index 12631836eeb..5a414c59a7a 100644 --- a/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -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). - # Process right node. - impl = self.head.cast (nodes[1].type) + # - 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 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