mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-24 07:40:26 +08:00
re PR c++/48647 ([C++0x] SFINAE does not handle incompatible pointer types well in conditional operator)
PR c++/48647 * typeck.c (composite_pointer_type_r): Return error_mark_node on error in SFINAE context. From-SVN: r174031
This commit is contained in:
parent
eec2794c17
commit
7a1db261de
gcc
@ -1,3 +1,9 @@
|
||||
2011-05-22 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/48647
|
||||
* typeck.c (composite_pointer_type_r): Return error_mark_node
|
||||
on error in SFINAE context.
|
||||
|
||||
2011-05-20 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/48945
|
||||
|
@ -516,7 +516,8 @@ composite_pointer_type_r (tree t1, tree t2,
|
||||
{
|
||||
if (complain & tf_error)
|
||||
composite_pointer_error (DK_PERMERROR, t1, t2, operation);
|
||||
|
||||
else
|
||||
return error_mark_node;
|
||||
result_type = void_type_node;
|
||||
}
|
||||
result_type = cp_build_qualified_type (result_type,
|
||||
@ -527,9 +528,13 @@ composite_pointer_type_r (tree t1, tree t2,
|
||||
if (TYPE_PTR_TO_MEMBER_P (t1))
|
||||
{
|
||||
if (!same_type_p (TYPE_PTRMEM_CLASS_TYPE (t1),
|
||||
TYPE_PTRMEM_CLASS_TYPE (t2))
|
||||
&& (complain & tf_error))
|
||||
composite_pointer_error (DK_PERMERROR, t1, t2, operation);
|
||||
TYPE_PTRMEM_CLASS_TYPE (t2)))
|
||||
{
|
||||
if (complain & tf_error)
|
||||
composite_pointer_error (DK_PERMERROR, t1, t2, operation);
|
||||
else
|
||||
return error_mark_node;
|
||||
}
|
||||
result_type = build_ptrmem_type (TYPE_PTRMEM_CLASS_TYPE (t1),
|
||||
result_type);
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
2011-05-22 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* g++.dg/cpp0x/sfinae23.C: New.
|
||||
* g++.dg/cpp0x/sfinae8.C: Correct.
|
||||
|
||||
2011-05-22 Thomas Koenig <tkoenig@gcc.gnu.org>
|
||||
|
||||
* gfortran.dg/function_optimize_8.f90: New test case.
|
||||
|
28
gcc/testsuite/g++.dg/cpp0x/sfinae23.C
Normal file
28
gcc/testsuite/g++.dg/cpp0x/sfinae23.C
Normal file
@ -0,0 +1,28 @@
|
||||
// PR c++/48647
|
||||
// { dg-options -std=c++0x }
|
||||
|
||||
template< class T >
|
||||
T&& declval();
|
||||
|
||||
template< class T, class U >
|
||||
decltype( true ? declval<T>() : declval<U>() ) test( int );
|
||||
|
||||
template< class T, class U >
|
||||
void test( ... );
|
||||
|
||||
|
||||
template< class T, class U >
|
||||
struct is_same {
|
||||
static const bool value = false;
|
||||
};
|
||||
|
||||
template< class T >
|
||||
struct is_same<T, T> {
|
||||
static const bool value = true;
|
||||
};
|
||||
|
||||
#define SA(X) static_assert ((X),#X)
|
||||
|
||||
typedef decltype( test<int*, double*>(0) ) void_expected;
|
||||
SA ((is_same<void_expected, void>::value));
|
||||
SA ((!is_same<void_expected, void*>::value));
|
@ -120,7 +120,7 @@ STATIC_ASSERT((!is_equality_comparable<Y, X>::value));
|
||||
STATIC_ASSERT((!is_equality_comparable<Y>::value));
|
||||
STATIC_ASSERT((is_equality_comparable<int X::*>::value));
|
||||
STATIC_ASSERT((!is_equality_comparable<int X::*, int Y::*>::value));
|
||||
STATIC_ASSERT((is_equality_comparable<int*, float*>::value));
|
||||
STATIC_ASSERT((!is_equality_comparable<int*, float*>::value));
|
||||
STATIC_ASSERT((is_equality_comparable<X*, Z*>::value));
|
||||
STATIC_ASSERT((!is_equality_comparable<X*, Y*>::value));
|
||||
|
||||
@ -139,7 +139,7 @@ STATIC_ASSERT((!is_not_equal_comparable<Y, X>::value));
|
||||
STATIC_ASSERT((!is_not_equal_comparable<Y>::value));
|
||||
STATIC_ASSERT((is_not_equal_comparable<int X::*>::value));
|
||||
STATIC_ASSERT((!is_not_equal_comparable<int X::*, int Y::*>::value));
|
||||
STATIC_ASSERT((is_not_equal_comparable<int*, float*>::value));
|
||||
STATIC_ASSERT((!is_not_equal_comparable<int*, float*>::value));
|
||||
STATIC_ASSERT((is_not_equal_comparable<X*, Z*>::value));
|
||||
STATIC_ASSERT((!is_not_equal_comparable<X*, Y*>::value));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user