From 6bdb98d1b015ab102211519a15df964dafbad19b Mon Sep 17 00:00:00 2001 From: Matt Austern Date: Tue, 21 Sep 2004 17:24:44 +0000 Subject: [PATCH] re PR c++/15049 ([DR 278/132/216/338/389/319] global variables with anonymous types are legal) PR c++/15049 * cp/decl.c (grokvardecl): Accept declarations of global variables using anonymous types. * testsuite/g++.dg/other/anon3.C: New. From-SVN: r87814 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 20 ++++++++++++++++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/other/anon3.C | 7 +++++++ 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/other/anon3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e9e6d4240df..4e4a4d3da2c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-09-21 Matt Austern + + PR c++/15049 + * decl.c (grokvardecl): Accept declarations of global variables + using anonymous types. + 2004-09-21 Roger Sayle PR c++/7503 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index d486505703c..463fa60ab12 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5931,17 +5931,29 @@ grokvardecl (tree type, or enumeration declared in a local scope) shall not be used to declare an entity with linkage. - Only check this for public decls for now. */ - tree t = no_linkage_check (TREE_TYPE (decl), - /*relaxed_p=*/false); + Only check this for public decls for now. */ + tree t1 = TREE_TYPE (decl); + tree t = no_linkage_check (t1, /*relaxed_p=*/false); if (t) { if (TYPE_ANONYMOUS_P (t)) { if (DECL_EXTERN_C_P (decl)) - /* Allow this; it's pretty common in C. */; + /* Allow this; it's pretty common in C. */ + ; + else if (same_type_ignoring_top_level_qualifiers_p(t1, t)) + /* This is something like "enum { a = 3 } x;", which is + well formed. The enum doesn't have "a name with no + linkage", because it has no name. See closed CWG issue + 132. + + Note that while this construct is well formed in C++03 + it is likely to become ill formed in C++0x. See open + CWG issue 389 and related issues. */ + ; else { + /* It's a typedef referring to an anonymous type. */ pedwarn ("non-local variable `%#D' uses anonymous type", decl); if (DECL_ORIGINAL_TYPE (TYPE_NAME (t))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c52f7ba68dd..11d8dfc4228 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ + 2004-09-17 Matt Austern + + PR c++/15049 + * g++.dg/other/anon3.C: New. + 2004-09-21 Roger Sayle PR c++/7503 diff --git a/gcc/testsuite/g++.dg/other/anon3.C b/gcc/testsuite/g++.dg/other/anon3.C new file mode 100644 index 00000000000..87cbfb544cd --- /dev/null +++ b/gcc/testsuite/g++.dg/other/anon3.C @@ -0,0 +1,7 @@ +// pr c++/15049 +// Origin: Matt Austern +// Test that we can declare a global variable whose type is anonymous. + +// { dg-do compile } + +enum { a = 3 } x; -- 2.30.2