[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:
Louis Dionne 2020-10-29 17:30:28 -04:00
parent 8fc07fed32
commit d6e2bac195
4 changed files with 62 additions and 38 deletions

View File

@ -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

View File

@ -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:

View File

@ -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.

View File

@ -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.",