On Mon, Feb 26, 2018 at 12:42 PM, Marek Polacek <pola...@redhat.com> wrote: > The original testcase was invalid but I added seconds's constructor and made > time_to_wait inline and now the testcase is accepted by clang++. > > But we ICE in replace_placeholders_r because we were checking TREE_CONSTANT > on a type. With this patch we accept the code without crashing. (We require > time_to_wait to be inline but clang++ does not.) > > Bootstrapped/regtested on x86_64-linux, ok for trunk? > > 2018-02-26 Marek Polacek <pola...@redhat.com> > > PR c++/84325 > * tree.c (replace_placeholders_r): Only check TREE_CONSTANT on > non-types. > > * g++.dg/cpp1z/pr84325.C: New test. > > diff --git gcc/cp/tree.c gcc/cp/tree.c > index 39c1ef28b2d..298517ff83a 100644 > --- gcc/cp/tree.c > +++ gcc/cp/tree.c > @@ -3091,7 +3091,7 @@ replace_placeholders_r (tree* t, int* walk_subtrees, > void* data_) > replace_placeholders_t *d = static_cast<replace_placeholders_t*>(data_); > tree obj = d->obj; > > - if (TREE_CONSTANT (*t)) > + if (!TYPE_P (*t) && TREE_CONSTANT (*t))
I'd make this if (TYPE_P (*t) || TREE_CONSTANT (*t)) so we don't keep walking into types. OK with that change. Jason