Index: test/libcxx/compiler.py =================================================================== --- test/libcxx/compiler.py +++ test/libcxx/compiler.py @@ -161,3 +161,28 @@ return True else: return False + + def addWarningFlagIfSupported(self, flag): + """ + addWarningFlagIfSupported - Add a warning flag if the compiler + supports it. Unlike addCompileFlagIfSupported, this function detects + when "-Wno-" flags are unsupported. If flag is a + "-Wno-" 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 Index: test/libcxx/test/config.py =================================================================== --- test/libcxx/test/config.py +++ test/libcxx/test/config.py @@ -574,16 +574,15 @@ '-D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER', '-Wall', '-Werror' ] - self.cxx.addCompileFlagIfSupported('-Wno-attributes') - if self.cxx.type == 'clang' or self.cxx.type == 'apple-clang': - self.cxx.addCompileFlagIfSupported('-Wno-pessimizing-move') - self.cxx.addCompileFlagIfSupported('-Wno-c++11-extensions') - self.cxx.addCompileFlagIfSupported('-Wno-user-defined-literals') + 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') std = self.get_lit_conf('std', None) if std in ['c++98', 'c++03']: # The '#define static_assert' provided by libc++ in C++03 mode # 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): san = self.get_lit_conf('use_sanitizer', '').strip()