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