DR 657
authorJason Merrill <jason@redhat.com>
Sun, 17 Mar 2013 02:36:26 +0000 (22:36 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 17 Mar 2013 02:36:26 +0000 (22:36 -0400)
DR 657
* pt.c (tsubst_function_type): Call abstract_virtuals_error_sfinae.
(tsubst_arg_types): Likewise.

From-SVN: r196733

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/template/sfinae-dr657.C [new file with mode: 0644]

index 70a71be..2f5f873 100644 (file)
@@ -1,5 +1,9 @@
 2013-03-16  Jason Merrill  <jason@redhat.com>
 
+       DR 657
+       * pt.c (tsubst_function_type): Call abstract_virtuals_error_sfinae.
+       (tsubst_arg_types): Likewise.
+
        DR 1518
        PR c++/54835
        * call.c (convert_like_real): Check for explicit constructors
index c07ed32..cad1c60 100644 (file)
@@ -10850,6 +10850,9 @@ tsubst_arg_types (tree arg_types,
           }
         return error_mark_node;
     }
+    /* DR 657. */
+    if (abstract_virtuals_error_sfinae (NULL_TREE, type, complain))
+      return error_mark_node;
     
     /* Do array-to-pointer, function-to-pointer conversion, and ignore
        top-level qualifiers as required.  */
@@ -10912,10 +10915,8 @@ tsubst_function_type (tree t,
   return_type = tsubst (TREE_TYPE (t), args, complain, in_decl);
   if (return_type == error_mark_node)
     return error_mark_node;
-  /* The standard does not presently indicate that creation of a
-     function type with an invalid return type is a deduction failure.
-     However, that is clearly analogous to creating an array of "void"
-     or a reference to a reference.  This is core issue #486.  */
+  /* DR 486 clarifies that creation of a function type with an
+     invalid return type is a deduction failure.  */
   if (TREE_CODE (return_type) == ARRAY_TYPE
       || TREE_CODE (return_type) == FUNCTION_TYPE)
     {
@@ -10928,6 +10929,9 @@ tsubst_function_type (tree t,
        }
       return error_mark_node;
     }
+  /* And DR 657. */
+  if (abstract_virtuals_error_sfinae (NULL_TREE, return_type, complain))
+    return error_mark_node;
 
   /* Substitute the argument types.  */
   arg_types = tsubst_arg_types (TYPE_ARG_TYPES (t), args, NULL_TREE,
diff --git a/gcc/testsuite/g++.dg/template/sfinae-dr657.C b/gcc/testsuite/g++.dg/template/sfinae-dr657.C
new file mode 100644 (file)
index 0000000..b78b5a9
--- /dev/null
@@ -0,0 +1,22 @@
+// DR 657
+// Test that a return or parameter type with abstract class type causes a
+// deduction failure.
+
+struct A
+{
+  A();
+  A(int);
+  virtual void f() = 0;
+};
+
+template<class T> T declval();
+template<class T> int declval(...);
+
+template<class T> void arg(T);
+template<class T> int arg(...);
+
+int main()
+{
+  int i = declval<A>();
+  i = arg<A>(1);
+}