higher-performance wrote:

@erichkeane The `diagnose_if` _token_ is is part of the declaration, but the 
symbols used _inside_ its condition are completely orthogonal. Like as an 
example, say `std::extent` gets deprecated in favor of `std::extent_v`. Then 
you might have something like
```
#include <stddef.h>

namespace std {
template<class> constexpr size_t extent_v = 0;
template<class T, size_t N> constexpr size_t extent_v<T[N]> = N;
template<class T> struct __attribute__((deprecated)) extent { static const 
size_t value = extent_v<T>; };
}

template<class T, size_t N>
__attribute__((deprecated))
__attribute__((diagnose_if(std::extent<T>::value == 1, "", "warning")))
T first(T (&arr)[N]) { return arr[0]; }

int main() {
    int arr[1] = {};
    first(arr);
}
```
There's no reason not to tell users about the deprecation of `std::extent` just 
because `first` is deprecated. `first` has users that need to be migrated away, 
but that's completely independent of `first` itself being migrated away.

P.S. This uncovers another bug: if you swap the `deprecated` and the 
`diagnose_if`, it fires... surely you don't intend it to be order-dependent?

@AaronBallman Thanks for the context! I understand that motivation but I think 
it misses that there is a large difference between a function definition's body 
and a `diagnose_if` attribute on the declaration? There is much less coupling 
between (i.e. they don't come as a bundle nearly as often) a deprecated symbol 
and its `diagnose_if` expression than there is between a deprecated symbol and 
its body. And there is a much stronger and more urgent need to address a 
diagnosis than a deprecation... diagnoses are used for detecting e.g. crashes 
and UB at compile time, whereas deprecations are merely warning that a symbol 
might be removed later.

https://github.com/llvm/llvm-project/pull/222094
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to