bootstrapped and regtested on x86_64.
ChangeLog:
2019-10-04 Kamlesh Kumar <[email protected]>
* 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();
+ }
+