diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-11-01 22:50:32 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-11-01 22:50:32 +0000 |
commit | c782ab19d44512c14b3cfe864179e50d6181a074 (patch) | |
tree | 7d1eb8d75da2fff336b190393af33c47c0b7dfbe /gcc/cp/rtti.c | |
parent | 1bf8cfe3cbd7414b17b6f2bb3c7bb7099822d647 (diff) | |
download | gcc-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.c | 16 |
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; } |