Commit a6659b55 by Jason Merrill Committed by Jason Merrill

decl2.c (finish_static_data_member_decl): Diagnose static data member in unnamed class.

	* decl2.c (finish_static_data_member_decl): Diagnose static data
	member in unnamed class.

From-SVN: r208156
parent 88def637
2014-02-25 Jason Merrill <jason@redhat.com> 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 PR lto/53808
* class.c (clone_function_decl): Call note_vague_linkage_fn for * class.c (clone_function_decl): Call note_vague_linkage_fn for
defaulted virtual dtor. defaulted virtual dtor.
......
...@@ -2851,7 +2851,9 @@ finish_struct_anon_r (tree field, bool complain) ...@@ -2851,7 +2851,9 @@ finish_struct_anon_r (tree field, bool complain)
if (TREE_CODE (elt) != FIELD_DECL) 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) if (is_union)
permerror (input_location, permerror (input_location,
......
...@@ -802,6 +802,17 @@ finish_static_data_member_decl (tree decl, ...@@ -802,6 +802,17 @@ finish_static_data_member_decl (tree decl,
&& !DECL_TEMPLATE_INSTANTIATION (decl)) && !DECL_TEMPLATE_INSTANTIATION (decl))
permerror (input_location, "local class %q#T shall not have static data member %q#D", permerror (input_location, "local class %q#T shall not have static data member %q#D",
current_class_type, decl); 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; DECL_IN_AGGR_P (decl) = 1;
......
...@@ -2,12 +2,12 @@ ...@@ -2,12 +2,12 @@
struct A 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; } void foo() { i; }
}; };
struct B 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; } void foo() { i; }
}; };
...@@ -4,7 +4,7 @@ struct A ...@@ -4,7 +4,7 @@ struct A
{ {
struct struct
{ // { dg-error "anonymous struct cannot have function members" } { // { 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; } void foo() { i; }
}; // { dg-error "prohibits anonymous structs" } }; // { dg-error "prohibits anonymous structs" }
}; };
// 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment