[clang] [WIP][clang]: Implement a conditional lifetimebound_if builtin. (PR #125520)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Feb 7 12:50:53 PST 2025
higher-performance wrote:
> it would be great to get something that "magically" works with a single attribute and does not need complicated compile-time computations. If we cannot get that, the approach with `clang::lifetimebound_like` seems like the second-best alternative.
The closest universal solution I can think of is something like the following, assuming we do proper bikeshedding for the name:
```
template<class... Args>
reference emplace_back(Args&&... args)
[[clang::diagnosis_body(EXPRESSION_REPRESENTING_A_FAKE_BODY)]];
```
The faux body could then be used for diagnosis purposes -- and the contract would be that it would never affect codegen.
This would also leave the door open to further extensions in the future. e.g., `[[clang::diagnosis_body(..., "lifetime_body_key_1")]] [[clang::lifetime_diagnosis_like("lifetime_body_key_1")]]`, to allow different analyses to share the same bodies.
> > I think even [[clang::diagnose_if(...)]] can cause template instantiations that change program behavior.
>
> Unrelated, but I'd be curious to see those if you have any examples. I thought that maybe SFINAE could cause this, but at least [in simple examples](https://gcc.godbolt.org/z/5EeMhr4nW) `diagnose_if` does not affect overloading.
https://godbolt.org/z/xozfs18Ta (but looks like the `[[clang::diagnose_if(...)]]` syntax doesn't actually work for that attribute, only `__attribute__` syntax works)
Note that _any_ attribute that can result in template instantiations could cause this. (Not sure if that's a necessary condition, but it's sufficient.)
https://github.com/llvm/llvm-project/pull/125520
More information about the cfe-commits
mailing list