re PR c++/15049 ([DR 278/132/216/338/389/319] global variables with anonymous types...
authorMatt Austern <austern@apple.com>
Tue, 21 Sep 2004 17:24:44 +0000 (17:24 +0000)
committerMatt Austern <austern@gcc.gnu.org>
Tue, 21 Sep 2004 17:24:44 +0000 (17:24 +0000)
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
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/anon3.C [new file with mode: 0644]

index e9e6d4240df7ccfe2099eff4066e572ea10d346e..4e4a4d3da2cd323baa78a6d100f99ceab1403e93 100644 (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
index d486505703c7a708340ca3166af6ab5b885acc6b..463fa60ab1268d187e396f93c340be28ae78e400 100644 (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)))
index c52f7ba68dde9de84c70cd3d7d01baa3225d5a89..11d8dfc4228cc9c3b85e516bce0e445be3b32e0a 100644 (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
diff --git a/gcc/testsuite/g++.dg/other/anon3.C b/gcc/testsuite/g++.dg/other/anon3.C
new file mode 100644 (file)
index 0000000..87cbfb5
--- /dev/null
@@ -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;