aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/rtti.c8
-rw-r--r--gcc/testsuite/g++.dg/rtti/pr83534.C13
3 files changed, 25 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 19a687a..4218901 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2019-10-21 Kamlesh Kumar <kamleshbhalui@gmail.com>
+ Jason Merrill <jason@redhat.com>
+
+ PR c++/83434 - typeinfo of noexcept function
+ * rtti.c (get_tinfo_decl_dynamic): Do not call
+ TYPE_MAIN_VARIANT for function.
+ (get_typeid): Likewise.
+
2019-10-21 Paolo Carlini <paolo.carlini@oracle.com>
* parser.c (cp_parser_class_head): Improve error recovery upon
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index eb1b062..c905799 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -272,11 +272,11 @@ get_tinfo_decl_dynamic (tree exp, tsubst_flags_t complain)
exp = resolve_nondeduced_context (exp, complain);
- /* peel back references, so they match. */
+ /* Peel back references, so they match. */
type = non_reference (unlowered_expr_type (exp));
/* Peel off cv qualifiers. */
- type = TYPE_MAIN_VARIANT (type);
+ type = cv_unqualified (type);
/* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */
if (CLASS_TYPE_P (type) || type == unknown_type_node
@@ -300,7 +300,7 @@ get_tinfo_decl_dynamic (tree exp, tsubst_flags_t complain)
}
else
/* Otherwise return the type_info for the static type of the expr. */
- t = get_tinfo_ptr (TYPE_MAIN_VARIANT (type));
+ t = get_tinfo_ptr (type);
return cp_build_fold_indirect_ref (t);
}
@@ -518,7 +518,7 @@ 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);
+ type = cv_unqualified (type);
/* For UNKNOWN_TYPEs call complete_type_or_else to get diagnostics. */
if (CLASS_TYPE_P (type) || type == unknown_type_node
diff --git a/gcc/testsuite/g++.dg/rtti/pr83534.C b/gcc/testsuite/g++.dg/rtti/pr83534.C
new file mode 100644
index 0000000..af5f02e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/rtti/pr83534.C
@@ -0,0 +1,13 @@
+// { 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)))
+ __builtin_abort();
+}