From 0bde772c9cd71ef31d4d1e99fb3687eb7086c330 Mon Sep 17 00:00:00 2001 From: jason Date: Sun, 22 May 2011 20:31:59 +0000 Subject: [PATCH] PR c++/48647 * typeck.c (composite_pointer_type_r): Return error_mark_node on error in SFINAE context. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@174044 138bc75d-0d04-0410-961f-82ee72b054a4 index 59bf3ab..9a81ea5 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); } 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() : declval() ) 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 { + static const bool value = true; +}; + +#define SA(X) static_assert ((X),#X) + +typedef decltype( test(0) ) void_expected; +SA ((is_same::value)); +SA ((!is_same::value)); diff --git a/gcc/testsuite/g++.dg/template/sfinae8.C b/gcc/testsuite/g++.dg/template/sfinae8.C index 2ad68dc..5ac09c6 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::value)); STATIC_ASSERT((!is_equality_comparable::value)); STATIC_ASSERT((is_equality_comparable::value)); STATIC_ASSERT((!is_equality_comparable::value)); -STATIC_ASSERT((is_equality_comparable::value)); +STATIC_ASSERT((!is_equality_comparable::value)); STATIC_ASSERT((is_equality_comparable::value)); STATIC_ASSERT((!is_equality_comparable::value)); @@ -139,7 +139,7 @@ STATIC_ASSERT((!is_not_equal_comparable::value)); STATIC_ASSERT((!is_not_equal_comparable::value)); STATIC_ASSERT((is_not_equal_comparable::value)); STATIC_ASSERT((!is_not_equal_comparable::value)); -STATIC_ASSERT((is_not_equal_comparable::value)); +STATIC_ASSERT((!is_not_equal_comparable::value)); STATIC_ASSERT((is_not_equal_comparable::value)); STATIC_ASSERT((!is_not_equal_comparable::value)); -- 1.7.0.4