__gnu_debug::__check_dereferenceable bug ?

François Dumont frs.dumont@gmail.com
Fri Oct 18 20:10:00 GMT 2013


Hi

     Following test fails:

void
test01()
{
   bool test __attribute__((unused)) = true;

   std::forward_list<int> fl1 { 1, 2, 3 };

   VERIFY( !__gnu_debug::__check_dereferenceable(fl1.before_begin()) ); 
// Ok
   auto bit = fl1.before_begin();
   VERIFY( !__gnu_debug::__check_dereferenceable(bit) ); // Ko
}

Even if it is a C++11 test, it is not a C++11 specific issue, there is 
the same for the C++03.

Available overloads are:

   template<typename _Iterator>
     inline bool
     __check_dereferenceable(_Iterator&)
     { return true; }

   template<typename _Tp>
     inline bool
     __check_dereferenceable(const _Tp* __ptr)
     { return __ptr; }

   template<typename _Iterator, typename _Sequence>
     inline bool
     __check_dereferenceable(const _Safe_iterator<_Iterator, _Sequence>& 
__x)
     { return __x._M_dereferenceable(); }


     I don't understand why the compiler is choosing the 1st overload 
when passing an lvalue rather than the 3rd, is it normal ? If so, it is 
ok to patch the library to take a const reference in the 1st overload ? 
Can I also do so for the __check_singular that has the same issue ?

François



More information about the Libstdc++ mailing list