[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