This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: [patch, libstdc++] In debug mode, diagnose empty initializer_list in min/max/minmax
- From: Jonathan Wakely <jwakely at redhat dot com>
- To: Eelis <eelis at eelis dot net>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, libstdc++ <libstdc++ at gcc dot gnu dot org>
- Date: Tue, 23 Feb 2016 22:39:51 +0000
- Subject: Re: [patch, libstdc++] In debug mode, diagnose empty initializer_list in min/max/minmax
- Authentication-results: sourceware.org; auth=none
- References: <56CCC918 dot 9040905 at eelis dot net>
On 23/02/16 22:03 +0100, Eelis wrote:
The std::min, std::max, and std::minmax overloads that take a std::initializer_list all require that the list is not empty. The attached patch adds debug mode checks for this.
Nice, thanks for the patch.
Thanks,
Eelis
Index: libstdc++-v3/include/debug/formatter.h
===================================================================
--- libstdc++-v3/include/debug/formatter.h (revision 233636)
+++ libstdc++-v3/include/debug/formatter.h (working copy)
@@ -87,6 +87,8 @@
__msg_splice_bad,
__msg_splice_other,
__msg_splice_overlap,
+ // std::initializer_list checks
+ __msg_empty_init_list,
// iterator checks
__msg_init_singular,
__msg_init_copy_singular,
Index: libstdc++-v3/src/c++11/debug.cc
===================================================================
--- libstdc++-v3/src/c++11/debug.cc (revision 233636)
+++ libstdc++-v3/src/c++11/debug.cc (working copy)
@@ -139,6 +139,8 @@
"attempt to splice an iterator from a different container",
"splice destination %1.name;"
" occurs within source range [%2.name;, %3.name;)",
+ // std::initializer_list checks
+ "%1;(): empty initializer_list",
// iterator checks
"attempt to initialize an iterator that will immediately become singular",
"attempt to copy-construct an iterator from a singular iterator",
New entries should go at the end, so you don't alter the positions of
existing entries.
Index: libstdc++-v3/include/debug/macros.h
===================================================================
--- libstdc++-v3/include/debug/macros.h (revision 233636)
+++ libstdc++-v3/include/debug/macros.h (working copy)
@@ -69,6 +69,12 @@
._M_iterator(_First, #_First) \
._M_iterator(_Last, #_Last))
+// Verify that the initializer_list is non-empty.
+#define __glibcxx_check_non_empty_init_list(_List) \
+_GLIBCXX_DEBUG_VERIFY(_List.size() != 0, \
+ _M_message(__gnu_debug::__msg_empty_init_list) \
+ ._M_string(__func__))
+
/** Verify that we can insert into *this with the iterator _Position.
* Insertion into a container at a specific position requires that
* the iterator be nonsingular, either dereferenceable or past-the-end,
Index: libstdc++-v3/include/debug/debug.h
===================================================================
--- libstdc++-v3/include/debug/debug.h (revision 233636)
+++ libstdc++-v3/include/debug/debug.h (working copy)
@@ -62,6 +62,7 @@
# define __glibcxx_requires_cond(_Cond,_Msg)
# define __glibcxx_requires_valid_range(_First,_Last)
+# define __glibcxx_requires_non_empty_init_list(_List)
# define __glibcxx_requires_sorted(_First,_Last)
# define __glibcxx_requires_sorted_pred(_First,_Last,_Pred)
# define __glibcxx_requires_sorted_set(_First1,_Last1,_First2)
This should be enabled for _GLIBCXX_ASSERTIONS not only
_GLIBCXX_DEBUG.
Otherwise this looks good, but will have to wait until after the GCC 6
release now. If I forget about it please send a ping email to remind
us once GCC 6 has been released, thanks.