From 25d508d1cae91b519ae0d12cd6e77e9805ad683f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 25 Jun 2018 18:58:35 +0200 Subject: [PATCH] backport: re PR c++/80259 (ICE deleting friend function) Backported from mainline 2017-12-06 Jakub Jelinek 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 | 5 +++++ gcc/cp/decl2.c | 15 ++++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/pr80259.C | 13 +++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/pr80259.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b4bdd1d4c00f..045e5e127a44 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,11 @@ 2018-06-25 Jakub Jelinek Backported from mainline + 2017-12-06 Jakub Jelinek + + PR c++/80259 + * decl2.c (grokfield): Diagnose = delete redefinition of a friend. + 2017-11-23 Jakub Jelinek * parser.c (cp_parser_omp_declare): Change return type to bool from diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index a9511dece51a..848f11cbbc60 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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]) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 67023267d1b3..cd16b93cf17e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2018-06-25 Jakub Jelinek Backported from mainline + 2017-12-06 Jakub Jelinek + + PR c++/80259 + * g++.dg/cpp0x/pr80259.C: New test. + 2017-12-02 Jakub Jelinek 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 index 000000000000..9d2a109bcf3a --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr80259.C @@ -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" } -- 2.47.2