Re: [PATCH] c++: error routines re-entered with uneval lambda [PR124397]

2026-03-11 Thread David Malcolm
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
> > 
> > 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 000..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 
> > +auto f(T) -> decltype([]() { T::invalid; } ()); // { dg-error
> > "'invalid' is not a member of 'int'" }
> > +template
> > +void f(T, ...);
> > +
> > +void d() {
> > +  f(0); // { dg-error "ambiguous" }
> > +}
> > 
> > base-commit: 6c5de6335f5da035911d481c6d52de21596a8bed
> 



Re: [PATCH] c++: error routines re-entered with uneval lambda [PR124397]

2026-03-10 Thread Jason Merrill

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.


-- >8 --
As discussed in

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 000..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 
+auto f(T) -> decltype([]() { T::invalid; } ()); // { dg-error "'invalid' is not a 
member of 'int'" }
+template
+void f(T, ...);
+
+void d() {
+  f(0); // { dg-error "ambiguous" }
+}

base-commit: 6c5de6335f5da035911d481c6d52de21596a8bed