]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/80259 (ICE deleting friend function)
authorJakub Jelinek <jakub@redhat.com>
Mon, 25 Jun 2018 16:58:35 +0000 (18:58 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 25 Jun 2018 16:58:35 +0000 (18:58 +0200)
Backported from mainline
2017-12-06  Jakub Jelinek  <jakub@redhat.com>

PR c++/80259
* decl2.c (grokfield): Diagnose = delete redefinition of a friend.

* g++.dg/cpp0x/pr80259.C: New test.

From-SVN: r262043

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

index b4bdd1d4c00f42a7def0fd8dae6d579d02f29466..045e5e127a443a9040c82bde9fb74590c0d4567e 100644 (file)
@@ -1,6 +1,11 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2017-12-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/80259
+       * decl2.c (grokfield): Diagnose = delete redefinition of a friend.
+
        2017-11-23  Jakub Jelinek  <jakub@redhat.com>
 
        * parser.c (cp_parser_omp_declare): Change return type to bool from
index a9511dece51af18ba5f98a3bb98d578519d55620..848f11cbbc60fc4d739c9d89536d159d8afd5674 100644 (file)
@@ -963,9 +963,18 @@ grokfield (const cp_declarator *declarator,
        {
          if (init == ridpointers[(int)RID_DELETE])
            {
-             DECL_DELETED_FN (value) = 1;
-             DECL_DECLARED_INLINE_P (value) = 1;
-             DECL_INITIAL (value) = error_mark_node;
+             if (friendp && decl_defined_p (value))
+               {
+                 error ("redefinition of %q#D", value);
+                 inform (DECL_SOURCE_LOCATION (value),
+                         "%q#D previously defined here", value);
+               }
+             else
+               {
+                 DECL_DELETED_FN (value) = 1;
+                 DECL_DECLARED_INLINE_P (value) = 1;
+                 DECL_INITIAL (value) = error_mark_node;
+               }
            }
          else if (init == ridpointers[(int)RID_DEFAULT])
            {
index 67023267d1b317b0bfadbfabbeb9d7738f45d4b5..cd16b93cf17e28d781283113f5bf7a29fce160c6 100644 (file)
@@ -1,6 +1,11 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2017-12-06  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/80259
+       * g++.dg/cpp0x/pr80259.C: New test.
+
        2017-12-02  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/81212
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr80259.C b/gcc/testsuite/g++.dg/cpp0x/pr80259.C
new file mode 100644 (file)
index 0000000..9d2a109
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/80259
+// { dg-do compile { target c++11 } }
+
+void foo () {} // { dg-message "previously defined here" }
+void bar ();
+
+struct A
+{
+  friend void foo () = delete; // { dg-error "redefinition of" }
+  friend void bar () = delete; // { dg-message "previously defined here" }
+};
+
+void bar () {} // { dg-error "redefinition of" }