123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #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
|