diff options
author | Jason Merrill <jason@redhat.com> | 2011-05-22 14:48:39 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-05-22 14:48:39 -0400 |
commit | 7a1db261dec3c7da38f1576a03ec44167649c1af (patch) | |
tree | 16927b8403529184612faf5712c25bbde2c9b4cf | |
parent | eec2794c17c802a3027874aaa49f6bb3e5ef9f22 (diff) | |
download | gcc-7a1db261dec3c7da38f1576a03ec44167649c1af.zip gcc-7a1db261dec3c7da38f1576a03ec44167649c1af.tar.gz gcc-7a1db261dec3c7da38f1576a03ec44167649c1af.tar.bz2 |
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
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/sfinae23.C | 28 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/sfinae8.C | 4 |
5 files changed, 50 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d487e84..e6399d3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 7791efc..dd1cc3b 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7483106..f083968 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae23.C b/gcc/testsuite/g++.dg/cpp0x/sfinae23.C new file mode 100644 index 0000000..4e2ea88 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae23.C @@ -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)); diff --git a/gcc/testsuite/g++.dg/template/sfinae8.C b/gcc/testsuite/g++.dg/template/sfinae8.C index 2ad68dc..5ac09c6b 100644 --- a/gcc/testsuite/g++.dg/template/sfinae8.C +++ b/gcc/testsuite/g++.dg/template/sfinae8.C @@ -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)); |