This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/52108] declval() with incomplete type
- From: "redi at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 03 Feb 2012 14:37:35 +0000
- Subject: [Bug c++/52108] declval() with incomplete type
- Auto-submitted: auto-generated
- References: <bug-52108-4@http.gcc.gnu.org/bugzilla/>
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;
};