On Thu, Mar 1, 2018 at 11:28 AM, Marek Polacek <pola...@redhat.com> wrote: > On Wed, Feb 28, 2018 at 02:01:06PM -0500, Jason Merrill wrote: >> On Wed, Feb 28, 2018 at 8:57 AM, Marek Polacek <pola...@redhat.com> wrote: >> > On Wed, Feb 28, 2018 at 09:11:24AM -0300, Alexandre Oliva wrote: >> >> Evaluation of constant expressions, such as those passed to >> >> static_assert, ICEd when encountering IMPLICIT_CONV_EXPRs. >> >> >> >> Handle them like CONVERT_EXPR and NOP_EXPR. >> >> >> >> Regstrapped on x86_64- and i686-linux-gnu. Ok to install? >> >> >> >> for gcc/cp/ChangeLog >> >> >> >> PR c++/84596 >> >> * constexpr.c (cxx_eval_constant_expression): Handle >> >> IMPLICIT_CONV_EXPR. >> >> >> >> for gcc/testsuite/ChangeLog >> >> >> >> PR c++/84596 >> >> * g++.dg/cpp0x/pr84596.C: New. >> >> --- >> >> gcc/cp/constexpr.c | 1 + >> >> gcc/testsuite/g++.dg/cpp0x/pr84596.C | 7 +++++++ >> >> 2 files changed, 8 insertions(+) >> >> create mode 100644 gcc/testsuite/g++.dg/cpp0x/pr84596.C >> >> >> >> diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c >> >> index 4bbdbf434877..d38e2d83ae8c 100644 >> >> --- a/gcc/cp/constexpr.c >> >> +++ b/gcc/cp/constexpr.c >> >> @@ -4549,6 +4549,7 @@ cxx_eval_constant_expression (const constexpr_ctx >> >> *ctx, tree t, >> >> non_constant_p, overflow_p); >> >> break; >> >> >> >> + case IMPLICIT_CONV_EXPR: >> >> case CONVERT_EXPR: >> >> case VIEW_CONVERT_EXPR: >> >> case NOP_EXPR: >> > >> > I don't think it's correct to handle template codes here; they shouldn't >> > have gotten to cxx_eval_constant_expression in the first place. Usually >> > they're substituted in instantiate_non_dependent_expr_internal e.g. via >> > calling fold_non_dependent_expr. So I guess we need to find out how >> > IMPLICIT_CONV_EXPR has gotten there. >> >> Agreed. > > Here's my take on this; Alex, sorry for interfering. > > The problem is that perform_implicit_conversion_flags in finish_static_assert > produces "implicit_conv_expr <c>" where "c" is a PARM_DECL. Subsequent > fold_non_dependent_expr is supposed to substitute that implicit_conv_expr but > doesn't because the expression is not is_nondependent_constant_expression -- > a PARM_DECL is only considered a potentially constant expression if NOW is > false, which it isn't. But the require_potential_rvalue_constant_expression > call that follows uses NOW = false. So I think we need the following. > > Bootstrapped/regtested on x86_64-linux, ok for trunk? > > 2018-03-01 Marek Polacek <pola...@redhat.com> > > PR c++/84596 > * constexpr.c (require_rvalue_constant_expression): New function. > * cp-tree.h: Declare it. > * semantics.c (finish_static_assert): Use it instead of > require_potential_rvalue_constant_expression. > > * g++.dg/cpp0x/static_assert14.C: New test.
OK. Jason