c++: ICE with real-to-int conversion in template [PR97973]
authorMarek Polacek <polacek@redhat.com>
Wed, 3 Mar 2021 23:37:49 +0000 (18:37 -0500)
committerMarek Polacek <polacek@redhat.com>
Wed, 17 Mar 2021 23:26:25 +0000 (19:26 -0400)
commit40465293cd780aa82dcae75dfcfb1449d8c0561e
treeafe709bf81a04c581dad3b8c99bc3617bf8a93df
parentbe246ac2d26e1cb072f205bf97d5eac150220f3f
c++: ICE with real-to-int conversion in template [PR97973]

In this test we are building a call in a template, but since neither
the function nor any of its arguments are dependent, we go down the
normal path in finish_call_expr.  convert_arguments sees that we're
binding a reference to int to double and therein convert_to_integer
creates a FIX_TRUNC_EXPR.  Later, we call check_function_arguments
which folds the arguments, and, in a template, fold_for_warn calls
fold_non_dependent_expr.  But tsubst_copy_and_build should not see
a FIX_TRUNC_EXPR (see the patch discussed in
<https://gcc.gnu.org/pipermail/gcc-patches/2018-March/496183.html>)
or we crash.

So let's not create a FIX_TRUNC_EXPR in a template in the first place
and instead use IMPLICIT_CONV_EXPR.

gcc/cp/ChangeLog:

PR c++/97973
* call.c (conv_unsafe_in_template_p): New.
(convert_like): Use it.

gcc/testsuite/ChangeLog:

PR c++/97973
* g++.dg/conversion/real-to-int1.C: New test.
gcc/cp/call.c
gcc/testsuite/g++.dg/conversion/real-to-int1.C [new file with mode: 0644]