On Fri, Jan 12, 2018 at 05:09:24PM -0500, David Malcolm wrote: > PR c++/83814 reports an ICE introduced by the location wrapper patch > (r256448), affecting certain memset calls within templates.
Note, I think this issue sadly affects a lot of code, so it is quite urgent. That said, wonder if we really can't do any folding when processing_template_decl, could we e.g. do at least maybe_constant_value, or fold if the expression is not type nor value dependent? BTW, never know if cp_fold_rvalue is a superset of maybe_constant_value or not. > --- a/gcc/cp/expr.c > +++ b/gcc/cp/expr.c > @@ -315,3 +315,25 @@ mark_exp_read (tree exp) > } > } > > +/* Fold X for consideration by one of the warning functions when checking > + whether an expression has a constant value. */ > + > +tree > +fold_for_warn (tree x) > +{ > + /* C++ implementation. */ > + > + /* It's not generally safe to fold inside of a template, so > + merely strip any location wrapper and read through enum values. */ > + if (processing_template_decl) > + { > + STRIP_ANY_LOCATION_WRAPPER (x); > + > + if (TREE_CODE (x) == CONST_DECL) > + x = DECL_INITIAL (x); > + > + return x; > + } > + > + return c_fully_fold (x, /*for_init*/false, /*maybe_constp*/NULL); > +} Jakub