/* Recursive helper for finish_struct_anon. */
static void
-finish_struct_anon_r (tree field, bool complain)
+finish_struct_anon_r (tree field)
{
for (tree elt = TYPE_FIELDS (TREE_TYPE (field)); elt; elt = DECL_CHAIN (elt))
{
|| TYPE_UNNAMED_P (TREE_TYPE (elt))))
continue;
- if (complain
- && (TREE_CODE (elt) != FIELD_DECL
- || (TREE_PRIVATE (elt) || TREE_PROTECTED (elt))))
- {
- /* We already complained about static data members in
- finish_static_data_member_decl. */
- if (!VAR_P (elt))
- {
- auto_diagnostic_group d;
- if (permerror (DECL_SOURCE_LOCATION (elt),
- TREE_CODE (TREE_TYPE (field)) == UNION_TYPE
- ? "%q#D invalid; an anonymous union may "
- "only have public non-static data members"
- : "%q#D invalid; an anonymous struct may "
- "only have public non-static data members", elt))
- {
- static bool hint;
- if (flag_permissive && !hint)
- {
- hint = true;
- inform (DECL_SOURCE_LOCATION (elt),
- "this flexibility is deprecated and will be "
- "removed");
- }
- }
- }
- }
-
TREE_PRIVATE (elt) = TREE_PRIVATE (field);
TREE_PROTECTED (elt) = TREE_PROTECTED (field);
int j=A().i; */
if (DECL_NAME (elt) == NULL_TREE
&& ANON_AGGR_TYPE_P (TREE_TYPE (elt)))
- finish_struct_anon_r (elt, /*complain=*/false);
+ finish_struct_anon_r (elt);
}
}
if (DECL_NAME (field) == NULL_TREE
&& ANON_AGGR_TYPE_P (TREE_TYPE (field)))
- finish_struct_anon_r (field, /*complain=*/true);
+ finish_struct_anon_r (field);
}
}
TYPE_HAS_COPY_ASSIGN (t) = 0;
TYPE_HAS_CONST_COPY_ASSIGN (t) = 0;
- /* Splice the implicitly generated functions out of TYPE_FIELDS. */
+ /* Splice the implicitly generated functions out of TYPE_FIELDS and diagnose
+ invalid members. */
for (tree probe, *prev_p = &TYPE_FIELDS (t); (probe = *prev_p);)
- if (TREE_CODE (probe) == FUNCTION_DECL && DECL_ARTIFICIAL (probe))
- *prev_p = DECL_CHAIN (probe);
- else
- prev_p = &DECL_CHAIN (probe);
+ {
+ if (TREE_CODE (probe) == FUNCTION_DECL && DECL_ARTIFICIAL (probe))
+ *prev_p = DECL_CHAIN (probe);
+ else
+ prev_p = &DECL_CHAIN (probe);
+
+ if (DECL_ARTIFICIAL (probe)
+ && (!DECL_IMPLICIT_TYPEDEF_P (probe)
+ || TYPE_ANON_P (TREE_TYPE (probe))))
+ continue;
+
+ if (TREE_CODE (probe) != FIELD_DECL
+ || (TREE_PRIVATE (probe) || TREE_PROTECTED (probe)))
+ {
+ /* We already complained about static data members in
+ finish_static_data_member_decl. */
+ if (!VAR_P (probe))
+ {
+ auto_diagnostic_group d;
+ if (permerror (DECL_SOURCE_LOCATION (probe),
+ TREE_CODE (t) == UNION_TYPE
+ ? "%q#D invalid; an anonymous union may "
+ "only have public non-static data members"
+ : "%q#D invalid; an anonymous struct may "
+ "only have public non-static data members", probe))
+ {
+ static bool hint;
+ if (flag_permissive && !hint)
+ {
+ hint = true;
+ inform (DECL_SOURCE_LOCATION (probe),
+ "this flexibility is deprecated and will be "
+ "removed");
+ }
+ }
+ }
+ }
+ }
/* Splice all functions out of CLASSTYPE_MEMBER_VEC. */
vec<tree,va_gc>* vec = CLASSTYPE_MEMBER_VEC (t);
// Message-ID: <m0pA49A-0000LdC@piano.veritas.com>
static union {
- struct SS {
+ struct SS { // { dg-error "anonymous union" }
int ss;
};
};// { dg-error "no members" }