re PR c++/49440 (Invalid dynamic_cast for unnamed namespace)
authorJason Merrill <jason@redhat.com>
Thu, 23 Jun 2011 16:52:48 +0000 (12:52 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 23 Jun 2011 16:52:48 +0000 (12:52 -0400)
PR c++/49440
* class.c (set_linkage_according_to_type): Just check TREE_PUBLIC
on the type's name.

From-SVN: r175340

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/rtti/anon-ns1.C [new file with mode: 0644]

index a8fbf7ba1796d267d613e6040dc650d335ddd20d..da39680df0e6ad2632d4ba4d147f2bbd27bac2ee 100644 (file)
@@ -1,5 +1,9 @@
 2011-06-23  Jason Merrill  <jason@redhat.com>
 
+       PR c++/49440
+       * class.c (set_linkage_according_to_type): Just check TREE_PUBLIC
+       on the type's name.
+
        PR c++/49395
        * init.c (build_zero_init_1): Strip cv-quals from scalar types.
 
index 09444fb49ec454292e26dca8c8e47641cca379e0..9e387a6923e7bb595b7b37df49d31e1958a27d6e 100644 (file)
@@ -677,21 +677,10 @@ get_vtable_name (tree type)
    the abstract.  */
 
 void
-set_linkage_according_to_type (tree type, tree decl)
+set_linkage_according_to_type (tree type ATTRIBUTE_UNUSED, tree decl)
 {
-  /* If TYPE involves a local class in a function with internal
-     linkage, then DECL should have internal linkage too.  Other local
-     classes have no linkage -- but if their containing functions
-     have external linkage, it makes sense for DECL to have external
-     linkage too.  That will allow template definitions to be merged,
-     for example.  */
-  if (no_linkage_check (type, /*relaxed_p=*/true))
-    {
-      TREE_PUBLIC (decl) = 0;
-      DECL_INTERFACE_KNOWN (decl) = 1;
-    }
-  else
-    TREE_PUBLIC (decl) = 1;
+  TREE_PUBLIC (decl) = 1;
+  determine_visibility (decl);
 }
 
 /* Create a VAR_DECL for a primary or secondary vtable for CLASS_TYPE.
index dda6cfffeccc0cebd0f4bf71428990c384fad751..ec75281ff211be793fac44451e8730288313fe84 100644 (file)
@@ -1,5 +1,8 @@
 2011-06-23  Jason Merrill  <jason@redhat.com>
 
+       PR c++/49440
+       * g++.dg/rtti/anon-ns1.C: New.
+
        PR c++/49395
        * g++.dg/init/ref18.C: New.
 
diff --git a/gcc/testsuite/g++.dg/rtti/anon-ns1.C b/gcc/testsuite/g++.dg/rtti/anon-ns1.C
new file mode 100644 (file)
index 0000000..fd6f8af
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/49440
+// The typeinfo name for A should start with * so we compare
+// it by address rather than contents.
+
+// { dg-final { scan-assembler "\"\*N\[^\"\]+1AE\"" } }
+
+namespace
+{
+  class A { };
+}
+
+void f()
+{
+  throw A();
+}