Bug 1826325 [wpt PR 39358] - Make the CPython bug 102126 workaround cover 3.10.10...
[gecko.git] / build / moz.configure / warnings.configure
blob81bd3e0ec16f64b9f6b620af2b0782660de07cc6
1 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
2 # vim: set filetype=python:
3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 option(
8     "--enable-warnings-as-errors",
9     env="MOZ_ENABLE_WARNINGS_AS_ERRORS",
10     default=depends("MOZ_AUTOMATION")(lambda x: bool(x)),
11     help="{Enable|Disable} treating warnings as errors",
15 @depends("--enable-warnings-as-errors")
16 def warnings_as_errors(warnings_as_errors):
17     if not warnings_as_errors:
18         return ""
20     return "-Werror"
23 set_config("WARNINGS_AS_ERRORS", warnings_as_errors)
25 not_clang_cl = depends(c_compiler)(lambda c: c.type != "clang-cl")
27 # GCC/Clang warnings:
28 # https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
29 # https://clang.llvm.org/docs/DiagnosticsReference.html
31 # Lots of useful warnings
32 add_warning("-Wall", when=not_clang_cl)
33 # In clang-cl, -Wall actually means -Weverything. -W3 does mean -Wall.
34 add_warning("-W3", when=depends(c_compiler)(lambda c: c.type == "clang-cl"))
36 # catch implicit truncation of enum values assigned to smaller bit fields
37 check_and_add_warning("-Wbitfield-enum-conversion")
39 # catches deprecated implicit capture of `this` in lambdas.
40 check_and_add_warning("-Wdeprecated-this-capture", cxx_compiler)
42 # catches bugs, e.g. "if (c); foo();", few false positives
43 add_warning("-Wempty-body")
45 # catches mismatched printf integer sizes.
46 check_and_add_warning("-Wformat-type-confusion")
48 # catches return types with qualifiers like const
49 add_warning("-Wignored-qualifiers")
51 # catches pointer arithmetic using NULL or sizeof(void)
52 add_warning("-Wpointer-arith")
54 # catch modifying constructor parameter that shadows member variable
55 check_and_add_warning("-Wshadow-field-in-constructor-modified")
57 # catches comparing signed/unsigned ints
58 add_warning("-Wsign-compare")
60 # catches comparisons of values and sized types are always true or false
61 check_and_add_warning("-Wtautological-constant-in-range-compare")
63 # catches overflow bugs, few false positives
64 add_warning("-Wtype-limits")
66 # This can be triggered by certain patterns used deliberately in portable code
67 check_and_add_warning("-Wno-error=tautological-type-limit-compare")
69 # catches some dead code
70 add_warning("-Wunreachable-code")
71 check_and_add_warning("-Wunreachable-code-return")
73 # catches parameters that are set but not read
74 # Only enable on clang because gcc reports false positives.
75 check_and_add_warning(
76     "-Wunused-but-set-parameter",
77     when=depends(c_compiler)(lambda c: c.type in ("clang", "clang-cl")),
80 # turned on by -Wall, but we use offsetof on non-POD types frequently
81 add_warning("-Wno-invalid-offsetof", cxx_compiler)
83 # catches objects passed by value to variadic functions.
84 check_and_add_warning("-Wclass-varargs")
86 # catches empty if/switch/for initialization statements that have no effect
87 check_and_add_warning("-Wempty-init-stmt", cxx_compiler)
89 # catches some implicit conversion of floats to ints
90 check_and_add_warning("-Wfloat-overflow-conversion")
91 check_and_add_warning("-Wfloat-zero-conversion")
93 # catches issues around loops
94 check_and_add_warning("-Wloop-analysis")
95 # But, disable range-loop-analysis because it can raise unhelpful false
96 # positives.
97 check_and_add_warning("-Wno-range-loop-analysis")
99 # Enable some C++20 compat warnings. We can remove these flags after we compile
100 # as C++20 (bug 1768116), because they will be enabled by default:
101 check_and_add_warning("-Wc++2a-compat", cxx_compiler)
102 check_and_add_warning("-Wcomma-subscript", cxx_compiler)
103 check_and_add_warning("-Wenum-compare-conditional")
104 check_and_add_warning("-Wenum-float-conversion")
105 check_and_add_warning("-Wvolatile", cxx_compiler)
107 # Downgrade some C++20 warnings-as-errors to warnings that we can fix after we
108 # compile as C++20 (bug 1768116). They don't need to block upgrading to C++20.
109 check_and_add_warning("-Wno-ambiguous-reversed-operator", cxx_compiler)
110 check_and_add_warning("-Wno-error=deprecated", cxx_compiler)
111 check_and_add_warning("-Wno-error=deprecated-anon-enum-enum-conversion", cxx_compiler)
112 check_and_add_warning("-Wno-error=deprecated-enum-enum-conversion", cxx_compiler)
113 check_and_add_warning("-Wno-error=deprecated-pragma", cxx_compiler)
114 check_and_add_warning("-Wno-error=deprecated-this-capture", cxx_compiler)
116 # catches possible misuse of the comma operator
117 check_and_add_warning("-Wcomma", cxx_compiler)
119 # catches duplicated conditions in if-else-if chains
120 check_and_add_warning("-Wduplicated-cond")
122 # catches unintentional switch case fallthroughs
123 check_and_add_warning("-Wimplicit-fallthrough", cxx_compiler)
125 # Warn about suspicious uses of logical operators in expressions.
126 check_and_add_warning("-Wlogical-op")
128 # Enable some ObjC diagnostics that are only relevant when targeting macOS:
129 with only_when(depends(target)(lambda t: t.kernel == "Darwin")):
130     # catch redeclaration of ObjC method parameter name
131     check_and_add_warning("-Wduplicate-method-arg")
133     # catch multiple declarations of ObjC method found
134     check_and_add_warning("-Wduplicate-method-match")
136     # catch ObjC method with no return type specified
137     check_and_add_warning("-Wmissing-method-return-type")
139     # catch implicit conversions between ObjC BOOL and int
140     check_and_add_warning("-Wobjc-signed-char-bool")
142     # catch semicolon before ObjC method body
143     check_and_add_warning("-Wsemicolon-before-method-body")
145     # catch ObjC method parameter type not matching super class method
146     check_and_add_warning("-Wsuper-class-method-mismatch")
148 # catches string literals used in boolean expressions
149 check_and_add_warning("-Wstring-conversion")
151 # we inline 'new' and 'delete' in mozalloc
152 check_and_add_warning("-Wno-inline-new-delete", cxx_compiler)
154 # Prevent the following GCC warnings from being treated as errors:
155 # too many false positives
156 check_and_add_warning("-Wno-error=maybe-uninitialized")
158 # we don't want our builds held hostage when a platform-specific API
159 # becomes deprecated.
160 check_and_add_warning("-Wno-error=deprecated-declarations")
162 # false positives depending on optimization
163 check_and_add_warning("-Wno-error=array-bounds")
165 # false positives depending on optimizations
166 check_and_add_warning("-Wno-error=free-nonheap-object")
168 # Would be a pain to fix all occurrences, for very little gain
169 check_and_add_warning("-Wno-multistatement-macros")
171 # Disable the -Werror for -Wclass-memaccess as we have a long
172 # tail of issues to fix
173 check_and_add_warning("-Wno-error=class-memaccess")
175 # -Watomic-alignment is a new warning in clang 7 that seems way too broad.
176 # https://bugs.llvm.org/show_bug.cgi?id=38593
177 check_and_add_warning("-Wno-error=atomic-alignment")
179 # New warning with clang 15. Catches uses of deprecated builtins in abseil-cpp.
180 # https://bugzilla.mozilla.org/show_bug.cgi?id=1779528
181 check_and_add_warning("-Wno-error=deprecated-builtins")
183 # catches format/argument mismatches with printf
184 c_format_warning, cxx_format_warning = check_and_add_warning(
185     "-Wformat", when=depends(target)(lambda t: t.kernel != "WINNT")
188 # Add compile-time warnings for unprotected functions and format functions
189 # that represent possible security problems. Enable this only when -Wformat
190 # is enabled, otherwise it is an error
191 check_and_add_warning("-Wformat-security", when=c_format_warning & cxx_format_warning)
192 check_and_add_warning("-Wformat-overflow=2", when=c_format_warning & cxx_format_warning)
194 # Other Windows specific things
195 with only_when(target_is_windows):
196     # When compiling for Windows with gcc, we encounter lots of "#pragma warning"'s
197     # which is an MSVC-only pragma that GCC does not recognize.
198     # With clang-cl, as it claims to be MSVC it would be difficult to add
199     # #if defined(_MSC_VER) && !defined(__clang__) everywhere we use such pragmas,
200     # so just ignore them.
201     check_and_add_warning("-Wno-unknown-pragmas")
203     with only_when(depends(c_compiler)(lambda c: c.type == "clang-cl")):
204         # We get errors about various #pragma intrinsic directives from
205         # clang-cl, and we don't need to hear about those.
206         check_and_add_warning("-Wno-ignored-pragmas")
208         # clang-cl's Intrin.h marks things like _ReadWriteBarrier as
209         # __attribute((__deprecated__)).  This is nice to know, but since we don't
210         # get the equivalent warning from MSVC, let's just ignore it.
211         check_and_add_warning("-Wno-deprecated-declarations")
213         # This warns for reasonable things like:
214         #   enum { X = 0xffffffffU };
215         # which is annoying for IDL headers.
216         check_and_add_warning("-Wno-microsoft-enum-value", cxx_compiler)
218         # This warns for cases that would be reached by the Microsoft
219         # #include rules, but also currently warns on cases that would
220         # *also* be reached by standard C++ include rules.  That
221         # behavior doesn't seem useful, so we turn it off.
222         check_and_add_warning("-Wno-microsoft-include", cxx_compiler)
224         # We use a function like:
225         #   __declspec(noreturn) __inline void f() {}
226         # which -Winvalid-noreturn complains about.  Again, MSVC seems
227         # OK with it, so let's silence the warning.
228         check_and_add_warning("-Wno-invalid-noreturn")
230         # Missing |override| on virtual function declarations isn't
231         # something that MSVC currently warns about.
232         check_and_add_warning("-Wno-inconsistent-missing-override", cxx_compiler)
234         # We use -DHAS_EXCEPTIONS=0, which removes the |throw()|
235         # declaration on |operator delete(void*)|.  However, clang-cl
236         # must internally declare |operator delete(void*)| differently,
237         # which causes this warning for virtually every file in the
238         # tree.  clang-cl doesn't support -fno-exceptions or equivalent,
239         # so there doesn't seem to be any way to convince clang-cl to
240         # declare |delete| differently.  Therefore, suppress this
241         # warning.
242         check_and_add_warning("-Wno-implicit-exception-spec-mismatch", cxx_compiler)
244         # Macros like STDMETHOD() and IFACEMETHOD() can declare
245         # __attribute__((nothrow)) on their respective method declarations,
246         # while the definitions are left without the matching attribute.
247         check_and_add_warning("-Wno-microsoft-exception-spec", cxx_compiler)
249         # At least one MSVC header and several headers in-tree have
250         # unused typedefs, so turn this on.
251         check_and_add_warning("-Wno-unused-local-typedef", cxx_compiler)
253         # jemalloc uses __declspec(allocator) as a profiler hint,
254         # which clang-cl doesn't understand.
255         check_and_add_warning("-Wno-ignored-attributes", cxx_compiler)
257         # __attribute__((unused)) really means "might be unused" and
258         # we use it to avoid warnings about things that are unused
259         # in some compilation units, but used in many others.  This
260         # warning insists on complaining about the latter case, which
261         # is annoying, and rather noisy.
262         check_and_add_warning("-Wno-used-but-marked-unused", cxx_compiler)
264     with only_when(depends(c_compiler)(lambda c: c.type != "clang-cl")):
265         # When compiling for Windows with gcc, gcc throws false positives and true
266         # positives where the callsite is ifdef-ed out
267         check_and_add_warning("-Wno-unused-function")
269         # When compiling for Windows with gcc, gcc cannot produce this warning
270         # correctly: it mistakes DWORD_PTR and ULONG_PTR as types you cannot
271         # give NULL to. (You can in fact do that.)
272         check_and_add_warning("-Wno-conversion-null")
274         # Throughout the codebase we regularly have switch statements off of enums
275         # without covering every value in the enum. We don't care about these warnings.
276         check_and_add_warning("-Wno-switch")
278         # Another code pattern we have is using start and end constants in enums of
279         # different types. We do this for safety, but then when comparing it throws
280         # an error, which we would like to ignore. This seems to only affect the MinGW
281         # build, but we're not sure why.
282         check_and_add_warning("-Wno-enum-compare")
284 # Make it an error to be missing function declarations for C code.
285 check_and_add_warning("-Werror=implicit-function-declaration", c_compiler)
287 # New in clang 11. We can't really do anything about this warning.
288 check_and_add_warning("-Wno-psabi")
290 # Disable broken missing-braces warning on old clang versions
291 check_and_add_warning(
292     "-Wno-missing-braces",
293     when=depends(c_compiler)(lambda c: c.type == "clang" and c.version < "6.0"),
296 # Turn on clang thread-safety analysis
297 # Older clangs don't support AutoUnlock, and have other issues
298 check_and_add_warning(
299     "-Wthread-safety",
300     when=depends(c_compiler)(
301         lambda c: c.type in ("clang", "clang-cl") and c.version >= "8.0"
302     ),
305 # Warn if APIs are used without available() checks on macOS.
306 check_and_add_warning("-Werror=unguarded-availability-new", when=target_is_osx)
308 # Please keep the following last in this file
310 # Avoid requiring complicated logic for extra warning flags in moz.build files.
311 check_and_add_warning("-Wno-unknown-warning-option")
313 set_config("WARNINGS_CFLAGS", warnings_flags.cflags)
314 set_config("WARNINGS_CXXFLAGS", warnings_flags.cxxflags)
315 set_config("WARNINGS_HOST_CFLAGS", warnings_flags.host_cflags)
316 set_config("WARNINGS_HOST_CXXFLAGS", warnings_flags.host_cxxflags)