OSDN Git Service

PR c++/21581
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 Mar 2006 16:15:25 +0000 (16:15 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 Mar 2006 16:15:25 +0000 (16:15 +0000)
        * parser.c (cp_parser_declaration): Support attributes on
        anonymous namespaces.
        * name-lookup.c (push_namespace_with_attribs): Anonymous
        namespaces default to hidden visibility.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112250 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/cp/parser.c
gcc/testsuite/g++.dg/ext/visibility/anon1.C [new file with mode: 0644]

index 9831655..d754dd0 100644 (file)
@@ -1,3 +1,11 @@
+2006-03-21  Jason Merrill  <jason@redhat.com>
+
+       PR c++/21581
+       * parser.c (cp_parser_declaration): Support attributes on
+       anonymous namespaces.
+       * name-lookup.c (push_namespace_with_attribs): Anonymous 
+       namespaces default to hidden visibility.
+
 2006-03-20  Jason Merrill  <jason@redhat.com>
 
        PR c++/21764, c++/19238
index 9b10fb4..4af73a3 100644 (file)
@@ -3046,7 +3046,7 @@ push_namespace_with_attribs (tree name, tree attributes)
       tree name = TREE_PURPOSE (d);
       tree args = TREE_VALUE (d);
       tree x;
-      
+
       if (! is_attribute_p ("visibility", name))
        {
          warning (OPT_Wattributes, "%qs attribute directive ignored",
@@ -3055,16 +3055,25 @@ push_namespace_with_attribs (tree name, tree attributes)
        }
 
       x = args ? TREE_VALUE (args) : NULL_TREE;
-      if (x == NULL_TREE || TREE_CODE (x) != STRING_CST)
+      if (x == NULL_TREE || TREE_CODE (x) != STRING_CST || TREE_CHAIN (args))
        {
-         warning (OPT_Wattributes, "%qs attribute requires an NTBS argument",
+         warning (OPT_Wattributes, "%qs attribute requires a single NTBS argument",
                   IDENTIFIER_POINTER (name));
          continue;
        }
 
       current_binding_level->has_visibility = 1;
       push_visibility (TREE_STRING_POINTER (x));
+      goto found;
+    }
+  if (anon)
+    {
+      /* Anonymous namespaces default to hidden visibility.  This might
+        change once we implement export.  */
+      current_binding_level->has_visibility = 1;
+      push_visibility ("hidden");
     }
+ found:
 #endif
 
   timevar_pop (TV_NAME_LOOKUP);
index e04a8e7..c5e6b17 100644 (file)
@@ -7066,7 +7066,8 @@ cp_parser_declaration (cp_parser* parser)
                && (cp_lexer_peek_nth_token (parser->lexer, 3)->type
                    != CPP_EQ))
               /* An unnamed namespace definition.  */
-              || token2.type == CPP_OPEN_BRACE))
+              || token2.type == CPP_OPEN_BRACE
+              || token2.keyword == RID_ATTRIBUTE))
     cp_parser_namespace_definition (parser);
   /* Objective-C++ declaration/definition.  */
   else if (c_dialect_objc () && OBJC_IS_AT_KEYWORD (token1.keyword))
diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon1.C b/gcc/testsuite/g++.dg/ext/visibility/anon1.C
new file mode 100644 (file)
index 0000000..9a3d8a7
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/21581
+// Test for anonymous namespace default hidden visibility
+
+// { dg-require-visibility "" }
+// { dg-final { scan-hidden "_ZN.*1fEv" } }
+
+namespace
+{
+  int f() { }
+}