[PATCH][PR83534] C++17: typeinfo for noexcept function lacks noexcept information
Jason Merrill
jason@redhat.com
Mon Oct 21 20:40:00 GMT 2019
On 10/4/19 8:17 AM, kamlesh kumar wrote:
> bootstrapped and regtested on x86_64.
>
> ChangeLog:
> 2019-10-04 Kamlesh Kumar <kamleshbhalui@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.
Thanks! Word wrap from gmail mangled your patch a bit, so next time
please attach it instead, or see
https://git-scm.com/docs/git-format-patch#_mua_specific_hints
It looks like you don't have a copyright assignment on file; this patch
is small enough not to need one, but larger patches will. The form for
starting this process can be found at
http://git.savannah.gnu.org/cgit/gnulib.git/plain/doc/Copyright/request-assign.future
> 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);
Since what we're trying to do is strip cv-qualifiers, we might as well
use the cv_unqualified function.
> /* 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));
And the TYPE_MAIN_VARIANT here was redundant, so we can just drop it.
> 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();
This failed for me due to using abort without #include <stdlib.h>
Here's what I'm committing:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 83434.diff
Type: text/x-patch
Size: 2361 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20191021/157cdd06/attachment.bin>
More information about the Gcc-patches
mailing list