On Wed, Nov 19, 2025 at 02:48:47PM -0500, Marek Polacek wrote:
> On Wed, Nov 19, 2025 at 05:03:05PM +0100, Daniele Sahebi wrote:
> > Fixed the issues from the previous version.
> > Bootstrapped and regtested on x86_64-linux-unknown-gnu, OK?
> > ---
> > 
> > Currently, build_over_call calls build_cplus_new in template decls, 
> > generating
> > a TARGET_EXPR that it then passes to fold_non_dependent_expr, which ends up
> > calling tsubst_expr, and since tsubst_expr doesn't handle TARGET_EXPRs, it 
> > ICEs.
> > 
> > Since there is no way for this code path to be executed without causing an
> > ICE, I believe it can be removed.
> 
> FWIW, prior to r14-4796 we didn't ICE because tsubst_copy would immediately
> return because args was null.  But tsubst_expr doesn't do that.
>  
> >     PR c++/122658
> > 
> > gcc/cp/ChangeLog:
> > 
> >     * call.cc (build_over_call): Remove if block that ICEs.
> 
> Let's say something like "Don't call build_cplus_new for consteval 
> constructors."
> instead.

I'll switch to something like "Don't call build_cplus_new in template
declarations", since that's the actual problem that causes the ICE.

> 
> Patch LGTM (aside the DCO business).

Is there anything else I should do for DCO? From what I read
on the wiki, the Signed-off-by tag is enough.

> 
> > gcc/testsuite/ChangeLog:
> > 
> >     * g++.dg/cpp2a/consteval42.C: New test.
> > 
> > Co-authored-by: Jakub Jelinek <[email protected]>
> > Signed-off-by: Daniele Sahebi <[email protected]>
> > ---
> >  gcc/cp/call.cc                           | 13 +++----------
> >  gcc/testsuite/g++.dg/cpp2a/consteval42.C | 21 +++++++++++++++++++++
> >  2 files changed, 24 insertions(+), 10 deletions(-)
> >  create mode 100644 gcc/testsuite/g++.dg/cpp2a/consteval42.C
> > 
> > diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
> > index f80d597b3394..7985c2d5e1bb 100644
> > --- a/gcc/cp/call.cc
> > +++ b/gcc/cp/call.cc
> > @@ -10328,18 +10328,11 @@ build_over_call (struct z_candidate *cand, int 
> > flags, tsubst_flags_t complain)
> >     TREE_NO_WARNING (expr) = true;
> >        if (immediate_invocation_p (fn))
> >     {
> > -     tree obj_arg = NULL_TREE, exprimm = expr;
> > +     tree obj_arg = NULL_TREE;
> >       if (DECL_CONSTRUCTOR_P (fn))
> >         obj_arg = first_arg;
> > -     if (obj_arg
> > -         && is_dummy_object (obj_arg)
> > -         && !type_dependent_expression_p (obj_arg))
> > -       {
> > -         exprimm = build_cplus_new (DECL_CONTEXT (fn), expr, complain);
> > -         obj_arg = NULL_TREE;
> > -       }
> >       /* Look through *(const T *)&obj.  */
> > -     else if (obj_arg && INDIRECT_REF_P (obj_arg))
> > +     if (obj_arg && INDIRECT_REF_P (obj_arg))
> >         {
> >           tree addr = TREE_OPERAND (obj_arg, 0);
> >           STRIP_NOPS (addr);
> > @@ -10351,7 +10344,7 @@ build_over_call (struct z_candidate *cand, int 
> > flags, tsubst_flags_t complain)
> >                 obj_arg = TREE_OPERAND (addr, 0);
> >             }
> >         }
> > -     fold_non_dependent_expr (exprimm, complain,
> > +     fold_non_dependent_expr (expr, complain,
> >                                /*manifestly_const_eval=*/true,
> >                                obj_arg);
> >     }
> > diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval42.C 
> > b/gcc/testsuite/g++.dg/cpp2a/consteval42.C
> > new file mode 100644
> > index 000000000000..c75bb49f11e7
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/cpp2a/consteval42.C
> > @@ -0,0 +1,21 @@
> > +// PR c++/122658
> > +// { dg-do compile { target c++20 } }
> > +
> > +struct S {
> > +  consteval S () noexcept { }
> > +  consteval S (const S &) = default;
> > +};
> > +
> > +template <typename T>
> > +S
> > +foo ()
> > +{
> > +  constexpr auto s = S();
> > +  return s;
> > +}
> > +
> > +S
> > +bar ()
> > +{
> > +  return foo <int> ();
> > +}
> > -- 
> > 2.47.3
> > 
> 
> Marek
> 

Reply via email to