diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2018-04-27 16:56:55 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2018-04-27 16:56:55 +0000 |
commit | a6e34898d1e8920cc68d2089e45434c9703a77d0 (patch) | |
tree | fe98a04a49b515de108cb210e8fe690dcb838ace /gcc | |
parent | 6d0e87b25ee21493d4f47bb39aee3e2d33cb08d9 (diff) | |
download | gcc-a6e34898d1e8920cc68d2089e45434c9703a77d0.zip gcc-a6e34898d1e8920cc68d2089e45434c9703a77d0.tar.gz gcc-a6e34898d1e8920cc68d2089e45434c9703a77d0.tar.bz2 |
re PR c++/84691 (internal compiler error: in poplevel_class, at cp/name-lookup.c:4430)
/cp
2018-04-27 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84691
* decl.c (grokdeclarator): Clear friendp upon definition in local
class definition error.
/testsuite
2018-04-27 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84691
* g++.dg/cpp0x/friend3.C: New.
From-SVN: r259716
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/friend3.C | 11 |
4 files changed, 27 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9fd5266..552828f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-04-27 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/84691 + * decl.c (grokdeclarator): Clear friendp upon definition in local + class definition error. + 2018-04-27 Jason Merrill <jason@redhat.com> PR c++/85545 - ICE with noexcept PMF conversion. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 55e2343..03bc041 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -11298,9 +11298,11 @@ grokdeclarator (const cp_declarator *declarator, if (decl_context == NORMAL) error ("friend declaration not in class definition"); if (current_function_decl && funcdef_flag) - error ("can%'t define friend function %qs in a local " - "class definition", - name); + { + error ("can%'t define friend function %qs in a local " + "class definition", name); + friendp = 0; + } } else if (ctype && sfk == sfk_conversion) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 79d712f..a20bfd0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-04-27 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/84691 + * g++.dg/cpp0x/friend3.C: New. + 2018-04-27 Kyrylo Tkachov <kyrylo.tkachov@arm.com> PR target/82518 diff --git a/gcc/testsuite/g++.dg/cpp0x/friend3.C b/gcc/testsuite/g++.dg/cpp0x/friend3.C new file mode 100644 index 0000000..4432fc1 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/friend3.C @@ -0,0 +1,11 @@ +// PR c++/84691 +// { dg-do compile { target c++11 } } + +template<typename> +struct a { + unsigned b = [] { + union { + friend void c() {} // { dg-error "local class" } + }; // { dg-error "no members" } + }; +}; |