1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef BASE_COMPILER_SPECIFIC_H_ 6 #define BASE_COMPILER_SPECIFIC_H_ 7 #pragma once 8 9 #include "build/build_config.h" 10 11 #if defined(COMPILER_MSVC) 12 13 // Macros for suppressing and disabling warnings on MSVC. 14 // 15 // Warning numbers are enumerated at: 16 // http://msdn.microsoft.com/en-us/library/8x5x43k7(VS.80).aspx 17 // 18 // The warning pragma: 19 // http://msdn.microsoft.com/en-us/library/2c8f766e(VS.80).aspx 20 // 21 // Using __pragma instead of #pragma inside macros: 22 // http://msdn.microsoft.com/en-us/library/d9x1s805.aspx 23 24 // MSVC_SUPPRESS_WARNING disables warning |n| for the remainder of the line and 25 // for the next line of the source file. 26 #define MSVC_SUPPRESS_WARNING(n) __pragma(warning(suppress:n)) 27 28 // MSVC_PUSH_DISABLE_WARNING pushes |n| onto a stack of warnings to be disabled. 29 // The warning remains disabled until popped by MSVC_POP_WARNING. 30 #define MSVC_PUSH_DISABLE_WARNING(n) __pragma(warning(push)) \ 31 __pragma(warning(disable:n)) 32 33 // MSVC_PUSH_WARNING_LEVEL pushes |n| as the global warning level. The level 34 // remains in effect until popped by MSVC_POP_WARNING(). Use 0 to disable all 35 // warnings. 36 #define MSVC_PUSH_WARNING_LEVEL(n) __pragma(warning(push, n)) 37 38 // Pop effects of innermost MSVC_PUSH_* macro. 39 #define MSVC_POP_WARNING() __pragma(warning(pop)) 40 41 #define MSVC_DISABLE_OPTIMIZE() __pragma(optimize("", off)) 42 #define MSVC_ENABLE_OPTIMIZE() __pragma(optimize("", on)) 43 44 // Allows |this| to be passed as an argument in constructor initializer lists. 45 // This uses push/pop instead of the seemingly simpler suppress feature to avoid 46 // having the warning be disabled for more than just |code|. 47 // 48 // Example usage: 49 // Foo::Foo() : x(NULL), ALLOW_THIS_IN_INITIALIZER_LIST(y(this)), z(3) {} 50 // 51 // Compiler warning C4355: 'this': used in base member initializer list: 52 // http://msdn.microsoft.com/en-us/library/3c594ae3(VS.80).aspx 53 #define ALLOW_THIS_IN_INITIALIZER_LIST(code) MSVC_PUSH_DISABLE_WARNING(4355) \ 54 code \ 55 MSVC_POP_WARNING() 56 57 #else // Not MSVC 58 59 #define MSVC_SUPPRESS_WARNING(n) 60 #define MSVC_PUSH_DISABLE_WARNING(n) 61 #define MSVC_PUSH_WARNING_LEVEL(n) 62 #define MSVC_POP_WARNING() 63 #define MSVC_DISABLE_OPTIMIZE() 64 #define MSVC_ENABLE_OPTIMIZE() 65 #define ALLOW_THIS_IN_INITIALIZER_LIST(code) code 66 67 #endif // COMPILER_MSVC 68 69 70 // Annotate a variable indicating it's ok if the variable is not used. 71 // (Typically used to silence a compiler warning when the assignment 72 // is important for some other reason.) 73 // Use like: 74 // int x ALLOW_UNUSED = ...; 75 #if defined(COMPILER_GCC) 76 #define ALLOW_UNUSED __attribute__((unused)) 77 #define NOINLINE __attribute__((noinline)) 78 #else 79 #define ALLOW_UNUSED 80 #define NOINLINE 81 #endif 82 83 // Annotate a virtual method indicating it must be overriding a virtual 84 // method in the parent class. 85 // Use like: 86 // virtual void foo() OVERRIDE; 87 #if defined(COMPILER_MSVC) 88 #define OVERRIDE override 89 #elif defined(__clang__) 90 #define OVERRIDE override 91 #else 92 #define OVERRIDE 93 #endif 94 95 // Annotate a function indicating the caller must examine the return value. 96 // Use like: 97 // int foo() WARN_UNUSED_RESULT; 98 #if defined(COMPILER_GCC) 99 #define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 100 #else 101 #define WARN_UNUSED_RESULT 102 #endif 103 104 // Tell the compiler a function is using a printf-style format string. 105 // |format_param| is the one-based index of the format string parameter; 106 // |dots_param| is the one-based index of the "..." parameter. 107 // For v*printf functions (which take a va_list), pass 0 for dots_param. 108 // (This is undocumented but matches what the system C headers do.) 109 #if defined(COMPILER_GCC) 110 #define PRINTF_FORMAT(format_param, dots_param) \ 111 __attribute__((format(printf, format_param, dots_param))) 112 #else 113 #define PRINTF_FORMAT(format_param, dots_param) 114 #endif 115 116 // WPRINTF_FORMAT is the same, but for wide format strings. 117 // This doesn't appear to yet be implemented in any compiler. 118 // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38308 . 119 #define WPRINTF_FORMAT(format_param, dots_param) 120 // If available, it would look like: 121 // __attribute__((format(wprintf, format_param, dots_param))) 122 123 #endif // BASE_COMPILER_SPECIFIC_H_ 124