Index: test/libcxx/compiler.py =================================================================== --- test/libcxx/compiler.py +++ test/libcxx/compiler.py @@ -85,6 +85,12 @@ out, err, rc = lit.util.executeCommand(cmd, env=env, cwd=cwd) return cmd, out, err, rc + def compileString(self, source, out=None, flags=[], env=None, cwd=None): + cmd = self.compileCmd('-', out, flags) + out, err, rc = lit.util.executeCommand(cmd, env=env, cwd=cwd, + input=source) + return cmd, out, err, rc + def link(self, source_files, out=None, flags=[], env=None, cwd=None): cmd = self.linkCmd(source_files, out, flags) out, err, rc = lit.util.executeCommand(cmd, env=env, cwd=cwd) @@ -96,6 +102,12 @@ out, err, rc = lit.util.executeCommand(cmd, env=env, cwd=cwd) return cmd, out, err, rc + def compileLinkString(self, source, out=None, flags=[], env=None, cwd=None): + cmd = self.compileLinkCmd('-', out, flags) + out, err, rc = lit.util.executeCommand(cmd, env=env, cwd=cwd, + input=source) + return cmd, out, err, rc + def compileLinkTwoSteps(self, source_file, out=None, object_file=None, flags=[], env=None, cwd=None): if not isinstance(source_file, str): @@ -161,3 +173,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()