mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 15:11:08 +08:00
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:
parent
1d54b13841
commit
936d500dfc
@ -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
|
||||
|
@ -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 "" }
|
||||
};
|
||||
|
||||
|
9
gcc/testsuite/g++.dg/other/anon-union5.C
Normal file
9
gcc/testsuite/g++.dg/other/anon-union5.C
Normal file
@ -0,0 +1,9 @@
|
||||
// PR c++/97974
|
||||
|
||||
struct A {
|
||||
union {
|
||||
operator int (); // { dg-error "anonymous union" }
|
||||
int a;
|
||||
};
|
||||
operator int; // { dg-error "" }
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user