re PR c++/31187 (extern declaration of variable in anonymous namespace prevents use...
authorJason Merrill <jason@redhat.com>
Mon, 2 Apr 2007 17:49:21 +0000 (13:49 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 2 Apr 2007 17:49:21 +0000 (13:49 -0400)
        PR c++/31187
        * typeck.c (cp_type_readonly): New fn.
        * cp-tree.h: Declare it.
        * decl.c (start_decl): Set implicit DECL_THIS_STATIC here.
        (cp_finish_decl): Not here.

        * g++.dg/ext/visibility/anon3.C: New test.

From-SVN: r123432

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/visibility/anon3.C [new file with mode: 0644]

index 49211160400b419eb6a052cde75fe4b46fa735fb..755115e4a935b4ee4a00bbecc4105c8839194613 100644 (file)
@@ -1,3 +1,11 @@
+2007-03-30  Jason Merrill  <jason@redhat.com>
+
+       PR c++/31187
+       * typeck.c (cp_type_readonly): New fn.
+       * cp-tree.h: Declare it.
+       * decl.c (start_decl): Set implicit DECL_THIS_STATIC here.
+       (cp_finish_decl): Not here.
+
 2007-03-31  Richard Guenther  <rguenther@suse.de>
 
        * optimize.c (maybe_clone_body): Replace splay-tree usage by
index 2d20246a24441e5c8e50d5d074f85fd6e88acf24..3b3821ef2575368bdf9e045d1a69e60df20f5353 100644 (file)
@@ -4742,6 +4742,7 @@ extern bool comp_ptr_ttypes_const         (tree, tree);
 extern int ptr_reasonably_similar              (tree, tree);
 extern tree build_ptrmemfunc                   (tree, tree, int, bool);
 extern int cp_type_quals                       (tree);
+extern bool cp_type_readonly                   (tree);
 extern bool cp_has_mutable_p                   (tree);
 extern bool at_least_as_qualified_p            (tree, tree);
 extern void cp_apply_type_quals_to_decl                (int, tree);
index 833e7b8e43a31304a60240701cc53d9ce6997fb6..76be0558faacb3d15665bcbf8a786a97cfba4079 100644 (file)
@@ -3797,6 +3797,7 @@ start_decl (const cp_declarator *declarator,
   tree decl;
   tree type, tem;
   tree context;
+  bool was_public;
 
   *pushed_scope_p = NULL_TREE;
 
@@ -3951,6 +3952,8 @@ start_decl (const cp_declarator *declarator,
                 decl);
     }
 
+  was_public = TREE_PUBLIC (decl);
+
   /* Enter this declaration into the symbol table.  */
   tem = maybe_push_decl (decl);
 
@@ -3971,6 +3974,17 @@ start_decl (const cp_declarator *declarator,
       && !have_global_bss_p ())
     DECL_COMMON (tem) = 1;
 
+  if (TREE_CODE (tem) == VAR_DECL
+      && DECL_NAMESPACE_SCOPE_P (tem) && !TREE_PUBLIC (tem) && !was_public
+      && !DECL_THIS_STATIC (tem) && !DECL_ARTIFICIAL (tem))
+    {
+      /* This is a const variable with implicit 'static'.  Set
+        DECL_THIS_STATIC so we can tell it from variables that are
+        !TREE_PUBLIC because of the anonymous namespace.  */
+      gcc_assert (cp_type_readonly (TREE_TYPE (tem)));
+      DECL_THIS_STATIC (tem) = 1;
+    }
+
   if (!processing_template_decl && TREE_CODE (tem) == VAR_DECL)
     start_decl_1 (tem, initialized);
 
@@ -5283,14 +5297,6 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
        {
          layout_var_decl (decl);
          maybe_commonize_var (decl);
-         if (DECL_NAMESPACE_SCOPE_P (decl) && !TREE_PUBLIC (decl)
-             && !DECL_THIS_STATIC (decl) && !DECL_ARTIFICIAL (decl))
-           {
-             /* This is a const variable with implicit 'static'.  Set
-                DECL_THIS_STATIC so we can tell it from variables that are
-                !TREE_PUBLIC because of the anonymous namespace.  */
-             DECL_THIS_STATIC (decl) = 1;
-           }
        }
 
       make_rtl_for_nonlocal_decl (decl, init, asmspec);
index 6478b3725bd5949443e4d9882272a962319beaf5..a5a33451cf98ecb3d1ef87beee80fa035a0efaa6 100644 (file)
@@ -6897,6 +6897,16 @@ cp_type_quals (tree type)
   return TYPE_QUALS (type);
 }
 
+/* Returns nonzero if the TYPE is const from a C++ perspective: look inside
+   arrays.  */
+
+bool
+cp_type_readonly (tree type)
+{
+  type = strip_array_types (type);
+  return TYPE_READONLY (type);
+}
+
 /* Returns nonzero if the TYPE contains a mutable member.  */
 
 bool
index 3b4d65abef76499f2e7f014aba93bd87e0deaebc..ca830148bc4981114627a31ff2a0438eac6e9f0d 100644 (file)
@@ -1,3 +1,8 @@
+2007-04-02  Jason Merrill  <jason@redhat.com>
+
+       PR c++/31187
+       * g++.dg/ext/visibility/anon3.C: New test.
+
 2007-04-01  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libgfortran/31052
diff --git a/gcc/testsuite/g++.dg/ext/visibility/anon3.C b/gcc/testsuite/g++.dg/ext/visibility/anon3.C
new file mode 100644 (file)
index 0000000..9def559
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/31187
+// Bug: the repeated declaration was confusing the compiler into
+// thinking that foo1 had language internal linkage.
+
+class foo { };
+
+namespace
+{
+  extern foo foo1;
+  foo foo1;
+}
+
+template< foo * >
+class bar { };
+
+bar< &foo1 > bar1;