From 6e4be1fa8c986cb0e12fb2fed62790dd838f38ed Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Sun, 22 Oct 2006 16:07:41 +0000 Subject: [PATCH] re PR libstdc++/20647 (Wrong typeid for incomplete types) cp/ PR c++/20647 * rtti.c (tinfo_base_init): The type info string is always global. testsuite/ PR c++/20647 * g++.dg/abi/rtti3.C: New. From-SVN: r117957 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/rtti.c | 8 +------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/abi/rtti3.C | 13 +++++++++++++ 4 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/abi/rtti3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a0cfbc0bf39..0e6314c0ef6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2006-10-22 Nathan Sidwell + + PR c++/20647 + * rtti.c (tinfo_base_init): The type info string is always global. + 2006-10-20 Lee Millward Mark Mitchell diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index 0cb825dd199..077d3e0b694 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -824,13 +824,7 @@ tinfo_base_init (tinfo_s *ti, tree target) TREE_STATIC (name_decl) = 1; DECL_EXTERNAL (name_decl) = 0; DECL_TINFO_P (name_decl) = 1; - if (involves_incomplete_p (target)) - { - TREE_PUBLIC (name_decl) = 0; - DECL_INTERFACE_KNOWN (name_decl) = 1; - } - else - set_linkage_according_to_type (target, name_decl); + set_linkage_according_to_type (target, name_decl); import_export_decl (name_decl); DECL_INITIAL (name_decl) = name_string; mark_used (name_decl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b55cd7c8f8b..1d6b02b86af 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-10-22 Nathan Sidwell + + PR c++/20647 + * g++.dg/abi/rtti3.C: New. + 2006-10-21 Uros Bizjak PR middle-end/28252 diff --git a/gcc/testsuite/g++.dg/abi/rtti3.C b/gcc/testsuite/g++.dg/abi/rtti3.C new file mode 100644 index 00000000000..4c118d1762a --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/rtti3.C @@ -0,0 +1,13 @@ +// PR 20647, we must emit the typeinfo's string as weak, but not the +// necessarily the type info object + +// { dg-require-weak "" } +// { dg-final { scan-assembler ".weak\[ \t\]_?_ZTSPP1A" } } +// { dg-final { scan-assembler-not ".weak\[ \t\]_?_ZTIPP1A" } } + +struct A; + +void Foo () +{ + throw (A **)0; +}