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

Eric Fiselier eric at efcs.ca
Sat Jul 18 21:25:59 PDT 2015


EricWF created this revision.
EricWF added reviewers: danalbert, jroelofs.
EricWF added a subscriber: cfe-commits.

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.

http://reviews.llvm.org/D11333

Files:
  test/libcxx/compiler.py
  test/libcxx/test/config.py

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()
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-<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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D11333.30104.patch
Type: text/x-patch
Size: 4060 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150719/c8b09c99/attachment.bin>


More information about the cfe-commits mailing list