re PR c++/48647 ([C++0x] SFINAE does not handle incompatible pointer types well in...
authorJason Merrill <jason@redhat.com>
Sun, 22 May 2011 18:48:39 +0000 (14:48 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 22 May 2011 18:48:39 +0000 (14:48 -0400)
PR c++/48647
* typeck.c (composite_pointer_type_r): Return error_mark_node
on error in SFINAE context.

From-SVN: r174031

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/sfinae23.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/sfinae8.C

index d487e84ac5bd77d6f3052c3692b95f8883b5945b..e6399d364e9eac69599e1dc057c842b63584fb79 100644 (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
index 7791efcaa8f49f0a1b3b9f756e899ee00117b2c3..dd1cc3b127c55d1f1ae860998f9fd8b096e52ce3 100644 (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);
     }
index 74831063f8ec255835913e8c497a1f75554f9967..f083968b1c6baa1cea405e11634df1002cfdc8a5 100644 (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.
diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae23.C b/gcc/testsuite/g++.dg/cpp0x/sfinae23.C
new file mode 100644 (file)
index 0000000..4e2ea88
--- /dev/null
@@ -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));
index 2ad68dc5dbf0496b2b25714826a9e52b3db7b93d..5ac09c6b3b83eecac1e7fcb29b59b0499f1c1ff2 100644 (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));