rsmith added a comment.

In D124351#4185007 <https://reviews.llvm.org/D124351#4185007>, @aaron.ballman 
wrote:

> In the reproducer from Sam, there are three lambdas: 
> `create::Create<R>([] {});` in `main.cpp`, but this does not participate in 
> AST merging because it's within the main source file
> `BuildWidget<T>([dummy](Widget<T>*) {});` in `create.h`

There should be three of these in total: one from `wrap_create.h`'s textual 
inclusion of `create.h`, one from `instantiate_create.h`'s textual inclusion of 
`create.h`, and one from `instantiate_create.h`'s instantiation of 
`Create<float>`. The first two should get merged together if they're both 
loaded. This runs into some issues, because the local `dummy` variable in the 
two different bodies of the `Create` template don't get merged. In 
rG4a1ccfe8a3cfd4569bc962a38b6117a9a2b8ad21 
<https://reviews.llvm.org/rG4a1ccfe8a3cfd4569bc962a38b6117a9a2b8ad21> I 
attempted to fix that by tracking all the lists of captures from different 
merged copies of the lambdas, so we can find the right way to name (eg) `dummy` 
in the enclosing context. Possibly some more work is needed here, to make 
template instantiation look through that list when instantiating a reference to 
a declaration, in the case where we pick a lambda body from one module but pick 
the enclosing function's body from a different module.

> The first lambda it reads is the one in `InstantiateCreate()`. The next three 
> all have captures of `dummy`; the first two come from the 
> `instantiate_create` module and the last one comes from the `wrap_create` 
> module.

That sounds right to me. One of the ones from `instantiate_create` (the one 
taking `Widget<T>*`, not the one taking `Widget<float>*`) should be merged with 
the one from `wrap_create.h`.



================
Comment at: clang/lib/Sema/SemaCXXScopeSpec.cpp:295-298
+  if (getCurLambda()) {
+    Diag(SuperLoc, diag::err_super_in_lambda_unsupported);
+    return true;
+  }
----------------
Will this also reject `__super` in a local class inside a lambda? That seems 
like something we should still permit.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D124351

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

Reply via email to