bootstrapped and regtested on x86_64. ChangeLog: 2019-10-04 Kamlesh Kumar <kamleshbha...@gmail.com> * rtti.c (get_tinfo_decl_dynamic): Do not call TYPE_MAIN_VARIANT for function. (get_typeid): Likewise. * g++.dg/rtti/pr83534.C: New Test.
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index eb1b062a49b..8467e77f7ac 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -276,7 +276,9 @@ get_tinfo_decl_dynamic (tree exp, tsubst_flags_t complain) type = non_reference (unlowered_expr_type (exp)); /* Peel off cv qualifiers. */ - type = TYPE_MAIN_VARIANT (type); + if (TREE_CODE (type) != FUNCTION_TYPE + || cxx_dialect < cxx17) + type = TYPE_MAIN_VARIANT (type); /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */ if (CLASS_TYPE_P (type) || type == unknown_type_node @@ -298,6 +300,8 @@ get_tinfo_decl_dynamic (tree exp, tsubst_flags_t complain) t = build_vtbl_ref (exp, index); t = convert (type_info_ptr_type, t); } + else if(TREE_CODE (type) == FUNCTION_TYPE) + t = get_tinfo_ptr (type); else /* Otherwise return the type_info for the static type of the expr. */ t = get_tinfo_ptr (TYPE_MAIN_VARIANT (type)); @@ -518,7 +522,9 @@ get_typeid (tree type, tsubst_flags_t complain) /* The top-level cv-qualifiers of the lvalue expression or the type-id that is the operand of typeid are always ignored. */ - type = TYPE_MAIN_VARIANT (type); + if (TREE_CODE (type) != FUNCTION_TYPE + || cxx_dialect < cxx17) + type = TYPE_MAIN_VARIANT (type); /* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */ if (CLASS_TYPE_P (type) || type == unknown_type_node ukallapa@ala-salim-lx1$git diff -p --staged diff --git a/gcc/testsuite/g++.dg/rtti/pr83534.C b/gcc/testsuite/g++.dg/rtti/pr83534.C new file mode 100644 index 00000000000..405ea5c2af4 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/pr83534.C @@ -0,0 +1,14 @@ +// { dg-options "-std=c++17" } +// { dg-do run } + +#include <typeinfo> +void f1(); +void f2() noexcept; +int main() { + +if((typeid(void()) == typeid(void ()noexcept)) + || (typeid(&f1) == typeid(&f2)) + || (typeid(f1) == typeid(f2))) + abort(); + } +