On Fri, 4 Apr 2025, Jason Merrill wrote:

> On 4/4/25 4:35 PM, Patrick Palka wrote:
> > On Fri, 4 Apr 2025, Jason Merrill wrote:
> > 
> > > Tested x86_64-pc-linux-gnu, applying to trunk.
> > > 
> > > -- 8< --
> > > 
> > > Since r10-7441 we set processing_template_decl in a requires-expression so
> > > that we can use tsubst_expr to evaluate the requirements, but that
> > > confuses
> > > lambdas terribly; begin_lambda_type silently returns error_mark_node and
> > > we
> > > continue into other failures.  This patch clears processing_template_decl
> > > again while we're defining the closure and op() function, so it only
> > > remains
> > > set while parsing the introducer (i.e. any init-captures) and building the
> > > resulting object.  This properly avoids trying to create another lambda in
> > > tsubst_lambda_expr.
> > 
> > I wonder if we couldn't just set current_template_parms to a dummy
> > template parameter list if it's empty when parsing a requires-expr?
> 
> I don't see the benefit of making a requires-expr even more template-like;
> IIUC the change to set processing_template_decl was largely for convenience
> because the implementation expects template trees, I don't think it
> corresponds to anything in the language.
> 
> https://eel.is/c++draft/expr#prim.req.general-note-1

Personally, I wouldn't mind it making it more template-like, and IMHO
their current specification kind of forces them to be template-like in
our templated vs non-templated tree dichotomy.

That's because requires-exprs are special in that nested-requirements
are always templated (since constraints are always templated, I think),
and nested-requirements can contain requires-exprs.  So either we need
to distinguish between templated and non-templated requires-exprs
outside a template context when evaluating them (i.e. the former still
need to be tsubst'd, the latter only need other kinds of checks e.g.
convert_to_void and return-type-requirement checks), or we assume
requires-exprs are always templated; IMHO the latter fits better
with our templated vs non-templated tree dichotomy.

Note even if cp_parser_requires_expression didn't set
processing_template_decl, IIUC we would still mishandle e.g.

  requires { requires requires { []{}; } };

without your patch.

> 
> Jason
> 
> 

Reply via email to