xref: /aosp_15_r20/external/pytorch/c10/util/Deprecated.h (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1*da0073e9SAndroid Build Coastguard Worker #pragma once
2*da0073e9SAndroid Build Coastguard Worker 
3*da0073e9SAndroid Build Coastguard Worker /**
4*da0073e9SAndroid Build Coastguard Worker  * This file provides portable macros for marking declarations
5*da0073e9SAndroid Build Coastguard Worker  * as deprecated.  You should generally use C10_DEPRECATED,
6*da0073e9SAndroid Build Coastguard Worker  * except when marking 'using' declarations as deprecated,
7*da0073e9SAndroid Build Coastguard Worker  * in which case you should use C10_DEFINE_DEPRECATED_USING
8*da0073e9SAndroid Build Coastguard Worker  * (due to portability concerns).
9*da0073e9SAndroid Build Coastguard Worker  */
10*da0073e9SAndroid Build Coastguard Worker 
11*da0073e9SAndroid Build Coastguard Worker // Sample usage:
12*da0073e9SAndroid Build Coastguard Worker //
13*da0073e9SAndroid Build Coastguard Worker //    C10_DEPRECATED void bad_func();
14*da0073e9SAndroid Build Coastguard Worker //    struct C10_DEPRECATED BadStruct {
15*da0073e9SAndroid Build Coastguard Worker //      ...
16*da0073e9SAndroid Build Coastguard Worker //    };
17*da0073e9SAndroid Build Coastguard Worker 
18*da0073e9SAndroid Build Coastguard Worker // NB: __cplusplus doesn't work for MSVC, so for now MSVC always uses
19*da0073e9SAndroid Build Coastguard Worker // the "__declspec(deprecated)" implementation and not the C++14
20*da0073e9SAndroid Build Coastguard Worker // "[[deprecated]]" attribute. We tried enabling "[[deprecated]]" for C++14 on
21*da0073e9SAndroid Build Coastguard Worker // MSVC, but ran into issues with some older MSVC versions.
22*da0073e9SAndroid Build Coastguard Worker #if (defined(__cplusplus) && __cplusplus >= 201402L)
23*da0073e9SAndroid Build Coastguard Worker #define C10_DEPRECATED [[deprecated]]
24*da0073e9SAndroid Build Coastguard Worker #define C10_DEPRECATED_MESSAGE(message) [[deprecated(message)]]
25*da0073e9SAndroid Build Coastguard Worker #elif defined(__GNUC__)
26*da0073e9SAndroid Build Coastguard Worker #define C10_DEPRECATED __attribute__((deprecated))
27*da0073e9SAndroid Build Coastguard Worker // TODO Is there some way to implement this?
28*da0073e9SAndroid Build Coastguard Worker #define C10_DEPRECATED_MESSAGE(message) __attribute__((deprecated))
29*da0073e9SAndroid Build Coastguard Worker 
30*da0073e9SAndroid Build Coastguard Worker #elif defined(_MSC_VER)
31*da0073e9SAndroid Build Coastguard Worker #define C10_DEPRECATED __declspec(deprecated)
32*da0073e9SAndroid Build Coastguard Worker #define C10_DEPRECATED_MESSAGE(message) __declspec(deprecated(message))
33*da0073e9SAndroid Build Coastguard Worker #else
34*da0073e9SAndroid Build Coastguard Worker #warning "You need to implement C10_DEPRECATED for this compiler"
35*da0073e9SAndroid Build Coastguard Worker #define C10_DEPRECATED
36*da0073e9SAndroid Build Coastguard Worker #endif
37*da0073e9SAndroid Build Coastguard Worker 
38*da0073e9SAndroid Build Coastguard Worker // Sample usage:
39*da0073e9SAndroid Build Coastguard Worker //
40*da0073e9SAndroid Build Coastguard Worker //    C10_DEFINE_DEPRECATED_USING(BadType, int)
41*da0073e9SAndroid Build Coastguard Worker //
42*da0073e9SAndroid Build Coastguard Worker //   which is the portable version of
43*da0073e9SAndroid Build Coastguard Worker //
44*da0073e9SAndroid Build Coastguard Worker //    using BadType [[deprecated]] = int;
45*da0073e9SAndroid Build Coastguard Worker 
46*da0073e9SAndroid Build Coastguard Worker // technically [[deprecated]] syntax is from c++14 standard, but it works in
47*da0073e9SAndroid Build Coastguard Worker // many compilers.
48*da0073e9SAndroid Build Coastguard Worker #if defined(__has_cpp_attribute)
49*da0073e9SAndroid Build Coastguard Worker #if __has_cpp_attribute(deprecated) && !defined(__CUDACC__)
50*da0073e9SAndroid Build Coastguard Worker #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \
51*da0073e9SAndroid Build Coastguard Worker   using TypeName [[deprecated]] = TypeThingy;
52*da0073e9SAndroid Build Coastguard Worker #endif
53*da0073e9SAndroid Build Coastguard Worker #endif
54*da0073e9SAndroid Build Coastguard Worker 
55*da0073e9SAndroid Build Coastguard Worker #if defined(_MSC_VER)
56*da0073e9SAndroid Build Coastguard Worker #if defined(__CUDACC__)
57*da0073e9SAndroid Build Coastguard Worker // neither [[deprecated]] nor __declspec(deprecated) work on nvcc on Windows;
58*da0073e9SAndroid Build Coastguard Worker // you get the error:
59*da0073e9SAndroid Build Coastguard Worker //
60*da0073e9SAndroid Build Coastguard Worker //    error: attribute does not apply to any entity
61*da0073e9SAndroid Build Coastguard Worker //
62*da0073e9SAndroid Build Coastguard Worker // So we just turn the macro off in this case.
63*da0073e9SAndroid Build Coastguard Worker #if defined(C10_DEFINE_DEPRECATED_USING)
64*da0073e9SAndroid Build Coastguard Worker #undef C10_DEFINE_DEPRECATED_USING
65*da0073e9SAndroid Build Coastguard Worker #endif
66*da0073e9SAndroid Build Coastguard Worker #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \
67*da0073e9SAndroid Build Coastguard Worker   using TypeName = TypeThingy;
68*da0073e9SAndroid Build Coastguard Worker #else
69*da0073e9SAndroid Build Coastguard Worker // [[deprecated]] does work in windows without nvcc, though msc doesn't support
70*da0073e9SAndroid Build Coastguard Worker // `__has_cpp_attribute` when c++14 is supported, otherwise
71*da0073e9SAndroid Build Coastguard Worker // __declspec(deprecated) is used as the alternative.
72*da0073e9SAndroid Build Coastguard Worker #ifndef C10_DEFINE_DEPRECATED_USING
73*da0073e9SAndroid Build Coastguard Worker #if defined(_MSVC_LANG) && _MSVC_LANG >= 201402L
74*da0073e9SAndroid Build Coastguard Worker #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \
75*da0073e9SAndroid Build Coastguard Worker   using TypeName [[deprecated]] = TypeThingy;
76*da0073e9SAndroid Build Coastguard Worker #else
77*da0073e9SAndroid Build Coastguard Worker #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \
78*da0073e9SAndroid Build Coastguard Worker   using TypeName = __declspec(deprecated) TypeThingy;
79*da0073e9SAndroid Build Coastguard Worker #endif
80*da0073e9SAndroid Build Coastguard Worker #endif
81*da0073e9SAndroid Build Coastguard Worker #endif
82*da0073e9SAndroid Build Coastguard Worker #endif
83*da0073e9SAndroid Build Coastguard Worker 
84*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_DEFINE_DEPRECATED_USING) && defined(__GNUC__)
85*da0073e9SAndroid Build Coastguard Worker // nvcc has a bug where it doesn't understand __attribute__((deprecated))
86*da0073e9SAndroid Build Coastguard Worker // declarations even when the host compiler supports it. We'll only use this gcc
87*da0073e9SAndroid Build Coastguard Worker // attribute when not cuda, and when using a GCC compiler that doesn't support
88*da0073e9SAndroid Build Coastguard Worker // the c++14 syntax we checked for above (available in __GNUC__ >= 5)
89*da0073e9SAndroid Build Coastguard Worker #if !defined(__CUDACC__)
90*da0073e9SAndroid Build Coastguard Worker #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \
91*da0073e9SAndroid Build Coastguard Worker   using TypeName __attribute__((deprecated)) = TypeThingy;
92*da0073e9SAndroid Build Coastguard Worker #else
93*da0073e9SAndroid Build Coastguard Worker // using cuda + gcc < 5, neither deprecated syntax is available so turning off.
94*da0073e9SAndroid Build Coastguard Worker #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \
95*da0073e9SAndroid Build Coastguard Worker   using TypeName = TypeThingy;
96*da0073e9SAndroid Build Coastguard Worker #endif
97*da0073e9SAndroid Build Coastguard Worker #endif
98*da0073e9SAndroid Build Coastguard Worker 
99*da0073e9SAndroid Build Coastguard Worker #if !defined(C10_DEFINE_DEPRECATED_USING)
100*da0073e9SAndroid Build Coastguard Worker #warning "You need to implement C10_DEFINE_DEPRECATED_USING for this compiler"
101*da0073e9SAndroid Build Coastguard Worker #define C10_DEFINE_DEPRECATED_USING
102*da0073e9SAndroid Build Coastguard Worker #endif
103