On Wed, 2026-03-11 at 01:10 -0400, Jason Merrill wrote:
> On 3/9/26 9:36 AM, Marek Polacek wrote:
> > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk?
> 
> LGTM, but I'd like David to comment as well.

Thanks, looks good to me.

Dave

> 
> > -- >8 --
> > As discussed in
> > <https://gcc.gnu.org/pipermail/gcc-patches/2026-March/710075.html>
> > we shouldn't override complain with tf_warning_or_error when we are
> > emitting cp_printer diagnostics.  We had no way to check that so
> > this patch adds emitting_diagnostic_p.
> > 
> >     PR c++/124397
> > 
> > gcc/cp/ChangeLog:
> > 
> >     * pt.cc (tsubst_lambda_expr): Don't override complain when
> > emitting
> >     diagnostics.
> > 
> > gcc/ChangeLog:
> > 
> >     * diagnostic.h (emitting_diagnostic_p): New.
> >     * diagnostics/context.h (context::emitting_diagnostic_p):
> > New.
> > 
> > gcc/testsuite/ChangeLog:
> > 
> >     * g++.dg/cpp2a/lambda-uneval30.C: New test.
> > ---
> >   gcc/cp/pt.cc                                 |  3 ++-
> >   gcc/diagnostic.h                             |  6 ++++++
> >   gcc/diagnostics/context.h                    |  5 +++++
> >   gcc/testsuite/g++.dg/cpp2a/lambda-uneval30.C | 11 +++++++++++
> >   4 files changed, 24 insertions(+), 1 deletion(-)
> >   create mode 100644 gcc/testsuite/g++.dg/cpp2a/lambda-uneval30.C
> > 
> > diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> > index ddf492b3435..3a9fc488e72 100644
> > --- a/gcc/cp/pt.cc
> > +++ b/gcc/cp/pt.cc
> > @@ -21049,7 +21049,8 @@ tsubst_lambda_expr (tree t, tree args,
> > tsubst_flags_t complain, tree in_decl)
> >         /* [temp.deduct] A lambda-expression appearing in a
> > function type or a
> >      template parameter is not considered part of the
> > immediate context for
> >      the purposes of template argument deduction. */
> > -      complain = tf_warning_or_error;
> > +      if (!emitting_diagnostic_p ())
> > +   complain = tf_warning_or_error;
> >   
> >         tree saved = DECL_SAVED_TREE (oldfn);
> >         if (TREE_CODE (saved) == BIND_EXPR && BIND_EXPR_BODY_BLOCK
> > (saved))
> > diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h
> > index da9eb7d8c3c..37e48d77187 100644
> > --- a/gcc/diagnostic.h
> > +++ b/gcc/diagnostic.h
> > @@ -272,6 +272,12 @@ option_unspecified_p (diagnostics::option_id
> > opt_id)
> >     return global_dc->option_unspecified_p (opt_id);
> >   }
> >   
> > +inline bool
> > +emitting_diagnostic_p ()
> > +{
> > +  return global_dc->emitting_diagnostic_p ();
> > +}
> > +
> >   namespace diagnostics {
> >   
> >   /* Compute the number of digits in the decimal representation of
> > an integer.  */
> > diff --git a/gcc/diagnostics/context.h b/gcc/diagnostics/context.h
> > index 514ff1e68f9..dcfb80760b6 100644
> > --- a/gcc/diagnostics/context.h
> > +++ b/gcc/diagnostics/context.h
> > @@ -313,6 +313,11 @@ public:
> >       return m_option_classifier.option_unspecified_p (opt_id);
> >     }
> >   
> > +  bool emitting_diagnostic_p () const
> > +  {
> > +    return m_lock > 0;
> > +  }
> > +
> >     bool emit_diagnostic_with_group (enum kind kind,
> >                                rich_location &richloc,
> >                                const metadata *metadata,
> > diff --git a/gcc/testsuite/g++.dg/cpp2a/lambda-uneval30.C
> > b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval30.C
> > new file mode 100644
> > index 00000000000..f6beb12faab
> > --- /dev/null
> > +++ b/gcc/testsuite/g++.dg/cpp2a/lambda-uneval30.C
> > @@ -0,0 +1,11 @@
> > +// PR c++/124397
> > +// { dg-do compile { target c++20 } }
> > +
> > +template <class T>
> > +auto f(T) -> decltype([]() { T::invalid; } ()); // { dg-error
> > "'invalid' is not a member of 'int'" }
> > +template<typename T>
> > +void f(T, ...);
> > +
> > +void d() {
> > +  f(0); // { dg-error "ambiguous" }
> > +}
> > 
> > base-commit: 6c5de6335f5da035911d481c6d52de21596a8bed
> 

Reply via email to