[libc++] Migrate warning flags to the DSL
This makes us closer to running the test suite on platforms where the
legacy test suite configuration doesn't work.
One notable change after this commit is that the tests will be run with
warnings enabled on GCC too, which wasn't the case before. However,
previous commits should have tweaked the test suite to make sure it
passes with warnings enabled on GCC.
Note that warnings can still be disabled with `--param enable_warnings=False`,
as before.
Differential Revision: https://reviews.llvm.org/D90432
GitOrigin-RevId: d6e2bac19554a6f877e36d09547b3686b5d7ddb1
diff --git a/docs/TestingLibcxx.rst b/docs/TestingLibcxx.rst
index b628fee..12edc23 100644
--- a/docs/TestingLibcxx.rst
+++ b/docs/TestingLibcxx.rst
@@ -63,8 +63,8 @@
# Specify a custom compiler.
$ <build>/bin/llvm-lit -sv libcxx/test/std --param=cxx_under_test=/opt/bin/g++
- # Enable warnings in the test suite
- $ <build>/bin/llvm-lit -sv libcxx/test --param=enable_warnings=true
+ # Disable warnings in the test suite
+ $ <build>/bin/llvm-lit -sv libcxx/test --param=enable_warnings=False
# Use UBSAN when running the tests.
$ <build>/bin/llvm-lit -sv libcxx/test --param=use_sanitizer=Undefined
diff --git a/utils/libcxx/test/config.py b/utils/libcxx/test/config.py
index a84ef4a..f6ff8b1 100644
--- a/utils/libcxx/test/config.py
+++ b/utils/libcxx/test/config.py
@@ -131,7 +131,6 @@
self.configure_link_flags()
self.configure_env()
self.configure_debug_mode()
- self.configure_warnings()
self.configure_sanitizer()
self.configure_coverage()
self.configure_modules()
@@ -335,6 +334,12 @@
if not self.use_system_cxx_lib:
self.cxx.compile_flags += ['-D_LIBCPP_DISABLE_AVAILABILITY']
+ # On GCC, the libc++ headers cause errors due to throw() decorators
+ # on operator new clashing with those from the test suite, so we
+ # don't enable warnings in system headers on GCC.
+ if self.cxx.type != 'gcc':
+ self.cxx.compile_flags += ['-D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER']
+
# Add includes for the PSTL headers
pstl_src_root = self.get_lit_conf('pstl_src_root')
pstl_obj_root = self.get_lit_conf('pstl_obj_root')
@@ -505,41 +510,6 @@
% debug_level)
self.cxx.compile_flags += ['-D_LIBCPP_DEBUG=%s' % debug_level]
- def configure_warnings(self):
- # Turn on warnings by default for Clang based compilers
- default_enable_warnings = self.cxx.type in ['clang', 'apple-clang']
- enable_warnings = self.get_lit_bool('enable_warnings',
- default_enable_warnings)
- self.cxx.useWarnings(enable_warnings)
- self.cxx.warning_flags += ['-Werror', '-Wall', '-Wextra']
- # On GCC, the libc++ headers cause errors due to throw() decorators
- # on operator new clashing with those from the test suite, so we
- # don't enable warnings in system headers on GCC.
- if self.cxx.type != 'gcc':
- self.cxx.warning_flags += ['-D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER']
- self.cxx.addWarningFlagIfSupported('-Wshadow')
- self.cxx.addWarningFlagIfSupported('-Wno-unused-command-line-argument')
- self.cxx.addWarningFlagIfSupported('-Wno-attributes')
- self.cxx.addWarningFlagIfSupported('-Wno-pessimizing-move')
- self.cxx.addWarningFlagIfSupported('-Wno-c++11-extensions')
- self.cxx.addWarningFlagIfSupported('-Wno-user-defined-literals')
- self.cxx.addWarningFlagIfSupported('-Wno-noexcept-type')
- self.cxx.addWarningFlagIfSupported('-Wno-aligned-allocation-unavailable')
- self.cxx.addWarningFlagIfSupported('-Wno-atomic-alignment')
-
- # GCC warns about places where we might want to add sized allocation/deallocation
- # functions, but we know better what we're doing/testing in the test suite.
- self.cxx.addWarningFlagIfSupported('-Wno-sized-deallocation')
-
- # These warnings should be enabled in order to support the MSVC
- # team using the test suite; They enable the warnings below and
- # expect the test suite to be clean.
- self.cxx.addWarningFlagIfSupported('-Wsign-compare')
- self.cxx.addWarningFlagIfSupported('-Wunused-variable')
- self.cxx.addWarningFlagIfSupported('-Wunused-parameter')
- self.cxx.addWarningFlagIfSupported('-Wunreachable-code')
- self.cxx.addWarningFlagIfSupported('-Wno-unused-local-typedef')
-
def configure_sanitizer(self):
san = self.get_lit_conf('use_sanitizer', '').strip()
if san:
diff --git a/utils/libcxx/test/dsl.py b/utils/libcxx/test/dsl.py
index 14d3a0e..5171c75 100644
--- a/utils/libcxx/test/dsl.py
+++ b/utils/libcxx/test/dsl.py
@@ -335,6 +335,27 @@
return 'add {} to %{{link_flags}}'.format(self._getFlag(config))
+class AddOptionalWarningFlag(ConfigAction):
+ """
+ This action adds the given warning flag to the %{compile_flags} substitution,
+ if it is supported by the compiler.
+
+ The flag can be a string or a callable, in which case it is called with the
+ configuration to produce the actual flag (as a string).
+ """
+ def __init__(self, flag):
+ self._getFlag = lambda config: flag(config) if callable(flag) else flag
+
+ def applyTo(self, config):
+ flag = self._getFlag(config)
+ # Use -Werror to make sure we see an error about the flag being unsupported.
+ if hasCompileFlag(config, '-Werror ' + flag):
+ config.substitutions = _addToSubstitution(config.substitutions, '%{compile_flags}', flag)
+
+ def pretty(self, config, litParams):
+ return 'add {} to %{{compile_flags}}'.format(self._getFlag(config))
+
+
class Feature(object):
"""
Represents a Lit available feature that is enabled whenever it is supported.
diff --git a/utils/libcxx/test/params.py b/utils/libcxx/test/params.py
index 8e6e423..e9c0f73 100644
--- a/utils/libcxx/test/params.py
+++ b/utils/libcxx/test/params.py
@@ -9,6 +9,33 @@
from libcxx.test.dsl import *
_allStandards = ['c++03', 'c++11', 'c++14', 'c++17', 'c++2a']
+_warningFlags = [
+ '-Werror',
+ '-Wall',
+ '-Wextra',
+ '-Wshadow',
+ '-Wno-unused-command-line-argument',
+ '-Wno-attributes',
+ '-Wno-pessimizing-move',
+ '-Wno-c++11-extensions',
+ '-Wno-user-defined-literals',
+ '-Wno-noexcept-type',
+ '-Wno-aligned-allocation-unavailable',
+ '-Wno-atomic-alignment',
+
+ # GCC warns about places where we might want to add sized allocation/deallocation
+ # functions, but we know better what we're doing/testing in the test suite.
+ '-Wno-sized-deallocation',
+
+ # These warnings should be enabled in order to support the MSVC
+ # team using the test suite; They enable the warnings below and
+ # expect the test suite to be clean.
+ '-Wsign-compare',
+ '-Wunused-variable',
+ '-Wunused-parameter',
+ '-Wunreachable-code',
+ '-Wno-unused-local-typedef',
+]
DEFAULT_PARAMETERS = [
# Core parameters of the test suite
@@ -40,6 +67,12 @@
AddFeature(stdlib)
]),
+ Parameter(name='enable_warnings', choices=[True, False], type=bool, default=True,
+ help="Whether to enable warnings when compiling the test suite.",
+ actions=lambda warnings: [] if not warnings else [
+ AddOptionalWarningFlag(w) for w in _warningFlags
+ ]),
+
# Parameters to enable or disable parts of the test suite
Parameter(name='enable_filesystem', choices=[True, False], type=bool, default=True,
help="Whether to enable tests for the C++ <filesystem> library.",