summaryrefslogtreecommitdiff
path: root/gcc/cp/rtti.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2007-11-01 22:50:32 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2007-11-01 22:50:32 +0000
commitc782ab19d44512c14b3cfe864179e50d6181a074 (patch)
tree7d1eb8d75da2fff336b190393af33c47c0b7dfbe /gcc/cp/rtti.c
parent1bf8cfe3cbd7414b17b6f2bb3c7bb7099822d647 (diff)
downloadgcc-c782ab19d44512c14b3cfe864179e50d6181a074.tar.gz
PR c++/32260
* rtti.c (enum_tinfo_kind): Fix TK_TYPE_INFO_TYPE comment. (typeid_ok_p): Use the same alias set for abi::__type_info_pseudo as for std::type_info. * g++.dg/rtti/typeid7.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@129835 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/rtti.c')
-rw-r--r--gcc/cp/rtti.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index 9d2ffdf2823..92cddbfb37f 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -79,7 +79,7 @@ DEF_VEC_ALLOC_O(tinfo_s,gc);
typedef enum tinfo_kind
{
- TK_TYPE_INFO_TYPE, /* std::type_info */
+ TK_TYPE_INFO_TYPE, /* abi::__type_info_pseudo */
TK_BASE_TYPE, /* abi::__base_class_type_info */
TK_BUILTIN_TYPE, /* abi::__fundamental_type_info */
TK_ARRAY_TYPE, /* abi::__array_type_info */
@@ -264,6 +264,8 @@ get_tinfo_decl_dynamic (tree exp)
static bool
typeid_ok_p (void)
{
+ tree pseudo_type_info, type_info_type;
+
if (! flag_rtti)
{
error ("cannot use typeid with -fno-rtti");
@@ -276,6 +278,18 @@ typeid_ok_p (void)
return false;
}
+ pseudo_type_info
+ = VEC_index (tinfo_s, tinfo_descs, TK_TYPE_INFO_TYPE)->type;
+ type_info_type = TYPE_MAIN_VARIANT (const_type_info_type_node);
+
+ /* Make sure abi::__type_info_pseudo has the same alias set
+ as std::type_info. */
+ if (! TYPE_ALIAS_SET_KNOWN_P (pseudo_type_info))
+ TYPE_ALIAS_SET (pseudo_type_info) = get_alias_set (type_info_type);
+ else
+ gcc_assert (TYPE_ALIAS_SET (pseudo_type_info)
+ == get_alias_set (type_info_type));
+
return true;
}