2014-02-25 Jason Merrill <jason@redhat.com>
+ * decl2.c (finish_static_data_member_decl): Diagnose static data
+ member in unnamed class.
+ * class.c (finish_struct_anon_r): Avoid redundant diagnostic.
+
PR lto/53808
* class.c (clone_function_decl): Call note_vague_linkage_fn for
defaulted virtual dtor.
if (TREE_CODE (elt) != FIELD_DECL)
{
- if (complain)
+ /* We already complained about static data members in
+ finish_static_data_member_decl. */
+ if (complain && TREE_CODE (elt) != VAR_DECL)
{
if (is_union)
permerror (input_location,
&& !DECL_TEMPLATE_INSTANTIATION (decl))
permerror (input_location, "local class %q#T shall not have static data member %q#D",
current_class_type, decl);
+ else
+ for (tree t = current_class_type; TYPE_P (t);
+ t = CP_TYPE_CONTEXT (t))
+ if (TYPE_ANONYMOUS_P (t))
+ {
+ if (permerror (DECL_SOURCE_LOCATION (decl),
+ "static data member %qD in unnamed class", decl))
+ inform (DECL_SOURCE_LOCATION (TYPE_NAME (t)),
+ "unnamed class defined here");
+ break;
+ }
DECL_IN_AGGR_P (decl) = 1;
struct A
{
- struct { static int i; }; // { dg-error "prohibits anonymous structs|an anonymous struct" }
+ struct { static int i; }; // { dg-error "prohibits anonymous structs|an anonymous struct|unnamed class" }
void foo() { i; }
};
struct B
{
- union { static int i; }; // { dg-error "an anonymous union|member of a union" }
+ union { static int i; }; // { dg-error "an anonymous union|member of a union|unnamed class" }
void foo() { i; }
};
{
struct
{ // { dg-error "anonymous struct cannot have function members" }
- struct { static int i; }; // { dg-error "prohibits anonymous structs|non-static data members" }
+ struct { static int i; }; // { dg-error "prohibits anonymous structs|non-static data members|unnamed class" }
void foo() { i; }
}; // { dg-error "prohibits anonymous structs" }
};
--- /dev/null
+// 9.4.2/4: Unnamed classes and classes contained directly or indirectly
+// within unnamed classes shall not contain static data members.
+
+typedef struct { // { dg-message "unnamed" }
+ static int i; // { dg-error "static data member" }
+} A;