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
This commit is contained in:
Matt Austern 2004-09-21 17:24:44 +00:00 committed by Matt Austern
parent 34f87940b2
commit 6bdb98d1b0
4 changed files with 34 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2004-09-21 Matt Austern <austern@apple.com>
PR c++/15049
* decl.c (grokvardecl): Accept declarations of global variables
using anonymous types.
2004-09-21 Roger Sayle <roger@eyesopen.com>
PR c++/7503

View File

@ -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)))

View File

@ -1,3 +1,8 @@
2004-09-17 Matt Austern <austern@apple.com>
PR c++/15049
* g++.dg/other/anon3.C: New.
2004-09-21 Roger Sayle <roger@eyesopen.com>
PR c++/7503

View File

@ -0,0 +1,7 @@
// pr c++/15049
// Origin: Matt Austern <austern@apple.com>
// Test that we can declare a global variable whose type is anonymous.
// { dg-do compile }
enum { a = 3 } x;