dougsonos wrote:

> Since you mention it is attached to the type, is it mangled then differently. 
> e.g.:
> Does the above f calls to 2 different functions?

This example is problematic because in this construct, `g` and `h` degenerate 
into function pointers, and inference doesn't work across function pointers. 
The RFC shows a technique for avoiding this (search for `nolock_fp`).

But let's try this:

```
template <class T>
void f(T a) [[clang::nolock]] { a(); }

void m() {
        auto g = []() [[clang::nolock]] {};
        auto h = []() [[clang::nolock(false)]] {};

        f(g);
        f(h);
}

This showed:
- in `Sema::CheckAddCallableWithEffects`, I really do want to keep that line of 
code that skips functions in dependent contexts; otherwise `f` gets analyzed 
with some sort of placeholder type.
- there are two template instantiations of `f` (according to logging), for the 
separate lambdas
- the bug where `AttributedType` sugar gets lost on lambdas (when the 
"inferred" return type gets converted to a concrete one) happens here and the 
`nolock(false)` attribute is lost from `h`.

That bug defeats `h`'s wish to not have `nolock` inferred on it, so the 
analysis decides:
- `g` is verified safe
- `f<g>` is verified safe
- `h` is inferred safe
- `f(h)` is verified safe
- `m` is safe

Good questions, thanks. I'm working on the others.

https://github.com/llvm/llvm-project/pull/84983
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to