aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-05-22 14:48:39 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-05-22 14:48:39 -0400
commit7a1db261dec3c7da38f1576a03ec44167649c1af (patch)
tree16927b8403529184612faf5712c25bbde2c9b4cf
parenteec2794c17c802a3027874aaa49f6bb3e5ef9f22 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/typeck.c13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/sfinae23.C28
-rw-r--r--gcc/testsuite/g++.dg/template/sfinae8.C4
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));