diff options
author | Paul Pluzhnikov <ppluzhnikov@google.com> | 2013-09-21 19:04:13 -0700 |
---|---|---|
committer | Paul Pluzhnikov <ppluzhnikov@gcc.gnu.org> | 2013-09-21 19:04:13 -0700 |
commit | 9779c871afc648329500747748c70b59b47abdf7 (patch) | |
tree | 1807bb351c1ef7b319a9d9f950ffb248e213222c /libstdc++-v3/include | |
parent | 0e2148ad570e2c48e69e1d861a02bb9445719410 (diff) | |
download | gcc-9779c871afc648329500747748c70b59b47abdf7.zip gcc-9779c871afc648329500747748c70b59b47abdf7.tar.gz gcc-9779c871afc648329500747748c70b59b47abdf7.tar.bz2 |
Print additional info when various out-of-range conditions are detected.
2013-09-21 Paul Pluzhnikov <ppluzhnikov@google.com>
* include/bits/functexcept.h (__throw_out_of_range_fmt): New.
* src/c++11/functexcept.cc (__throw_out_of_range_fmt): New.
* src/c++11/snprintf_lite.cc: New.
* src/c++11/Makefile.am: Add snprintf_lite.cc.
* src/c++11/Makefile.in: Regenerate.
* config/abi/pre/gnu.ver: Add _ZSt24__throw_out_of_range_fmtPKcz.
* include/std/array (at): Use __throw_out_of_range_fmt.
* include/debug/array (at): Likewise.
* include/profile/array (at): Likewise.
* include/std/bitset (_M_check_initial_position, _M_check): New.
(bitset::bitset): Use _M_check_initial_position.
(set, reset, flip, test): Use _M_check.
* include/ext/vstring.h (_M_check, at): Use __throw_out_of_range_fmt.
* include/bits/stl_vector.h (_M_range_check): Likewise.
* include/bits/stl_bvector.h (_M_range_check): Likewise.
* include/bits/stl_deque.h (_M_range_check): Likewise.
* include/bits/basic_string.h (_M_check, at): Likewise.
* testsuite/23_containers/vector/requirements/dr438/assign_neg.cc: Adjust.
* testsuite/23_containers/vector/requirements/dr438/insert_neg.cc: Likewise.
* testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc:
Likewise.
* testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc:
Likewise.
* testsuite/23_containers/deque/requirements/dr438/assign_neg.cc: Likewise.
* testsuite/23_containers/deque/requirements/dr438/insert_neg.cc: Likewise.
* testsuite/23_containers/deque/requirements/dr438/constructor_1_neg.cc:
Likewise.
* testsuite/23_containers/deque/requirements/dr438/constructor_2_neg.cc:
Likewise.
* testsuite/23_containers/array/tuple_interface/tuple_element_neg.cc: Likewise.
* testsuite/23_containers/array/tuple_interface/tuple_element_debug_neg.cc:
Likewise.
* testsuite/23_containers/array/tuple_interface/get_neg.cc: Likewise.
* testsuite/23_containers/array/tuple_interface/get_debug_neg.cc: Likewise.
* testsuite/util/exception/safety.h (generate): Use __throw_out_of_range_fmt.
From-SVN: r202818
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.h | 14 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/functexcept.h | 4 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_bvector.h | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_deque.h | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_vector.h | 5 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/array | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/vstring.h | 14 | ||||
-rw-r--r-- | libstdc++-v3/include/profile/array | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/std/array | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/std/bitset | 44 |
10 files changed, 85 insertions, 32 deletions
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index 4890428..566186f 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -321,7 +321,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_check(size_type __pos, const char* __s) const { if (__pos > this->size()) - __throw_out_of_range(__N(__s)); + __throw_out_of_range_fmt(__N("%s: __pos (which is %zu) > " + "this->size() (which is %zu)"), + __s, __pos, this->size()); return __pos; } @@ -869,7 +871,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION at(size_type __n) const { if (__n >= this->size()) - __throw_out_of_range(__N("basic_string::at")); + __throw_out_of_range_fmt(__N("basic_string::at: __n " + "(which is %zu) >= this->size() " + "(which is %zu)"), + __n, this->size()); return _M_data()[__n]; } @@ -888,7 +893,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION at(size_type __n) { if (__n >= size()) - __throw_out_of_range(__N("basic_string::at")); + __throw_out_of_range_fmt(__N("basic_string::at: __n " + "(which is %zu) >= this->size() " + "(which is %zu)"), + __n, this->size()); _M_leak(); return _M_data()[__n]; } diff --git a/libstdc++-v3/include/bits/functexcept.h b/libstdc++-v3/include/bits/functexcept.h index 1614058..03e2040 100644 --- a/libstdc++-v3/include/bits/functexcept.h +++ b/libstdc++-v3/include/bits/functexcept.h @@ -75,6 +75,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __throw_out_of_range(const char*) __attribute__((__noreturn__)); void + __throw_out_of_range_fmt(const char*, ...) __attribute__((__noreturn__)) + __attribute__((__format__(__printf__, 1, 2))); + + void __throw_runtime_error(const char*) __attribute__((__noreturn__)); void diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h index 468fad0..8e4b023 100644 --- a/libstdc++-v3/include/bits/stl_bvector.h +++ b/libstdc++-v3/include/bits/stl_bvector.h @@ -785,7 +785,10 @@ template<typename _Alloc> _M_range_check(size_type __n) const { if (__n >= this->size()) - __throw_out_of_range(__N("vector<bool>::_M_range_check")); + __throw_out_of_range_fmt(__N("vector<bool>::_M_range_check: __n " + "(which is %zu) >= this->size() " + "(which is %zu)"), + __n, this->size()); } public: diff --git a/libstdc++-v3/include/bits/stl_deque.h b/libstdc++-v3/include/bits/stl_deque.h index 98556f5..ca9e417 100644 --- a/libstdc++-v3/include/bits/stl_deque.h +++ b/libstdc++-v3/include/bits/stl_deque.h @@ -1264,7 +1264,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _M_range_check(size_type __n) const { if (__n >= this->size()) - __throw_out_of_range(__N("deque::_M_range_check")); + __throw_out_of_range_fmt(__N("deque::_M_range_check: __n " + "(which is %zu)>= this->size() " + "(which is %zu)"), + __n, this->size()); } public: diff --git a/libstdc++-v3/include/bits/stl_vector.h b/libstdc++-v3/include/bits/stl_vector.h index 03850b5..376f39a 100644 --- a/libstdc++-v3/include/bits/stl_vector.h +++ b/libstdc++-v3/include/bits/stl_vector.h @@ -785,7 +785,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _M_range_check(size_type __n) const { if (__n >= this->size()) - __throw_out_of_range(__N("vector::_M_range_check")); + __throw_out_of_range_fmt(__N("vector::_M_range_check: __n " + "(which is %zu) >= this->size() " + "(which is %zu)"), + __n, this->size()); } public: diff --git a/libstdc++-v3/include/debug/array b/libstdc++-v3/include/debug/array index d3eea85..6ee2384 100644 --- a/libstdc++-v3/include/debug/array +++ b/libstdc++-v3/include/debug/array @@ -165,7 +165,10 @@ namespace __debug at(size_type __n) { if (__n >= _Nm) - std::__throw_out_of_range(__N("array::at")); + std::__throw_out_of_range_fmt(__N("array::at: __n " + "(which is %zu) >= _Nm " + "(which is %zu)"), + __n, _Nm); return _AT_Type::_S_ref(_M_elems, __n); } @@ -175,7 +178,9 @@ namespace __debug // Result of conditional expression must be an lvalue so use // boolean ? lvalue : (throw-expr, lvalue) return __n < _Nm ? _AT_Type::_S_ref(_M_elems, __n) - : (std::__throw_out_of_range(__N("array::at")), + : (std::__throw_out_of_range_fmt(__N("array::at: __n (which is %zu) " + ">= _Nm (which is %zu)"), + __n, _Nm), _AT_Type::_S_ref(_M_elems, 0)); } diff --git a/libstdc++-v3/include/ext/vstring.h b/libstdc++-v3/include/ext/vstring.h index bd93c80..8eb8597 100644 --- a/libstdc++-v3/include/ext/vstring.h +++ b/libstdc++-v3/include/ext/vstring.h @@ -85,7 +85,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_check(size_type __pos, const char* __s) const { if (__pos > this->size()) - std::__throw_out_of_range(__N(__s)); + std::__throw_out_of_range_fmt(__N("%s: __pos (which is %zu) > " + "this->size() (which is %zu)"), + __s, __pos, this->size()); return __pos; } @@ -575,7 +577,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION at(size_type __n) const { if (__n >= this->size()) - std::__throw_out_of_range(__N("__versa_string::at")); + std::__throw_out_of_range_fmt(__N("__versa_string::at: __n " + "(which is %zu) >= this->size() " + "(which is %zu)"), + __n, this->size()); return this->_M_data()[__n]; } @@ -594,7 +599,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION at(size_type __n) { if (__n >= this->size()) - std::__throw_out_of_range(__N("__versa_string::at")); + std::__throw_out_of_range_fmt(__N("__versa_string::at: __n " + "(which is %zu) >= this->size() " + "(which is %zu)"), + __n, this->size()); this->_M_leak(); return this->_M_data()[__n]; } diff --git a/libstdc++-v3/include/profile/array b/libstdc++-v3/include/profile/array index 33bdc95..138ad31 100644 --- a/libstdc++-v3/include/profile/array +++ b/libstdc++-v3/include/profile/array @@ -138,7 +138,10 @@ namespace __profile at(size_type __n) { if (__n >= _Nm) - std::__throw_out_of_range(__N("array::at")); + std::__throw_out_of_range_fmt(__N("array::at: __n " + "(which is %zu) >= _Nm " + "(which is %zu)"), + __n, _Nm); return _AT_Type::_S_ref(_M_elems, __n); } @@ -148,7 +151,9 @@ namespace __profile // Result of conditional expression must be an lvalue so use // boolean ? lvalue : (throw-expr, lvalue) return __n < _Nm ? _AT_Type::_S_ref(_M_elems, __n) - : (std::__throw_out_of_range(__N("array::at")), + : (std::__throw_out_of_range_fmt(__N("array::at: __n (which is %zu) " + ">= _Nm (which is %zu)"), + __n, _Nm), _AT_Type::_S_ref(_M_elems, 0)); } diff --git a/libstdc++-v3/include/std/array b/libstdc++-v3/include/std/array index 86e8aee..673d0e4 100644 --- a/libstdc++-v3/include/std/array +++ b/libstdc++-v3/include/std/array @@ -180,7 +180,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER at(size_type __n) { if (__n >= _Nm) - std::__throw_out_of_range(__N("array::at")); + std::__throw_out_of_range_fmt(__N("array::at: __n (which is %zu) " + ">= _Nm (which is %zu)"), + __n, _Nm); return _AT_Type::_S_ref(_M_elems, __n); } @@ -190,7 +192,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER // Result of conditional expression must be an lvalue so use // boolean ? lvalue : (throw-expr, lvalue) return __n < _Nm ? _AT_Type::_S_ref(_M_elems, __n) - : (std::__throw_out_of_range(__N("array::at")), + : (std::__throw_out_of_range_fmt(__N("array::at: __n (which is %zu) " + ">= _Nm (which is %zu)"), + __n, _Nm), _AT_Type::_S_ref(_M_elems, 0)); } diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset index 1da6baf..708a434 100644 --- a/libstdc++-v3/include/std/bitset +++ b/libstdc++-v3/include/std/bitset @@ -752,6 +752,26 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER typedef _Base_bitset<_GLIBCXX_BITSET_WORDS(_Nb)> _Base; typedef unsigned long _WordT; + template<class _CharT, class _Traits, class _Alloc> + void + _M_check_initial_position(const std::basic_string<_CharT, _Traits, _Alloc>& __s, + size_t __position) const + { + if (__position > __s.size()) + __throw_out_of_range_fmt(__N("bitset::bitset: __position " + "(which is %zu) > __s.size() " + "(which is %zu)"), + __position, __s.size()); + } + + void _M_check(size_t __position, const char *__s) const + { + if (__position >= _Nb) + __throw_out_of_range_fmt(__N("%s: __position (which is %zu) " + ">= _Nb (which is %zu)"), + __s, __position, _Nb); + } + void _M_do_sanitize() _GLIBCXX_NOEXCEPT { @@ -867,9 +887,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER size_t __position = 0) : _Base() { - if (__position > __s.size()) - __throw_out_of_range(__N("bitset::bitset initial position " - "not valid")); + _M_check_initial_position(__s, __position); _M_copy_from_string(__s, __position, std::basic_string<_CharT, _Traits, _Alloc>::npos, _CharT('0'), _CharT('1')); @@ -890,9 +908,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER size_t __position, size_t __n) : _Base() { - if (__position > __s.size()) - __throw_out_of_range(__N("bitset::bitset initial position " - "not valid")); + _M_check_initial_position(__s, __position); _M_copy_from_string(__s, __position, __n, _CharT('0'), _CharT('1')); } @@ -904,9 +920,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER _CharT __zero, _CharT __one = _CharT('1')) : _Base() { - if (__position > __s.size()) - __throw_out_of_range(__N("bitset::bitset initial position " - "not valid")); + _M_check_initial_position(__s, __position); _M_copy_from_string(__s, __position, __n, __zero, __one); } @@ -1067,8 +1081,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER bitset<_Nb>& set(size_t __position, bool __val = true) { - if (__position >= _Nb) - __throw_out_of_range(__N("bitset::set")); + this->_M_check(__position, __N("bitset::set")); return _Unchecked_set(__position, __val); } @@ -1092,8 +1105,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER bitset<_Nb>& reset(size_t __position) { - if (__position >= _Nb) - __throw_out_of_range(__N("bitset::reset")); + this->_M_check(__position, __N("bitset::reset")); return _Unchecked_reset(__position); } @@ -1116,8 +1128,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER bitset<_Nb>& flip(size_t __position) { - if (__position >= _Nb) - __throw_out_of_range(__N("bitset::flip")); + this->_M_check(__position, __N("bitset::flip")); return _Unchecked_flip(__position); } @@ -1302,8 +1313,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER bool test(size_t __position) const { - if (__position >= _Nb) - __throw_out_of_range(__N("bitset::test")); + this->_M_check(__position, __N("bitset::test")); return _Unchecked_test(__position); } |