| // Copyright 2010-2014, Google Inc. |
| // All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are |
| // met: |
| // |
| // * Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above |
| // copyright notice, this list of conditions and the following disclaimer |
| // in the documentation and/or other materials provided with the |
| // distribution. |
| // * Neither the name of Google Inc. nor the names of its |
| // contributors may be used to endorse or promote products derived from |
| // this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| #ifndef MOZC_BASE_COMPILER_SPECIFIC_H_ |
| #define MOZC_BASE_COMPILER_SPECIFIC_H_ |
| |
| // TODO(yukawa): Add unit tests against macros below. |
| // TODO(yukawa): Support C++11's override/final keywords |
| |
| // === Begin version check macro definitions === |
| #if defined(_MSC_VER) |
| #define MOZC_MSVC_VERSION_GE(major, minor) (_MSC_VER >= major * 100 + minor) |
| #define MOZC_MSVC_VERSION_LT(major, minor) (_MSC_VER < major * 100 + minor) |
| #else // not _MSC_VER |
| #define MOZC_MSVC_VERSION_GE(major, minor) (0) |
| #define MOZC_MSVC_VERSION_LT(major, minor) (0) |
| #endif // _MSC_VER |
| |
| #if defined(__GNUC__) |
| #define MOZC_GCC_VERSION_GE(major, minor) \ |
| (__GNUC__ > (major) || \ |
| (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor))) |
| #define MOZC_GCC_VERSION_LT(major, minor) \ |
| (__GNUC__ < (major) || \ |
| (__GNUC__ == (major) && __GNUC_MINOR__ < (minor))) |
| #else // not __GNUC__ |
| #define MOZC_GCC_VERSION_GE(major, minor) (0) |
| #define MOZC_GCC_VERSION_LT(major, minor) (0) |
| #endif // __GNUC__ |
| |
| #if defined(__clang_major__) |
| #define MOZC_CLANG_VERSION_GE(major, minor) \ |
| (__clang_major__ > (major) || \ |
| (__clang_major__ == (major) && __clang_minor__ >= (minor))) |
| #define MOZC_CLANG_VERSION_LT(major, minor) \ |
| (__clang_major__ < (major) || \ |
| (__clang_major__ == (major) && __clang_minor__ < (minor))) |
| #else // not __clang_major__ |
| #define MOZC_CLANG_VERSION_GE(major, minor) (0) |
| #define MOZC_CLANG_VERSION_LT(major, minor) (0) |
| #endif // __clang_major__ |
| // === End version check macro definitions === |
| |
| // === Begin inline pragma macro definitions === |
| #define MOZC_SWALLOWING_SEMICOLON_HACK static_assert(true, "") |
| #if defined(_MSC_VER) |
| #define MOZC_DO_PRAGMA_IMPL(s) __pragma(s) MOZC_SWALLOWING_SEMICOLON_HACK |
| #elif defined(__clang__) || defined(__GNUC__) |
| #define MOZC_DO_PRAGMA_IMPL(s) _Pragma(#s) MOZC_SWALLOWING_SEMICOLON_HACK |
| #else |
| #define MOZC_DO_PRAGMA_IMPL(s) MOZC_SWALLOWING_SEMICOLON_HACK |
| #endif |
| // === End inline pragma macro definitions === |
| |
| |
| // === Begin warning control macro definitions === |
| // MOZC_MSVC_DISABLE_WARNING(n) |
| // description: |
| // Disables given warning. |
| // Does nothing when not supported. |
| // |
| // MOZC_MSVC_PUSH_WARNING() |
| // description: |
| // Pushes current warning settings into the stack. |
| // Does nothing when not supported. |
| // |
| // MOZC_MSVC_POP_WARNING() |
| // description: |
| // Pops the last warning settings from the stack. |
| // Does nothing when not supported. |
| // example: |
| // MOZC_MSVC_PUSH_WARNING(); |
| // // Disable C4244 |
| // // http://msdn.microsoft.com/en-us/library/2d7604yb.aspx |
| // MOZC_MSVC_DISABLE_WARNING(4001); |
| // int x = 10.1; |
| // MOZC_MSVC_POP_WARNING(); |
| // |
| // MOZC_GCC_DISABLE_WARNING_FILELEVEL(x) |
| // description: |
| // Disables given warning. You can use this macro only on toplevel. |
| // You cannot specify two or more tokens. |
| // Does nothing when not supported. |
| // example: |
| // MOZC_GCC_DISABLE_WARNING_FILELEVEL(conversion-null); |
| // TEST(Foo, Bar) { |
| // EXPECT_EQ(false, false); |
| // } |
| // |
| // MOZC_GCC_DISABLE_WARNING_INLINE(x) |
| // description: |
| // Disables given warning. You can use this macro inside of function. |
| // You cannot specify two or more tokens. |
| // Does nothing when not supported. |
| // example: |
| // TEST(Foo, Bar) { |
| // MOZC_GCC_DISABLE_WARNING_INLINE(conversion-null); |
| // EXPECT_EQ(false, false); |
| // } |
| // |
| // MOZC_GCC_POP_WARNING -> GCC version of MOZC_MSVC_POP_WARNING |
| // MOZC_GCC_PUSH_WARNING -> GCC version of MOZC_MSVC_PUSH_WARNING |
| // MOZC_CLANG_POP_WARNING -> Clang version of MOZC_MSVC_POP_WARNING |
| // MOZC_CLANG_PUSH_WARNING -> Clang version of MOZC_MSVC_PUSH_WARNING |
| // MOZC_CLANG_DISABLE_WARNING |
| // -> Clang version of MOZC_GCC_DISABLE_WARNING_INLINE |
| |
| #if defined(_MSC_VER) |
| #define MOZC_MSVC_DISABLE_WARNING(n) MOZC_DO_PRAGMA_IMPL(warning(disable:n)) |
| #define MOZC_MSVC_PUSH_WARNING() MOZC_DO_PRAGMA_IMPL(warning(push)) |
| #define MOZC_MSVC_POP_WARNING() MOZC_DO_PRAGMA_IMPL(warning(pop)) |
| #else // not _MSC_VER |
| #define MOZC_MSVC_DISABLE_WARNING(n) MOZC_SWALLOWING_SEMICOLON_HACK |
| #define MOZC_MSVC_PUSH_WARNING() MOZC_SWALLOWING_SEMICOLON_HACK |
| #define MOZC_MSVC_POP_WARNING() MOZC_SWALLOWING_SEMICOLON_HACK |
| #endif // _MSC_VER |
| |
| // Utility macros |
| #define MOZC_CLANG_GCC_DISABLE_WARNING_IMPL(compiler, s) \ |
| MOZC_DO_PRAGMA_IMPL(compiler diagnostic ignored #s) |
| |
| #if MOZC_GCC_VERSION_GE(4, 2) |
| #define MOZC_GCC_DISABLE_WARNING_FILELEVEL(type) \ |
| MOZC_CLANG_GCC_DISABLE_WARNING_IMPL(GCC, -W ## type) |
| #else // GCC<4.2 |
| #define MOZC_GCC_DISABLE_WARNING_FILELEVEL(type) \ |
| MOZC_SWALLOWING_SEMICOLON_HACK |
| #endif // GCC versions |
| |
| #if MOZC_GCC_VERSION_GE(4, 6) |
| #define MOZC_GCC_DISABLE_WARNING_INLINE(type) \ |
| MOZC_CLANG_GCC_DISABLE_WARNING_IMPL(GCC, -W ## type) |
| #define MOZC_GCC_POP_WARNING() MOZC_DO_PRAGMA_IMPL(GCC diagnostic pop) |
| #define MOZC_GCC_PUSH_WARNING() MOZC_DO_PRAGMA_IMPL(GCC diagnostic push) |
| #else // GCC<4.6 |
| #define MOZC_GCC_DISABLE_WARNING_INLINE(type) MOZC_SWALLOWING_SEMICOLON_HACK |
| #define MOZC_GCC_POP_WARNING() MOZC_SWALLOWING_SEMICOLON_HACK |
| #define MOZC_GCC_PUSH_WARNING() MOZC_SWALLOWING_SEMICOLON_HACK |
| #endif // GCC versions |
| |
| #if defined(__clang__) |
| #define MOZC_CLANG_DISABLE_WARNING(type) \ |
| MOZC_CLANG_GCC_DISABLE_WARNING_IMPL(clang, -W ## type) |
| #define MOZC_CLANG_POP_WARNING() MOZC_DO_PRAGMA_IMPL(clang diagnostic pop) |
| #define MOZC_CLANG_PUSH_WARNING() MOZC_DO_PRAGMA_IMPL(clang diagnostic push) |
| #else // !__clang__ |
| #define MOZC_CLANG_DISABLE_WARNING(type) MOZC_SWALLOWING_SEMICOLON_HACK |
| #define MOZC_CLANG_POP_WARNING() MOZC_SWALLOWING_SEMICOLON_HACK |
| #define MOZC_CLANG_PUSH_WARNING() MOZC_SWALLOWING_SEMICOLON_HACK |
| #endif // __clang__ or !__clang__ |
| // === End waring control macro definitions === |
| |
| // === Begin compile message macro definitions === |
| // MOZC_COMPILE_MESSAGE(msg) |
| // description: |
| // Generates a message into build log. |
| // Does nothing when not supported. |
| // example: |
| // MOZC_COMPILE_MESSAGE("Hello"); |
| |
| // Utility macros |
| #if defined(_MSC_VER) |
| #define MOZC_COMPILE_MESSAGE(s) MOZC_DO_PRAGMA_IMPL(message (s)) |
| #elif MOZC_GCC_VERSION_GE(4, 4) || MOZC_CLANG_VERSION_GE(2, 8) |
| #define MOZC_COMPILE_MESSAGE(s) MOZC_DO_PRAGMA_IMPL(message s) |
| #else |
| #define MOZC_COMPILE_MESSAGE(s) MOZC_SWALLOWING_SEMICOLON_HACK |
| #endif // compilers |
| // === End compile message macro definitions === |
| |
| // === Begin has warning macro definitions === |
| #if defined(__has_warning) |
| #define MOZC_CLANG_HAS_WARNING_IMPL(s) __has_warning(#s) |
| #else |
| #define MOZC_CLANG_HAS_WARNING_IMPL(s) (0) |
| #endif |
| |
| #if defined(__clang__) |
| #define MOZC_CLANG_HAS_WARNING(type) \ |
| MOZC_CLANG_HAS_WARNING_IMPL(-W ## type) |
| #else // !__clang__ |
| #define MOZC_CLANG_HAS_WARNING(type) (0) |
| #endif // __clang__ or !__clang__ |
| // === End has warning macro definitions === |
| |
| // === Begin suppress warning C4355 macro definitions === |
| // ALLOW_THIS_IN_INITIALIZER_LIST(code) |
| // description: |
| // Suppress the following warning of Visual C++ |
| // "Compiler warning C4355: 'this': used in base member initializer list" |
| // http://msdn.microsoft.com/en-us/library/3c594ae3.aspx |
| // example: |
| // Foo::Foo() : x(NULL), ALLOW_THIS_IN_INITIALIZER_LIST(y(this)) {} |
| #if defined(_MSC_VER) |
| #define ALLOW_THIS_IN_INITIALIZER_LIST(code) \ |
| __pragma(warning(push)) __pragma(warning(disable:4355)) \ |
| code \ |
| __pragma(warning(pop)) |
| #else |
| #define ALLOW_THIS_IN_INITIALIZER_LIST(code) code |
| #endif // _MSC_VER or !_MSC_VER |
| // === End suppress warning C4355 macro definitions === |
| |
| #endif // MOZC_BASE_COMPILER_SPECIFIC_H_ |