This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[patch] Make vector::at() assertion message more useful
- From: Paul Pluzhnikov <ppluzhnikov at google dot com>
- To: patches at gcc dot gnu dot org, libstdc++ at gcc dot gnu dot org
- Cc: ppluzhnikov at google dot com, habets at google dot com
- Date: Fri, 16 Aug 2013 17:12:23 -0700
- Subject: [patch] Make vector::at() assertion message more useful
Greetings,
When a vector::at() throws uncaught exception, currently the user sees:
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check
Often the core is not dumped, or not easily accessible, making
understanding of what went wrong unnecessarily difficult.
It would be much more useful to print e.g.:
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: 3 >= 2
Attached patch does this for vector. If this is ok, I'll send a similar
patch for string.
Thanks,
Google ref: b/10323610
--
Paul Pluzhnikov
2013-08-16 Paul Pluzhnikov <ppluzhnikov@google.com>
* include/bits/stl_vector.h (_M_range_check): Print additional
assertion details.
* 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.
Index: libstdc++-v3/include/bits/stl_vector.h
===================================================================
--- libstdc++-v3/include/bits/stl_vector.h (revision 201800)
+++ libstdc++-v3/include/bits/stl_vector.h (working copy)
@@ -791,7 +791,13 @@
_M_range_check(size_type __n) const
{
if (__n >= this->size())
- __throw_out_of_range(__N("vector::_M_range_check"));
+ {
+ char __s[256];
+ __builtin_snprintf(__s, sizeof(__s),
+ __N("vector::_M_range_check: %zu >= %zu"),
+ __n, this->size());
+ __throw_out_of_range(__s);
+ }
}
public:
Index: libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc
===================================================================
--- libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc (revision 201800)
+++ libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/assign_neg.cc (working copy)
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1308 }
+// { dg-error "no matching" "" { target *-*-* } 1314 }
#include <vector>
Index: libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc
===================================================================
--- libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc (revision 201800)
+++ libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/insert_neg.cc (working copy)
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1349 }
+// { dg-error "no matching" "" { target *-*-* } 1355 }
#include <vector>
Index: libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc
===================================================================
--- libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc (revision 201800)
+++ libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_1_neg.cc (working copy)
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1234 }
+// { dg-error "no matching" "" { target *-*-* } 1240 }
#include <vector>
Index: libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc
===================================================================
--- libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc (revision 201800)
+++ libstdc++-v3/testsuite/23_containers/vector/requirements/dr438/constructor_2_neg.cc (working copy)
@@ -18,7 +18,7 @@
// <http://www.gnu.org/licenses/>.
// { dg-do compile }
-// { dg-error "no matching" "" { target *-*-* } 1234 }
+// { dg-error "no matching" "" { target *-*-* } 1240 }
#include <vector>
#include <utility>