[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