Commit 8996b63b by Doug Evans Committed by Doug Evans

re PR libstdc++/65839 (xmethods need updating once gdb decides how to fix 18285)

	PR libstdc++/65839
	* python/libstdcxx/v6/xmethods.py (get_bool_type): New function.
	Replace all lookups of "bool" with this.
	(get_std_size_type): New function.  Replace all lookups of std::size_t
	with this.
	(*Worker): New method get_result_type.
	(DequeWorkerBase.__init__): New arg val_type.  All callers updated.
	(ListWorkerBase.__init__): New arg val_type.  All callers updated.
	(UniquePtrGetWorker.__init__): New arg elem_type.  All callers updated.
	Delete setting of name, enabled.
	(UniquePtrDerefWorker.__init__): New arg elem_type.  All callers
	updated.  Delete setting of name.
	(UniquePtrMethodsMatcher): Rewrite for consistency with all other
	libstdc++ xmethod matchers.
	* testsuite/libstdc++-xmethods/array.cc: Add whatis tests.
	* testsuite/libstdc++-xmethods/associative-containers.cc: Ditto.
	* testsuite/libstdc++-xmethods/deque.cc: Ditto.
	* testsuite/libstdc++-xmethods/forwardlist.cc: Ditto.
	* testsuite/libstdc++-xmethods/list.cc: Ditto.
	* testsuite/libstdc++-xmethods/unique_ptr.cc: Ditto.
	* testsuite/libstdc++-xmethods/vector.cc: Ditto.

From-SVN: r222599
parent 1dea42c9
2015-04-29 Doug Evans <dje@google.com> 2015-04-29 Doug Evans <dje@google.com>
PR libstdc++/65839
* python/libstdcxx/v6/xmethods.py (get_bool_type): New function.
Replace all lookups of "bool" with this.
(get_std_size_type): New function. Replace all lookups of std::size_t
with this.
(*Worker): New method get_result_type.
(DequeWorkerBase.__init__): New arg val_type. All callers updated.
(ListWorkerBase.__init__): New arg val_type. All callers updated.
(UniquePtrGetWorker.__init__): New arg elem_type. All callers updated.
Delete setting of name, enabled.
(UniquePtrDerefWorker.__init__): New arg elem_type. All callers
updated. Delete setting of name.
(UniquePtrMethodsMatcher): Rewrite for consistency with all other
libstdc++ xmethod matchers.
* testsuite/libstdc++-xmethods/array.cc: Add whatis tests.
* testsuite/libstdc++-xmethods/associative-containers.cc: Ditto.
* testsuite/libstdc++-xmethods/deque.cc: Ditto.
* testsuite/libstdc++-xmethods/forwardlist.cc: Ditto.
* testsuite/libstdc++-xmethods/list.cc: Ditto.
* testsuite/libstdc++-xmethods/unique_ptr.cc: Ditto.
* testsuite/libstdc++-xmethods/vector.cc: Ditto.
2015-04-29 Doug Evans <dje@google.com>
Use consistent naming for value type attributes. Use consistent naming for value type attributes.
* python/libstdcxx/v6/xmethods.py (ArrayWorkerBase): Rename _valtype * python/libstdcxx/v6/xmethods.py (ArrayWorkerBase): Rename _valtype
to _val_type. to _val_type.
......
...@@ -21,6 +21,12 @@ import re ...@@ -21,6 +21,12 @@ import re
matcher_name_prefix = 'libstdc++::' matcher_name_prefix = 'libstdc++::'
def get_bool_type():
return gdb.lookup_type('bool')
def get_std_size_type():
return gdb.lookup_type('std::size_t')
class LibStdCxxXMethod(gdb.xmethod.XMethod): class LibStdCxxXMethod(gdb.xmethod.XMethod):
def __init__(self, name, worker_class): def __init__(self, name, worker_class):
gdb.xmethod.XMethod.__init__(self, name) gdb.xmethod.XMethod.__init__(self, name)
...@@ -44,6 +50,9 @@ class ArraySizeWorker(ArrayWorkerBase): ...@@ -44,6 +50,9 @@ class ArraySizeWorker(ArrayWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return get_std_size_type()
def __call__(self, obj): def __call__(self, obj):
return self._size return self._size
...@@ -54,6 +63,9 @@ class ArrayEmptyWorker(ArrayWorkerBase): ...@@ -54,6 +63,9 @@ class ArrayEmptyWorker(ArrayWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return get_bool_type()
def __call__(self, obj): def __call__(self, obj):
return (int(self._size) == 0) return (int(self._size) == 0)
...@@ -64,6 +76,9 @@ class ArrayFrontWorker(ArrayWorkerBase): ...@@ -64,6 +76,9 @@ class ArrayFrontWorker(ArrayWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return self._val_type
def __call__(self, obj): def __call__(self, obj):
if int(self._size) > 0: if int(self._size) > 0:
return obj['_M_elems'][0] return obj['_M_elems'][0]
...@@ -77,6 +92,9 @@ class ArrayBackWorker(ArrayWorkerBase): ...@@ -77,6 +92,9 @@ class ArrayBackWorker(ArrayWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return self._val_type
def __call__(self, obj): def __call__(self, obj):
if int(self._size) > 0: if int(self._size) > 0:
return obj['_M_elems'][self._size - 1] return obj['_M_elems'][self._size - 1]
...@@ -88,7 +106,10 @@ class ArrayAtWorker(ArrayWorkerBase): ...@@ -88,7 +106,10 @@ class ArrayAtWorker(ArrayWorkerBase):
ArrayWorkerBase.__init__(self, val_type, size) ArrayWorkerBase.__init__(self, val_type, size)
def get_arg_types(self): def get_arg_types(self):
return gdb.lookup_type('std::size_t') return get_std_size_type()
def get_result_type(self, obj, index):
return self._val_type
def __call__(self, obj, index): def __call__(self, obj, index):
if int(index) >= int(self._size): if int(index) >= int(self._size):
...@@ -101,7 +122,10 @@ class ArraySubscriptWorker(ArrayWorkerBase): ...@@ -101,7 +122,10 @@ class ArraySubscriptWorker(ArrayWorkerBase):
ArrayWorkerBase.__init__(self, val_type, size) ArrayWorkerBase.__init__(self, val_type, size)
def get_arg_types(self): def get_arg_types(self):
return gdb.lookup_type('std::size_t') return get_std_size_type()
def get_result_type(self, obj, index):
return self._val_type
def __call__(self, obj, index): def __call__(self, obj, index):
if int(self._size) > 0: if int(self._size) > 0:
...@@ -140,6 +164,7 @@ class ArrayMethodsMatcher(gdb.xmethod.XMethodMatcher): ...@@ -140,6 +164,7 @@ class ArrayMethodsMatcher(gdb.xmethod.XMethodMatcher):
class DequeWorkerBase(gdb.xmethod.XMethodWorker): class DequeWorkerBase(gdb.xmethod.XMethodWorker):
def __init__(self, val_type): def __init__(self, val_type):
self._val_type = val_type
self._bufsize = (512 / val_type.sizeof) or 1 self._bufsize = (512 / val_type.sizeof) or 1
def size(self, obj): def size(self, obj):
...@@ -158,6 +183,9 @@ class DequeEmptyWorker(DequeWorkerBase): ...@@ -158,6 +183,9 @@ class DequeEmptyWorker(DequeWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return get_bool_type()
def __call__(self, obj): def __call__(self, obj):
return (obj['_M_impl']['_M_start']['_M_cur'] == return (obj['_M_impl']['_M_start']['_M_cur'] ==
obj['_M_impl']['_M_finish']['_M_cur']) obj['_M_impl']['_M_finish']['_M_cur'])
...@@ -166,6 +194,9 @@ class DequeSizeWorker(DequeWorkerBase): ...@@ -166,6 +194,9 @@ class DequeSizeWorker(DequeWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return get_std_size_type()
def __call__(self, obj): def __call__(self, obj):
return self.size(obj) return self.size(obj)
...@@ -173,6 +204,9 @@ class DequeFrontWorker(DequeWorkerBase): ...@@ -173,6 +204,9 @@ class DequeFrontWorker(DequeWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return self._val_type
def __call__(self, obj): def __call__(self, obj):
return obj['_M_impl']['_M_start']['_M_cur'][0] return obj['_M_impl']['_M_start']['_M_cur'][0]
...@@ -180,6 +214,9 @@ class DequeBackWorker(DequeWorkerBase): ...@@ -180,6 +214,9 @@ class DequeBackWorker(DequeWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return self._val_type
def __call__(self, obj): def __call__(self, obj):
if (obj['_M_impl']['_M_finish']['_M_cur'] == if (obj['_M_impl']['_M_finish']['_M_cur'] ==
obj['_M_impl']['_M_finish']['_M_first']): obj['_M_impl']['_M_finish']['_M_first']):
...@@ -190,14 +227,20 @@ class DequeBackWorker(DequeWorkerBase): ...@@ -190,14 +227,20 @@ class DequeBackWorker(DequeWorkerBase):
class DequeSubscriptWorker(DequeWorkerBase): class DequeSubscriptWorker(DequeWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return gdb.lookup_type('std::size_t') return get_std_size_type()
def get_result_type(self, obj, subscript):
return self._val_type
def __call__(self, obj, subscript): def __call__(self, obj, subscript):
return self.index(obj, subscript) return self.index(obj, subscript)
class DequeAtWorker(DequeWorkerBase): class DequeAtWorker(DequeWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return gdb.lookup_type('std::size_t') return get_std_size_type()
def get_result_type(self, obj, index):
return self._val_type
def __call__(self, obj, index): def __call__(self, obj, index):
deque_size = int(self.size(obj)) deque_size = int(self.size(obj))
...@@ -240,10 +283,16 @@ class ForwardListWorkerBase(gdb.xmethod.XMethodMatcher): ...@@ -240,10 +283,16 @@ class ForwardListWorkerBase(gdb.xmethod.XMethodMatcher):
return None return None
class ForwardListEmptyWorker(ForwardListWorkerBase): class ForwardListEmptyWorker(ForwardListWorkerBase):
def get_result_type(self, obj):
return get_bool_type()
def __call__(self, obj): def __call__(self, obj):
return obj['_M_impl']['_M_head']['_M_next'] == 0 return obj['_M_impl']['_M_head']['_M_next'] == 0
class ForwardListFrontWorker(ForwardListWorkerBase): class ForwardListFrontWorker(ForwardListWorkerBase):
def get_result_type(self, obj):
return self._val_type
def __call__(self, obj): def __call__(self, obj):
node = obj['_M_impl']['_M_head']['_M_next'].cast(self._node_type) node = obj['_M_impl']['_M_head']['_M_next'].cast(self._node_type)
val_address = node['_M_storage']['_M_storage'].address val_address = node['_M_storage']['_M_storage'].address
...@@ -272,13 +321,17 @@ class ForwardListMethodsMatcher(gdb.xmethod.XMethodMatcher): ...@@ -272,13 +321,17 @@ class ForwardListMethodsMatcher(gdb.xmethod.XMethodMatcher):
# Xmethods for std::list # Xmethods for std::list
class ListWorkerBase(gdb.xmethod.XMethodWorker): class ListWorkerBase(gdb.xmethod.XMethodWorker):
def __init__(self, node_type): def __init__(self, val_type, node_type):
self._val_type = val_type
self._node_type = node_type self._node_type = node_type
def get_arg_types(self): def get_arg_types(self):
return None return None
class ListEmptyWorker(ListWorkerBase): class ListEmptyWorker(ListWorkerBase):
def get_result_type(self, obj):
return get_bool_type()
def __call__(self, obj): def __call__(self, obj):
base_node = obj['_M_impl']['_M_node'] base_node = obj['_M_impl']['_M_node']
if base_node['_M_next'] == base_node.address: if base_node['_M_next'] == base_node.address:
...@@ -287,6 +340,9 @@ class ListEmptyWorker(ListWorkerBase): ...@@ -287,6 +340,9 @@ class ListEmptyWorker(ListWorkerBase):
return False return False
class ListSizeWorker(ListWorkerBase): class ListSizeWorker(ListWorkerBase):
def get_result_type(self, obj):
return get_std_size_type()
def __call__(self, obj): def __call__(self, obj):
begin_node = obj['_M_impl']['_M_node']['_M_next'] begin_node = obj['_M_impl']['_M_node']['_M_next']
end_node = obj['_M_impl']['_M_node'].address end_node = obj['_M_impl']['_M_node'].address
...@@ -297,11 +353,17 @@ class ListSizeWorker(ListWorkerBase): ...@@ -297,11 +353,17 @@ class ListSizeWorker(ListWorkerBase):
return size return size
class ListFrontWorker(ListWorkerBase): class ListFrontWorker(ListWorkerBase):
def get_result_type(self, obj):
return self._val_type
def __call__(self, obj): def __call__(self, obj):
node = obj['_M_impl']['_M_node']['_M_next'].cast(self._node_type) node = obj['_M_impl']['_M_node']['_M_next'].cast(self._node_type)
return node['_M_data'] return node['_M_data']
class ListBackWorker(ListWorkerBase): class ListBackWorker(ListWorkerBase):
def get_result_type(self, obj):
return self._val_type
def __call__(self, obj): def __call__(self, obj):
prev_node = obj['_M_impl']['_M_node']['_M_prev'].cast(self._node_type) prev_node = obj['_M_impl']['_M_node']['_M_prev'].cast(self._node_type)
return prev_node['_M_data'] return prev_node['_M_data']
...@@ -324,8 +386,9 @@ class ListMethodsMatcher(gdb.xmethod.XMethodMatcher): ...@@ -324,8 +386,9 @@ class ListMethodsMatcher(gdb.xmethod.XMethodMatcher):
method = self._method_dict.get(method_name) method = self._method_dict.get(method_name)
if method is None or not method.enabled: if method is None or not method.enabled:
return None return None
val_type = class_type.template_argument(0)
node_type = gdb.lookup_type(str(class_type) + '::_Node').pointer() node_type = gdb.lookup_type(str(class_type) + '::_Node').pointer()
return method.worker_class(node_type) return method.worker_class(val_type, node_type)
# Xmethods for std::vector # Xmethods for std::vector
...@@ -357,6 +420,9 @@ class VectorEmptyWorker(VectorWorkerBase): ...@@ -357,6 +420,9 @@ class VectorEmptyWorker(VectorWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return get_bool_type()
def __call__(self, obj): def __call__(self, obj):
return int(self.size(obj)) == 0 return int(self.size(obj)) == 0
...@@ -364,6 +430,9 @@ class VectorSizeWorker(VectorWorkerBase): ...@@ -364,6 +430,9 @@ class VectorSizeWorker(VectorWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return get_std_size_type()
def __call__(self, obj): def __call__(self, obj):
return self.size(obj) return self.size(obj)
...@@ -371,6 +440,9 @@ class VectorFrontWorker(VectorWorkerBase): ...@@ -371,6 +440,9 @@ class VectorFrontWorker(VectorWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return self._val_type
def __call__(self, obj): def __call__(self, obj):
return self.get(obj, 0) return self.get(obj, 0)
...@@ -378,12 +450,18 @@ class VectorBackWorker(VectorWorkerBase): ...@@ -378,12 +450,18 @@ class VectorBackWorker(VectorWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return self._val_type
def __call__(self, obj): def __call__(self, obj):
return self.get(obj, int(self.size(obj)) - 1) return self.get(obj, int(self.size(obj)) - 1)
class VectorAtWorker(VectorWorkerBase): class VectorAtWorker(VectorWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return gdb.lookup_type('std::size_t') return get_std_size_type()
def get_result_type(self, obj, index):
return self._val_type
def __call__(self, obj, index): def __call__(self, obj, index):
size = int(self.size(obj)) size = int(self.size(obj))
...@@ -394,7 +472,10 @@ class VectorAtWorker(VectorWorkerBase): ...@@ -394,7 +472,10 @@ class VectorAtWorker(VectorWorkerBase):
class VectorSubscriptWorker(VectorWorkerBase): class VectorSubscriptWorker(VectorWorkerBase):
def get_arg_types(self): def get_arg_types(self):
return gdb.lookup_type('std::size_t') return get_std_size_type()
def get_result_type(self, obj, subscript):
return self._val_type
def __call__(self, obj, subscript): def __call__(self, obj, subscript):
return self.get(obj, int(subscript)) return self.get(obj, int(subscript))
...@@ -438,10 +519,16 @@ class AssociativeContainerWorkerBase(gdb.xmethod.XMethodWorker): ...@@ -438,10 +519,16 @@ class AssociativeContainerWorkerBase(gdb.xmethod.XMethodWorker):
return None return None
class AssociativeContainerEmptyWorker(AssociativeContainerWorkerBase): class AssociativeContainerEmptyWorker(AssociativeContainerWorkerBase):
def get_result_type(self, obj):
return get_bool_type()
def __call__(self, obj): def __call__(self, obj):
return int(self.node_count(obj)) == 0 return int(self.node_count(obj)) == 0
class AssociativeContainerSizeWorker(AssociativeContainerWorkerBase): class AssociativeContainerSizeWorker(AssociativeContainerWorkerBase):
def get_result_type(self, obj):
return get_std_size_type()
def __call__(self, obj): def __call__(self, obj):
return self.node_count(obj) return self.node_count(obj)
...@@ -469,20 +556,24 @@ class AssociativeContainerMethodsMatcher(gdb.xmethod.XMethodMatcher): ...@@ -469,20 +556,24 @@ class AssociativeContainerMethodsMatcher(gdb.xmethod.XMethodMatcher):
# Xmethods for std::unique_ptr # Xmethods for std::unique_ptr
class UniquePtrGetWorker(gdb.xmethod.XMethodWorker): class UniquePtrGetWorker(gdb.xmethod.XMethodWorker):
def __init__(self): def __init__(self, elem_type):
self.name = 'get' self._elem_type = elem_type
self.enabled = True
def get_arg_types(self): def get_arg_types(self):
return None return None
def get_result_type(self, obj):
return self._elem_type.pointer()
def __call__(self, obj): def __call__(self, obj):
return obj['_M_t']['_M_head_impl'] return obj['_M_t']['_M_head_impl']
class UniquePtrDerefWorker(UniquePtrGetWorker): class UniquePtrDerefWorker(UniquePtrGetWorker):
def __init__(self): def __init__(self, elem_type):
UniquePtrGetWorker.__init__(self) UniquePtrGetWorker.__init__(self, elem_type)
self.name = 'operator*'
def get_result_type(self, obj):
return self._elem_type
def __call__(self, obj): def __call__(self, obj):
return UniquePtrGetWorker.__call__(self, obj).dereference() return UniquePtrGetWorker.__call__(self, obj).dereference()
...@@ -491,17 +582,19 @@ class UniquePtrMethodsMatcher(gdb.xmethod.XMethodMatcher): ...@@ -491,17 +582,19 @@ class UniquePtrMethodsMatcher(gdb.xmethod.XMethodMatcher):
def __init__(self): def __init__(self):
gdb.xmethod.XMethodMatcher.__init__(self, gdb.xmethod.XMethodMatcher.__init__(self,
matcher_name_prefix + 'unique_ptr') matcher_name_prefix + 'unique_ptr')
self._get_worker = UniquePtrGetWorker() self._method_dict = {
self._deref_worker = UniquePtrDerefWorker() 'get': LibStdCxxXMethod('get', UniquePtrGetWorker),
self.methods = [self._get_worker, self._deref_worker] 'operator*': LibStdCxxXMethod('operator*', UniquePtrDerefWorker),
}
self.methods = [self._method_dict[m] for m in self._method_dict]
def match(self, class_type, method_name): def match(self, class_type, method_name):
if not re.match('^std::unique_ptr<.*>$', class_type.tag): if not re.match('^std::unique_ptr<.*>$', class_type.tag):
return None return None
if method_name == 'operator*' and self._deref_worker.enabled: method = self._method_dict.get(method_name)
return self._deref_worker if method is None or not method.enabled:
elif method_name == 'get' and self._get_worker.enabled: return None
return self._get_worker return method.worker_class(class_type.template_argument(0))
def register_libstdcxx_xmethods(locus): def register_libstdcxx_xmethods(locus):
gdb.xmethod.register_xmethod_matcher(locus, ArrayMethodsMatcher()) gdb.xmethod.register_xmethod_matcher(locus, ArrayMethodsMatcher())
......
...@@ -40,6 +40,13 @@ main () ...@@ -40,6 +40,13 @@ main ()
// { dg-final { note-test a\[4\] 104 } } // { dg-final { note-test a\[4\] 104 } }
// { dg-final { note-test a\[9\] 109 } } // { dg-final { note-test a\[9\] 109 } }
// { dg-final { whatis-test a.size() std::size_t } }
// { dg-final { whatis-test a.empty() bool } }
// { dg-final { whatis-test a.front() int } }
// { dg-final { whatis-test a.back() int } }
// { dg-final { whatis-test a.at(5) int } }
// { dg-final { whatis-test a\[0\] int } }
return 0; // Mark SPOT return 0; // Mark SPOT
} }
......
...@@ -73,6 +73,9 @@ main () ...@@ -73,6 +73,9 @@ main ()
// { dg-final { note-test umm.empty() false } } // { dg-final { note-test umm.empty() false } }
// { dg-final { note-test umm1.empty() true } } // { dg-final { note-test umm1.empty() true } }
// { dg-final { whatis-test s.size() std::size_t } }
// { dg-final { whatis-test s.empty() bool } }
return 0; // Mark SPOT return 0; // Mark SPOT
} }
......
...@@ -61,6 +61,12 @@ main () ...@@ -61,6 +61,12 @@ main ()
// { dg-final { note-test q3\[q3_size/2\]==(300+q3_size/2) true } } // { dg-final { note-test q3\[q3_size/2\]==(300+q3_size/2) true } }
// { dg-final { note-test q3\[q3_size-1]==(300+q3_size-1) true } } // { dg-final { note-test q3\[q3_size-1]==(300+q3_size-1) true } }
// { dg-final { whatis-test q0.empty() bool } }
// { dg-final { whatis-test q0.size() std::size_t } }
// { dg-final { whatis-test q1.front() int } }
// { dg-final { whatis-test q1.back() int } }
// { dg-final { whatis-test q3\[0\] int } }
return 0; // Mark SPOT return 0; // Mark SPOT
} }
......
...@@ -34,6 +34,9 @@ main () ...@@ -34,6 +34,9 @@ main ()
// { dg-final { note-test l1.empty() false } } // { dg-final { note-test l1.empty() false } }
// { dg-final { note-test l1.front() 11011 } } // { dg-final { note-test l1.front() 11011 } }
// { dg-final { whatis-test l1.empty() bool } }
// { dg-final { whatis-test l1.front() int } }
return 0; // Mark SPOT return 0; // Mark SPOT
} }
......
...@@ -38,6 +38,10 @@ main () ...@@ -38,6 +38,10 @@ main ()
// { dg-final { note-test l1.front() 123 } } // { dg-final { note-test l1.front() 123 } }
// { dg-final { note-test l1.back() 789 } } // { dg-final { note-test l1.back() 789 } }
// { dg-final { whatis-test l1.empty() bool } }
// { dg-final { whatis-test l1.size() std::size_t } }
// { dg-final { whatis-test l1.front() int } }
// { dg-final { whatis-test l1.back() int } }
return 0; // Mark SPOT return 0; // Mark SPOT
} }
......
...@@ -30,6 +30,9 @@ main () ...@@ -30,6 +30,9 @@ main ()
// { dg-final { note-test *p 10 } } // { dg-final { note-test *p 10 } }
// { dg-final { regexp-test p.get() 0x.* } } // { dg-final { regexp-test p.get() 0x.* } }
// { dg-final { whatis-test *p int } }
// { dg-final { whatis-test p.get() "int \*" } }
return 0; // Mark SPOT return 0; // Mark SPOT
} }
......
...@@ -83,6 +83,19 @@ main () ...@@ -83,6 +83,19 @@ main ()
// { dg-final { note-test bv3.at(63) true } } // { dg-final { note-test bv3.at(63) true } }
// { dg-final { note-test bv3.at(64) false } } // { dg-final { note-test bv3.at(64) false } }
// { dg-final { whatis-test v0.empty() bool } }
// { dg-final { whatis-test v0.size() std::size_t } }
// { dg-final { whatis-test v1.front() int } }
// { dg-final { whatis-test v1.back() int } }
// { dg-final { whatis-test v1\[0\] int } }
// { dg-final { whatis-test v1.at(1) int } }
// { dg-final { whatis-test bv0.empty() bool } }
// { dg-final { whatis-test bv0.size() std::size_t } }
// { dg-final { whatis-test bv1.front() bool } }
// { dg-final { whatis-test bv1.back() bool } }
// { dg-final { whatis-test bv1\[0\] bool } }
// { dg-final { whatis-test bv1.at(1) bool } }
return 0; // Mark SPOT return 0; // Mark SPOT
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment