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:
Jason Merrill 2011-05-22 14:48:39 -04:00 committed by Jason Merrill
parent eec2794c17
commit 7a1db261de
5 changed files with 50 additions and 6 deletions

View File

@ -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

View File

@ -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);
}

View File

@ -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.

View 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));

View File

@ -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));