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