Hi! gimplify_init_ctor_eval_range wasn't gimplifying value, so if it wasn't a gimple val, verification at the end of gimplification would ICE (or with release checking some random pass later on would ICE or misbehave).
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk (so far). 2020-12-21 Jakub Jelinek <ja...@redhat.com> PR c++/98353 * gimplify.c (gimplify_init_ctor_eval_range): Gimplify value before storing it into cref. * g++.dg/opt/pr98353.C: New test. --- gcc/gimplify.c.jj 2020-12-21 08:58:55.710524701 +0100 +++ gcc/gimplify.c 2020-12-21 13:39:20.870168004 +0100 @@ -4607,7 +4607,11 @@ gimplify_init_ctor_eval_range (tree obje gimplify_init_ctor_eval (cref, CONSTRUCTOR_ELTS (value), pre_p, cleared); else - gimplify_seq_add_stmt (pre_p, gimple_build_assign (cref, value)); + { + if (gimplify_expr (&value, pre_p, NULL, is_gimple_val, fb_rvalue) + != GS_ERROR) + gimplify_seq_add_stmt (pre_p, gimple_build_assign (cref, value)); + } /* We exit the loop when the index var is equal to the upper bound. */ gimplify_seq_add_stmt (pre_p, --- gcc/testsuite/g++.dg/opt/pr98353.C.jj 2020-12-21 13:49:51.541802067 +0100 +++ gcc/testsuite/g++.dg/opt/pr98353.C 2020-12-21 13:49:25.127110571 +0100 @@ -0,0 +1,17 @@ +// PR c++/98353 +// { dg-do compile { target c++11 } } + +template <int N> struct A {}; +template <typename T> +struct B +{ + static const int n = 1; + template <class> A <B<T>::n> foo (); + _Complex double c[2], d = 1.0; +}; + +void +bar () +{ + B<int>().foo<int> (); +} Jakub