c++: ICE with anonymous union [PR97974]

Here lookup got confused by finding a conversion operator from
lookup_anon_field.  Let's avoid this by pruning functions from
CLASSTYPE_MEMBER_VEC as well as TYPE_FIELDS.

gcc/cp/ChangeLog:

	PR c++/97974
	* decl.c (fixup_anonymous_aggr): Prune all functions from
	CLASSTYPE_MEMBER_VEC.

gcc/testsuite/ChangeLog:

	PR c++/97974
	* g++.dg/lookup/pr84962.C: Adjust diagnostic.
	* g++.dg/other/anon-union5.C: New test.
This commit is contained in:
Jason Merrill 2021-04-10 14:00:15 -04:00
parent 1d54b13841
commit 936d500dfc
3 changed files with 18 additions and 1 deletions

View File

@ -5005,6 +5005,14 @@ fixup_anonymous_aggr (tree t)
else
prev_p = &DECL_CHAIN (probe);
/* Splice all functions out of CLASSTYPE_MEMBER_VEC. */
vec<tree,va_gc>* vec = CLASSTYPE_MEMBER_VEC (t);
unsigned store = 0;
for (tree elt : vec)
if (!is_overloaded_fn (elt))
(*vec)[store++] = elt;
vec_safe_truncate (vec, store);
/* Anonymous aggregates cannot have fields with ctors, dtors or complex
assignment operators (because they cannot have these methods themselves).
For anonymous unions this is already checked because they are not allowed

View File

@ -9,6 +9,6 @@ struct X {
// { dg-error "public non-static data member" "" { target *-*-* } .-1 }
};
int : a; // { dg-error "non-integral" }
int : a; // { dg-error "" }
};

View File

@ -0,0 +1,9 @@
// PR c++/97974
struct A {
union {
operator int (); // { dg-error "anonymous union" }
int a;
};
operator int; // { dg-error "" }
};