[libcxx] Add special warning flag detection logic to compiler.py

Summary: Detecting `-Wno-<warning>` flags can be tricky with GCC (See https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html). This patch adds a special `addWarningFlagIfSupported(<flag>)` method to the test compiler object that can be used to add warning flags. The goal of this patch is to help get the test suite running with more warnings.

Reviewers: danalbert, jroelofs

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D11333

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@246069 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier
2015-08-26 20:17:33 +00:00
parent f1626ad28d
commit e94b4840ef
2 changed files with 30 additions and 6 deletions

View File

@@ -161,3 +161,28 @@ class CXXCompiler(object):
return True return True
else: else:
return False return False
def addWarningFlagIfSupported(self, flag):
"""
addWarningFlagIfSupported - Add a warning flag if the compiler
supports it. Unlike addCompileFlagIfSupported, this function detects
when "-Wno-<warning>" flags are unsupported. If flag is a
"-Wno-<warning>" GCC will not emit an unknown option diagnostic unless
another error is triggered during compilation.
"""
assert isinstance(flag, str)
if not flag.startswith('-Wno-'):
return self.addCompileFlagIfSupported(flag)
flags = ['-Werror', flag]
cmd = self.compileCmd('-', os.devnull, flags)
# Remove '-v' because it will cause the command line invocation
# to be printed as part of the error output.
# TODO(EricWF): Are there other flags we need to worry about?
if '-v' in cmd:
cmd.remove('-v')
out, err, rc = lit.util.executeCommand(cmd, input='#error\n')
assert rc != 0
if flag in err:
return False
self.compile_flags += [flag]
return True

View File

@@ -574,16 +574,15 @@ class Configuration(object):
'-D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER', '-D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER',
'-Wall', '-Werror' '-Wall', '-Werror'
] ]
self.cxx.addCompileFlagIfSupported('-Wno-attributes') self.cxx.addWarningFlagIfSupported('-Wno-attributes')
if self.cxx.type == 'clang' or self.cxx.type == 'apple-clang': self.cxx.addWarningFlagIfSupported('-Wno-pessimizing-move')
self.cxx.addCompileFlagIfSupported('-Wno-pessimizing-move') self.cxx.addWarningFlagIfSupported('-Wno-c++11-extensions')
self.cxx.addCompileFlagIfSupported('-Wno-c++11-extensions') self.cxx.addWarningFlagIfSupported('-Wno-user-defined-literals')
self.cxx.addCompileFlagIfSupported('-Wno-user-defined-literals')
std = self.get_lit_conf('std', None) std = self.get_lit_conf('std', None)
if std in ['c++98', 'c++03']: if std in ['c++98', 'c++03']:
# The '#define static_assert' provided by libc++ in C++03 mode # The '#define static_assert' provided by libc++ in C++03 mode
# causes an unused local typedef whenever it is used. # causes an unused local typedef whenever it is used.
self.cxx.addCompileFlagIfSupported('-Wno-unused-local-typedef') self.cxx.addWarningFlagIfSupported('-Wno-unused-local-typedef')
def configure_sanitizer(self): def configure_sanitizer(self):
san = self.get_lit_conf('use_sanitizer', '').strip() san = self.get_lit_conf('use_sanitizer', '').strip()