Add irreflexive comparison debug check

Jonathan Wakely jwakely@redhat.com
Thu Jul 30 10:30:00 GMT 2015


On 29/07/15 22:08 +0200, François Dumont wrote:
>Hi
>
>    Here is a patch to add irreflexive debug check.

Awesome!

You can add PR libstdc++/60519 to the changelog.


>    Standard algos signatures are such that there is no guaranty that
>the operator < or predicate to compare the iterator value type will
>exist. So I had to check if the call is valid using C++11 features
>declval and decltype.

Surely if someone calls an algorithm that requires a
StrictWeakOrdering then we know that it's valid to compare the value
types using the comparison implied by that particular call (either
operator< or the supplied predicate), and we should only be adding
this assertion to algorithms that require a StrictWeakOrdering.

Am I missing something?

Assuming those validity checks are needed ...

>+  struct _Irreflexive_checker
>+  {
>+#if __cplusplus >= 201103L
>+    template<typename _It>
>+      using __it_ref_t = typename std::iterator_traits<_It>::reference;

I'd just call this __ref_t, because where you use it the "it" part is
already implied by the template argument: __ref_t<_It>

Or you could add:

  template<typename _It>
    static typename std::iterator_traits<_It>::reference
    __deref();

and replace every std::declval<__it_ref_t<_It>>() with __deref<_It>()
which is much shorter.

>+    template<typename _It,
>+	     typename = decltype(
>+	std::declval<__it_ref_t<_It> >() < std::declval<__it_ref_t<_It> >())>

N.B. as this is only for C++11 and later there's no need for the
spaces before the closing >



More information about the Libstdc++ mailing list