On Thu, Mar 10, 2016 at 12:56 PM, Jakub Jelinek <ja...@redhat.com> wrote: > On Thu, Mar 10, 2016 at 06:37:32PM +0100, Jakub Jelinek wrote: >> On Thu, Mar 10, 2016 at 12:34:40PM -0500, Patrick Palka wrote: >> > Doesn't this mean that we call initializer_constant_valid_p at each >> > iteration? This would slow down the non-constant case even further. >> > So I wonder if the return value of initializer_constant_valid_p could >> > be cached or something, since it seems like a potentially expensive >> > predicate. >> >> You're right, but I've already committed the patch. I'll write an >> incremental patch and test it. > > So, like this? > > 2016-03-10 Jakub Jelinek <ja...@redhat.com> > > PR c++/70001 > * constexpr.c (cxx_eval_vec_init_1): For pre_init, only > call initializer_constant_valid_p on the first iteration. > > --- gcc/cp/constexpr.c.jj 2016-03-10 12:52:04.000000000 +0100 > +++ gcc/cp/constexpr.c 2016-03-10 18:45:13.416533853 +0100 > @@ -2391,17 +2391,21 @@ cxx_eval_vec_init_1 (const constexpr_ctx > /* Initializing an element using value or default initialization > we just pre-built above. */ > if (pre_init_elt == NULL_TREE) > - pre_init_elt > - = cxx_eval_constant_expression (&new_ctx, init, lval, > - non_constant_p, overflow_p); > - eltinit = pre_init_elt; > - /* Don't reuse the result of cxx_eval_constant_expression > - call if it isn't a constant initializer or if it requires > - relocations. */ > - if (initializer_constant_valid_p (pre_init_elt, > - TREE_TYPE (pre_init_elt)) > - != null_pointer_node) > - pre_init_elt = NULL_TREE; > + { > + eltinit > + = cxx_eval_constant_expression (&new_ctx, init, lval, > + non_constant_p, overflow_p); > + /* Don't reuse the result of cxx_eval_constant_expression > + call if it isn't a constant initializer or if it requires > + relocations. */ > + if (i == 0 > + && (initializer_constant_valid_p (eltinit, > + TREE_TYPE (eltinit)) > + == null_pointer_node)) > + pre_init_elt = eltinit; > + } > + else > + eltinit = pre_init_elt; > } > else > {
Looks fine to me :)