[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
This commit is contained in:
parent
8fc07fed32
commit
d6e2bac195
|
@ -63,8 +63,8 @@ Some other common examples include:
|
|||
# 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
|
||||
|
|
|
@ -131,7 +131,6 @@ class Configuration(object):
|
|||
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 @@ class Configuration(object):
|
|||
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 @@ class Configuration(object):
|
|||
% 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:
|
||||
|
|
|
@ -335,6 +335,27 @@ class AddLinkFlag(ConfigAction):
|
|||
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.
|
||||
|
|
|
@ -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 @@ DEFAULT_PARAMETERS = [
|
|||
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.",
|
||||
|
|
Loading…
Reference in New Issue