[PR c++/84375] Fix ICE after bad friend

https://gcc.gnu.org/ml/gcc-patches/2018-02/msg00987.html
	PR c++/84375
	* name-lookup.c (do_pushdecl): Bail out on bad local friend injection.

	* g++.dg/lookup/pr84375.C: New.

From-SVN: r257739
This commit is contained in:
Nathan Sidwell 2018-02-16 14:30:55 +00:00
parent 08223f7633
commit b1a7e33d67
4 changed files with 30 additions and 7 deletions

View file

@ -1,3 +1,8 @@
2018-02-16 Nathan Sidwell <nathan@acm.org>
PR c++/84375
* name-lookup.c (do_pushdecl): Bail out on bad local friend injection.
2018-02-15 Jason Merrill <jason@redhat.com>
PR c++/83227 - C++17 ICE with init-list derived-to-base conversion.

View file

@ -3079,12 +3079,16 @@ do_pushdecl (tree decl, bool is_friend)
if (is_friend)
{
if (level->kind != sk_namespace)
/* In a local class, a friend function declaration must
find a matching decl in the innermost non-class scope.
[class.friend/11] */
error ("friend declaration %qD in local class without "
"prior local declaration", decl);
else if (!flag_friend_injection)
{
/* In a local class, a friend function declaration must
find a matching decl in the innermost non-class scope.
[class.friend/11] */
error ("friend declaration %qD in local class without "
"prior local declaration", decl);
/* Don't attempt to push it. */
return error_mark_node;
}
if (!flag_friend_injection)
/* Hide it from ordinary lookup. */
DECL_ANTICIPATED (decl) = DECL_HIDDEN_FRIEND_P (decl) = true;
}

View file

@ -1,3 +1,8 @@
2018-02-16 Nathan Sidwell <nathan@acm.org>
PR c++/84375
* g++.dg/lookup/pr84375.C: New.
2018-02-14 Oleg Endo <olegendo@gcc.gnu.org>
PR target/83831
@ -29,7 +34,7 @@
2018-02-15 Martin Sebor <msebor@redhat.com>
* gcc.dg/lto/README (dg-lto-warning, dg-lto-message): Document new
directives.
directives.
2018-02-15 Janus Weil <janus@gcc.gnu.org>

View file

@ -0,0 +1,9 @@
// PR c++/84375 ICE after error
void foo()
{
struct A
{
friend void A(); // { dg-error "local class without prior local" }
};
}