re PR c++/60753 (Deleted definition of an explicit function template specialization...
authorPaolo Carlini <paolo.carlini@oracle.com>
Thu, 8 Jan 2015 15:48:36 +0000 (15:48 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 8 Jan 2015 15:48:36 +0000 (15:48 +0000)
/cp
2015-01-08  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60753
* decl.c (grokfndecl): Add bool parameter.
(grokdeclarator): Adjust calls.
(start_decl): Don't set DECL_DELETED_FN here.

/testsuite
2015-01-08  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60753
* g++.dg/cpp0x/deleted10.C: New.

From-SVN: r219347

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/deleted10.C [new file with mode: 0644]

index f9322bfd839c3f47255dd082c528294b338499c7..5c576bc262b610e728faae4e45f3d3da2197fd35 100644 (file)
@@ -1,3 +1,10 @@
+2015-01-08  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60753
+       * decl.c (grokfndecl): Add bool parameter.
+       (grokdeclarator): Adjust calls.
+       (start_decl): Don't set DECL_DELETED_FN here.
+
 2015-01-06  Jason Merrill  <jason@redhat.com>
 
        * parser.c (cp_parser_nested_name_specifier_opt): Diagnose invalid
index 2fea106771b5a58a658539fc116b7e1441b76715..65ccf7745d273793fd9c21de0195ad15ea2641dc 100644 (file)
@@ -4631,26 +4631,15 @@ start_decl (const cp_declarator *declarator,
   if (context != global_namespace)
     *pushed_scope_p = push_scope (context);
 
-  if (initialized)
-    /* Is it valid for this decl to have an initializer at all?
-       If not, set INITIALIZED to zero, which will indirectly
-       tell `cp_finish_decl' to ignore the initializer once it is parsed.  */
-    switch (TREE_CODE (decl))
-      {
-      case TYPE_DECL:
-       error ("typedef %qD is initialized (use decltype instead)", decl);
-       return error_mark_node;
-
-      case FUNCTION_DECL:
-       if (initialized == SD_DELETED)
-         /* We'll handle the rest of the semantics later, but we need to
-            set this now so it's visible to duplicate_decls.  */
-         DECL_DELETED_FN (decl) = 1;
-       break;
-
-      default:
-       break;
-      }
+  /* Is it valid for this decl to have an initializer at all?
+     If not, set INITIALIZED to zero, which will indirectly
+     tell `cp_finish_decl' to ignore the initializer once it is parsed.  */
+  if (initialized
+      && TREE_CODE (decl) == TYPE_DECL)
+    {
+      error ("typedef %qD is initialized (use decltype instead)", decl);
+      return error_mark_node;
+    }
 
   if (initialized)
     {
@@ -7630,6 +7619,7 @@ grokfndecl (tree ctype,
            int friendp,
            int publicp,
            int inlinep,
+           bool deletedp,
            special_function_kind sfk,
            bool funcdef_flag,
            int template_count,
@@ -7768,6 +7758,9 @@ grokfndecl (tree ctype,
       DECL_CONTEXT (decl) = ctype;
     }
 
+  if (deletedp)
+    DECL_DELETED_FN (decl) = 1;
+
   if (ctype)
     {
       DECL_CONTEXT (decl) = ctype;
@@ -10756,7 +10749,7 @@ grokdeclarator (const cp_declarator *declarator,
                               virtualp, flags, memfn_quals, rqual, raises,
                               friendp ? -1 : 0, friendp, publicp,
                                inlinep | (2 * constexpr_p),
-                              sfk,
+                              initialized == SD_DELETED, sfk,
                               funcdef_flag, template_count, in_namespace,
                               attrlist, declarator->id_loc);
             decl = set_virt_specifiers (decl, virt_specifiers);
@@ -10978,7 +10971,8 @@ grokdeclarator (const cp_declarator *declarator,
        decl = grokfndecl (ctype, type, original_name, parms, unqualified_id,
                           virtualp, flags, memfn_quals, rqual, raises,
                           1, friendp,
-                          publicp, inlinep | (2 * constexpr_p), sfk,
+                          publicp, inlinep | (2 * constexpr_p),
+                          initialized == SD_DELETED, sfk,
                            funcdef_flag,
                           template_count, in_namespace, attrlist,
                           declarator->id_loc);
index 356d20fe988bb0ec52d5d468dc4f3f6b48cefc84..e692f4699d4cf0198cd5dcca1a5d86a31a6190ec 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-08  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60753
+       * g++.dg/cpp0x/deleted10.C: New.
+
 2015-01-07  David Malcolm  <dmalcolm@redhat.com>
 
        * jit.dg/test-error-dereferencing-void-ptr.c: New test case.
diff --git a/gcc/testsuite/g++.dg/cpp0x/deleted10.C b/gcc/testsuite/g++.dg/cpp0x/deleted10.C
new file mode 100644 (file)
index 0000000..4fbee27
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/60753
+// { dg-do compile { target c++11 } }
+
+template<class T> void foo (T);
+
+template<> void foo<int> (int);
+template<> void foo<int> (int) = delete;     // { dg-error "deleted" }
+
+struct S
+{
+  template<class T> void bar (T);
+};
+
+template<> void S::bar<int> (int);
+template<> void S::bar<int> (int) = delete;  // { dg-error "deleted" }