From: Kamlesh Kumar Date: Mon, 21 Oct 2019 20:19:28 +0000 (+0000) Subject: PR c++/83434 - typeinfo for noexcept function lacks noexcept information X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=debf1662d1f0cbe54198119f1a74baf46ad6a41a;p=gcc.git PR c++/83434 - typeinfo for noexcept function lacks noexcept information 2019-10-21 Kamlesh Kumar * rtti.c (get_tinfo_decl_dynamic): Do not call TYPE_MAIN_VARIANT for function. (get_typeid): Likewise. * g++.dg/rtti/pr83534.C: New Test. Reviewed-by: Jason Merrill Co-Authored-By: Jason Merrill From-SVN: r277270 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 19a687a4b79..4218901b854 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2019-10-21 Kamlesh Kumar + Jason Merrill + + 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 * parser.c (cp_parser_class_head): Improve error recovery upon diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index eb1b062a49b..c905799481e 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 00000000000..af5f02ebb92 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/pr83534.C @@ -0,0 +1,13 @@ +// { dg-options "-std=c++17" } +// { dg-do run } + +#include + +void f1(); +void f2() noexcept; +int main() { + if((typeid(void()) == typeid(void ()noexcept)) + || (typeid(&f1) == typeid(&f2)) + || (typeid(f1) == typeid(f2))) + __builtin_abort(); +}