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
This commit is contained in:
parent
88def6374c
commit
a6659b552d
|
@ -1,5 +1,9 @@
|
||||||
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)
|
||||||
|
|
||||||
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,
|
||||||
&& !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 @@
|
||||||
|
|
||||||
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
|
||||||
{
|
{
|
||||||
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" }
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
// 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;
|
Loading…
Reference in New Issue