| #pragma once |
| |
| /** |
| * This file provides portable macros for marking declarations |
| * as deprecated. You should generally use C10_DEPRECATED, |
| * except when marking 'using' declarations as deprecated, |
| * in which case you should use C10_DEFINE_DEPRECATED_USING |
| * (due to portability concerns). |
| */ |
| |
| // Sample usage: |
| // |
| // C10_DEPRECATED void bad_func(); |
| // struct C10_DEPRECATED BadStruct { |
| // ... |
| // }; |
| |
| // NB: __cplusplus doesn't work for MSVC, so for now MSVC always uses |
| // the "__declspec(deprecated)" implementation and not the C++14 |
| // "[[deprecated]]" attribute. We tried enabling "[[deprecated]]" for C++14 on |
| // MSVC, but ran into issues with some older MSVC versions. |
| #if (defined(__cplusplus) && __cplusplus >= 201402L) |
| #define C10_DEPRECATED [[deprecated]] |
| #define C10_DEPRECATED_MESSAGE(message) [[deprecated(message)]] |
| #elif defined(__GNUC__) |
| #define C10_DEPRECATED __attribute__((deprecated)) |
| // TODO Is there some way to implement this? |
| #define C10_DEPRECATED_MESSAGE(message) __attribute__((deprecated)) |
| |
| #elif defined(_MSC_VER) |
| #define C10_DEPRECATED __declspec(deprecated) |
| #define C10_DEPRECATED_MESSAGE(message) __declspec(deprecated(message)) |
| #else |
| #warning "You need to implement C10_DEPRECATED for this compiler" |
| #define C10_DEPRECATED |
| #endif |
| |
| // Sample usage: |
| // |
| // C10_DEFINE_DEPRECATED_USING(BadType, int) |
| // |
| // which is the portable version of |
| // |
| // using BadType [[deprecated]] = int; |
| |
| // technically [[deprecated]] syntax is from c++14 standard, but it works in |
| // many compilers. |
| #if defined(__has_cpp_attribute) |
| #if __has_cpp_attribute(deprecated) && !defined(__CUDACC__) |
| #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \ |
| using TypeName [[deprecated]] = TypeThingy; |
| #endif |
| #endif |
| |
| #if defined(_MSC_VER) |
| #if defined(__CUDACC__) |
| // neither [[deprecated]] nor __declspec(deprecated) work on nvcc on Windows; |
| // you get the error: |
| // |
| // error: attribute does not apply to any entity |
| // |
| // So we just turn the macro off in this case. |
| #if defined(C10_DEFINE_DEPRECATED_USING) |
| #undef C10_DEFINE_DEPRECATED_USING |
| #endif |
| #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \ |
| using TypeName = TypeThingy; |
| #else |
| // [[deprecated]] does work in windows without nvcc, though msc doesn't support |
| // `__has_cpp_attribute` when c++14 is supported, otherwise |
| // __declspec(deprecated) is used as the alternative. |
| #ifndef C10_DEFINE_DEPRECATED_USING |
| #if defined(_MSVC_LANG) && _MSVC_LANG >= 201402L |
| #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \ |
| using TypeName [[deprecated]] = TypeThingy; |
| #else |
| #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \ |
| using TypeName = __declspec(deprecated) TypeThingy; |
| #endif |
| #endif |
| #endif |
| #endif |
| |
| #if !defined(C10_DEFINE_DEPRECATED_USING) && defined(__GNUC__) |
| // nvcc has a bug where it doesn't understand __attribute__((deprecated)) |
| // declarations even when the host compiler supports it. We'll only use this gcc |
| // attribute when not cuda, and when using a GCC compiler that doesn't support |
| // the c++14 syntax we checked for above (available in __GNUC__ >= 5) |
| #if !defined(__CUDACC__) |
| #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \ |
| using TypeName __attribute__((deprecated)) = TypeThingy; |
| #else |
| // using cuda + gcc < 5, neither deprecated syntax is available so turning off. |
| #define C10_DEFINE_DEPRECATED_USING(TypeName, TypeThingy) \ |
| using TypeName = TypeThingy; |
| #endif |
| #endif |
| |
| #if !defined(C10_DEFINE_DEPRECATED_USING) |
| #warning "You need to implement C10_DEFINE_DEPRECATED_USING for this compiler" |
| #define C10_DEFINE_DEPRECATED_USING |
| #endif |