royjacobson added inline comments.

================
Comment at: clang/include/clang/Basic/DiagnosticParseKinds.td:1037-1041
+def err_static_mutable_lambda : Error<
+  "lambda cannot be both mutable and static">;
+def err_static_lambda_captures : Error<
+  "a static lambda cannot have any captures">;
+def note_lambda_captures : Note<"captures declared here">;
----------------
aaron.ballman wrote:
> royjacobson wrote:
> > aaron.ballman wrote:
> > > These are semantic errors, not parsing ones. This means these will be 
> > > diagnosed when parsing the lambda rather than when instantiating it. I 
> > > don't think that matters for the cast of combining `mutable` and 
> > > `static`, but I'm less certain about "have any captures" because of cases 
> > > like:
> > > ```
> > > template <typename... Types>
> > > auto func(Types... Ts) {
> > >   return [Ts...] { return 1; };
> > > }
> > > 
> > > int main() {
> > >   auto lambda = func();
> > > }
> > > ```
> > > I'm pretty sure that lambda has no captures for that call, but it could 
> > > have captures depending on the instantiation.
> > > 
> > > Actually, from some off-list discussion with @erichkeane, even mutable 
> > > and static are a problem in code like:
> > > ```
> > > template <typename Ty>
> > > void func(T t) {
> > >   if constexpr (Something<T>) {
> > >     [](){};
> > >   } else {
> > >     [t](){};
> > >   }
> > > ```
> > > where the lambda is in a discarded statement.
> > > 
> > > So I think these might need to change to be Sema diagnostics (and we 
> > > should add some additional test coverage).
> > From https://eel.is/c++draft/expr.prim.lambda.general#4 
> > 
> > > If the lambda-specifier-seq contains static, there shall be no 
> > > lambda-capture
> > 
> > So this should be a parsing error. Or maybe I don't understand what you're 
> > saying. There are no static lambdas in your examples so I'm not sure how 
> > they're related.
> > 
> > So this should be a parsing error. Or maybe I don't understand what you're 
> > saying. 
> 
> Parsing errors are where the grammar disallows something, generally. The rest 
> are semantic diagnostics (e.g., we can parse the construct just fine, but we 
> diagnose when turning it into an AST node because that's the point at which 
> we have complete information about what we've parsed).
> 
> That said, my concern was mostly around SFINAE situations. My recollection is 
> that SFINAE traps do not cover parsing errors only type substitution errors. 
> So for my first example, I would expect there to be no parsing error despite 
> specifying a capture list because that capture list can be empty when the 
> pack is empty, but we would get a SFINAE diagnostic when rebuilding 
> declaration during template instantiation if the pack was not empty.
> 
> >  There are no static lambdas in your examples so I'm not sure how they're 
> > related.
> 
> Sorry, I was being lazy with my examples and showing more about the capture 
> list. Consider:
> ```
> template <typename... Types>
> auto func(Types... Ts) {
>   return [Ts...] static { return 1; };
> }
> 
> int main() {
>   auto lambda = func();
> }
> ```
> 
Like I said,

> If the lambda-specifier-seq contains static, there shall be no lambda-capture

`Ts...` is still a syntactic `lambda-capture`, even if it's instantiated as an 
empty pack. I don't see how that's not a parsing error.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D133659/new/

https://reviews.llvm.org/D133659

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to