[PATCH] c++: FIX_TRUNC_EXPR in tsubst [PR102990]

Jason Merrill jason@redhat.com
Wed Mar 23 20:35:32 GMT 2022


On 3/22/22 19:55, Marek Polacek wrote:
> This is a crash where a FIX_TRUNC_EXPR gets into tsubst_copy_and_build
> where it hits gcc_unreachable ().
> 
> The history of tsubst_copy_and_build/FIX_TRUNC_EXPR is such that it
> was introduced in r181478, but it did the wrong thing, whereupon it
> was turned into gcc_unreachable () in r258821 (see this thread:
> <https://gcc.gnu.org/pipermail/gcc-patches/2018-March/495853.html>).
> 
> In a template, we should never create a FIX_TRUNC_EXPR (that's what
> conv_unsafe_in_template_p is for).  But in this test we are NOT in
> a template when we call digest_nsdmi_init which ends up calling
> convert_like, converting 1.0e+0 to int, so convert_to_integer_1
> gives us a FIX_TRUNC_EXPR.
> 
> But then when we get to parsing f's parameters, we are in a template
> when processing decltype(Helpers{}), and since r268321, when the
> compound literal isn't instantiation-dependent and the type isn't
> type-dependent, finish_compound_literal falls back to the normal
> processing, so it calls digest_init, which does fold_non_dependent_init
> and since the FIX_TRUNC_EXPR isn't dependent, we instantiate and
> therefore crash in tsubst_copy_and_build.

Hmm, we shouldn't be doing fold_non_dependent_init on the result of 
get_nsdmi.  Why does that happen?

> Either I can tweak p_c_e to say that a FIX_TRUNC_EXPR in a template
> is not potentially constant, or I can just remove the whole F_T_E
> case, since:
> a) we could not have created an IMPLICIT_CONV_EXPR here, and
> b) similar code, FLOAT_EXPR, is not handled here, either.
> 
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/11?
> 
> 	PR c++/102990
> 
> gcc/cp/ChangeLog:
> 
> 	* pt.cc (tsubst_copy_and_build) <case FIX_TRUNC_EXPR>: Remove.
> 
> gcc/testsuite/ChangeLog:
> 
> 	* g++.dg/cpp0x/nsdmi-template22.C: New test.
> 	* g++.dg/cpp0x/nsdmi-template23.C: New test.
> ---
>   gcc/cp/pt.cc                                  |  4 ----
>   gcc/testsuite/g++.dg/cpp0x/nsdmi-template22.C | 13 +++++++++++++
>   gcc/testsuite/g++.dg/cpp0x/nsdmi-template23.C | 13 +++++++++++++
>   3 files changed, 26 insertions(+), 4 deletions(-)
>   create mode 100644 gcc/testsuite/g++.dg/cpp0x/nsdmi-template22.C
>   create mode 100644 gcc/testsuite/g++.dg/cpp0x/nsdmi-template23.C
> 
> diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> index 715eea27577..a3becc19290 100644
> --- a/gcc/cp/pt.cc
> +++ b/gcc/cp/pt.cc
> @@ -20184,10 +20184,6 @@ tsubst_copy_and_build (tree t,
>   				templated_operator_saved_lookups (t),
>   				complain|decltype_flag));
>   
> -    case FIX_TRUNC_EXPR:
> -      /* convert_like should have created an IMPLICIT_CONV_EXPR.  */
> -      gcc_unreachable ();
> -
>       case ADDR_EXPR:
>         op1 = TREE_OPERAND (t, 0);
>         if (TREE_CODE (op1) == LABEL_DECL)
> diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-template22.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template22.C
> new file mode 100644
> index 00000000000..4ed2501035c
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template22.C
> @@ -0,0 +1,13 @@
> +// PR c++/102990
> +// { dg-do compile { target c++11 } }
> +
> +struct knob_t {
> +  /* Let's create a FIX_TRUNC_EXPR.  */
> +  int value = 1.0;
> +};
> +
> +struct Helpers {
> +  knob_t inputs;
> +};
> +
> +template<class> void f(decltype(Helpers{}));
> diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-template23.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template23.C
> new file mode 100644
> index 00000000000..240cab4347a
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template23.C
> @@ -0,0 +1,13 @@
> +// PR c++/102990
> +// { dg-do compile { target c++11 } }
> +
> +struct knob_t {
> +  /* Let's create a FLOAT_EXPR.  */
> +  double value = 1UL;
> +};
> +
> +struct Helpers {
> +  knob_t inputs;
> +};
> +
> +template<class> void f(decltype(Helpers{}));
> 
> base-commit: 5d2233f4033dfa37ad88dc2eab138524fe64242e



More information about the Gcc-patches mailing list