diff --git a/libcxx/docs/TestingLibcxx.rst b/libcxx/docs/TestingLibcxx.rst --- a/libcxx/docs/TestingLibcxx.rst +++ b/libcxx/docs/TestingLibcxx.rst @@ -63,8 +63,8 @@ # Specify a custom compiler. $ /bin/llvm-lit -sv libcxx/test/std --param=cxx_under_test=/opt/bin/g++ - # Enable warnings in the test suite - $ /bin/llvm-lit -sv libcxx/test --param=enable_warnings=true + # Disable warnings in the test suite + $ /bin/llvm-lit -sv libcxx/test --param=enable_warnings=False # Use UBSAN when running the tests. $ /bin/llvm-lit -sv libcxx/test --param=use_sanitizer=Undefined diff --git a/libcxx/utils/libcxx/test/config.py b/libcxx/utils/libcxx/test/config.py --- a/libcxx/utils/libcxx/test/config.py +++ b/libcxx/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/libcxx/utils/libcxx/test/dsl.py b/libcxx/utils/libcxx/test/dsl.py --- a/libcxx/utils/libcxx/test/dsl.py +++ b/libcxx/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/libcxx/utils/libcxx/test/params.py b/libcxx/utils/libcxx/test/params.py --- a/libcxx/utils/libcxx/test/params.py +++ b/libcxx/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++ library.",