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

Eric Fiselier eric at efcs.ca
Tue Sep 2 22:14:05 PDT 2014


Hi Justin,

What I think we should do is key `use_clang_verify` on whether
`cxx_under_test` is clang right away. Then for the time being we can add
`// VERIFY` to the top of all
converted tests. Then we can choose to run it as a verify test if
`use_clang_verify` is true and `// VERIFY` is present. Once we convert all
the tests we can
remove the `// VERIFY` tags.

Thanks for getting this started.
/Eric


On Tue, Sep 2, 2014 at 10:55 PM, Justin Bogner <mail at justinbogner.com>
wrote:

> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140902/aa486944/attachment.html>


More information about the cfe-commits mailing list