http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52108
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |rejects-valid Status|UNCONFIRMED |NEW Last reconfirmed| |2012-02-03 Ever Confirmed|0 |1 Known to fail| |4.6.2, 4.7.0 --- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-02-03 14:37:35 UTC --- Confirmed, x_pair shouldn't be instantiated to form x_pair* Reduced: struct true_type { static const bool value = true; }; struct false_type { static const bool value = false; }; template <class T> T&& declval() noexcept; template <class T> struct my_t_alloc_p { typedef T value_type; typedef value_type* pointer; // <--- see Incomplete below }; struct type_selector { #if 1 // T::pointer should be present template <class T> static decltype( declval<typename T::pointer>(), declval<true_type>()) __test_p( int ); #else // If the declaration above re-write as below (worse, IMO), then it pass: template <class T> static decltype( T::pointer(), declval<true_type>() ) __test_p( int ); #endif template <class> static false_type __test_p( ... ); }; template <class Alloc> struct x_allocator_traits { typedef decltype(type_selector::__test_p<Alloc>(0)) pointer; }; template <class A> struct x_pair { A a; }; struct Incomplete { typedef typename x_allocator_traits<my_t_alloc_p<x_pair<Incomplete> > >::pointer pointer6; };