[libcxx] r217009 - test: Allow using clang -verify for failures rather than exit 1

Justin Bogner mail at justinbogner.com
Tue Sep 2 21:55:53 PDT 2014


Hey Eric,

This implements the clang -verify idea that we discussed after r216317
and converts one test as an example. WDYT?

-- Justin

Justin Bogner <mail at justinbogner.com> writes:
> Author: bogner
> Date: Tue Sep  2 23:32:08 2014
> New Revision: 217009
>
> URL: http://llvm.org/viewvc/llvm-project?rev=217009&view=rev
> Log:
> test: Allow using clang -verify for failures rather than exit 1
>
> Currently, failure tests work by checking that compilation exits 1.
> This can lead to tests that fail for the wrong reason, so it'd be
> preferable to convert them to check for specific errors.
>
> This adds use_clang_verify parameter that runs failure tests using
> clang's -verify flag. I'll convert some tests in subsequent commits,
> and once all of the tests are converted we should key this on whether
> cxx_under_test is clang.
>
> I've also converted one of the unique.ptr tests, since it's the one
> that motivated the idea of using clang -verify when possible in the
> review of r216317.
>
> Modified:
>     libcxx/trunk/test/lit.cfg
>     libcxx/trunk/test/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.fail.cpp
>
> Modified: libcxx/trunk/test/lit.cfg
> URL:
> http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/lit.cfg?rev=217009&r1=217008&r2=217009&view=diff==============================================================================
> --- libcxx/trunk/test/lit.cfg (original)
> +++ libcxx/trunk/test/lit.cfg Tue Sep  2 23:32:08 2014
> @@ -28,8 +28,10 @@ class LibcxxTestFormat(lit.formats.FileB
>        FOO.fail.cpp - Negative test case which is expected to fail compilation.
>      """
>  
> -    def __init__(self, cxx_under_test, cpp_flags, ld_flags, exec_env):
> +    def __init__(self, cxx_under_test, use_verify_for_fail,
> +                 cpp_flags, ld_flags, exec_env):
>          self.cxx_under_test = cxx_under_test
> +        self.use_verify_for_fail = use_verify_for_fail
>          self.cpp_flags = list(cpp_flags)
>          self.ld_flags = list(ld_flags)
>          self.exec_env = dict(exec_env)
> @@ -116,13 +118,17 @@ class LibcxxTestFormat(lit.formats.FileB
>          if expected_compile_fail:
>              cmd = [self.cxx_under_test, '-c',
>                     '-o', '/dev/null', source_path] + self.cpp_flags
> -            out, err, exitCode = self.execute_command(cmd)
> -            if exitCode == 1:
> +            expected_rc = 1
> +            if self.use_verify_for_fail:
> +                cmd += ['-Xclang', '-verify']
> +                expected_rc = 0
> +            out, err, rc = self.execute_command(cmd)
> +            if rc == expected_rc:
>                  return lit.Test.PASS, ""
>              else:
>                  report = """Command: %s\n""" % ' '.join(["'%s'" % a
>                                                           for a in cmd])
> -                report += """Exit Code: %d\n""" % exitCode
> +                report += """Exit Code: %d\n""" % rc
>                  if out:
>                      report += """Standard Output:\n--\n%s--""" % out
>                  if err:
> @@ -190,6 +196,7 @@ class Configuration(object):
>          self.compile_flags = []
>          self.link_flags = []
>          self.use_system_lib = False
> +        self.use_clang_verify = False
>  
>          if platform.system() not in ('Darwin', 'FreeBSD', 'Linux'):
>              self.lit_config.fatal("unrecognized system")
> @@ -202,12 +209,24 @@ class Configuration(object):
>                  val = default
>          return val
>  
> +    def get_lit_bool(self, name):
> +        conf = self.get_lit_conf(name)
> +        if conf is None:
> +            return None
> +        if conf.lower() in ('1', 'true'):
> +            return True
> +        if conf.lower() in ('', '0', 'false'):
> +            return False
> +        self.lit_config.fatal(
> +            "parameter '{}' should be true or false".format(name))
> +
>      def configure(self):
>          self.configure_cxx()
>          self.configure_triple()
>          self.configure_src_root()
>          self.configure_obj_root()
>          self.configure_use_system_lib()
> +        self.configure_use_clang_verify()
>          self.configure_env()
>          self.configure_std_flag()
>          self.configure_compile_flags()
> @@ -218,6 +237,7 @@ class Configuration(object):
>      def get_test_format(self):
>          return LibcxxTestFormat(
>              self.cxx,
> +            self.use_clang_verify,
>              cpp_flags=['-nostdinc++'] + self.compile_flags,
>              ld_flags=['-nodefaultlibs'] + self.link_flags,
>              exec_env=self.env)
> @@ -251,21 +271,22 @@ class Configuration(object):
>          # the locally built one; the former mode is useful for testing ABI
>          # compatibility between the current headers and a shipping dynamic
>          # library.
> -        use_system_lib_str = self.get_lit_conf('use_system_lib')
> -        if use_system_lib_str:
> -            if use_system_lib_str.lower() in ('1', 'true'):
> -                self.use_system_lib = True
> -            elif use_system_lib_str.lower() in ('', '0', 'false'):
> -                self.use_system_lib = False
> -            else:
> -                self.lit_config.fatal(
> -                    'user parameter use_system_lib should be 0 or 1')
> -        else:
> +        self.use_system_lib = self.get_lit_bool('use_system_lib')
> +        if self.use_system_lib is None:
>              # Default to testing against the locally built libc++ library.
>              self.use_system_lib = False
>              self.lit_config.note(
>                  "inferred use_system_lib as: %r" % self.use_system_lib)
>  
> +    def configure_use_clang_verify(self):
> +        '''If set, run clang with -verify on failing tests.'''
> +        self.use_clang_verify = self.get_lit_bool('use_clang_verify')
> +        if self.use_clang_verify is None:
> +            # TODO: Default this to True when using clang.
> +            self.use_clang_verify = False
> +            self.lit_config.note(
> +                "inferred use_clang_verify as: %r" % self.use_clang_verify)
> +
>      def configure_features(self):
>          # Figure out which of the required locales we support
>          locales = {
>
> Modified: libcxx/trunk/test/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.fail.cpp
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.fail.cpp?rev=217009&r1=217008&r2=217009&view=diff==============================================================================
> --- libcxx/trunk/test/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.fail.cpp (original)
> +++ libcxx/trunk/test/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.fail.cpp Tue Sep  2 23:32:08 2014
> @@ -19,8 +19,9 @@
>  
>  class Deleter
>  {
> -
> -    Deleter() {}
> +    // expected-error at memory:* {{base class 'Deleter' has private default constructor}}
> +    // expected-note at memory:* + {{in instantiation of member function}}
> +    Deleter() {} // expected-note {{implicitly declared private here}}
>  
>  public:
>  
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list