From 0de31c7e531a154e401cf0e639e78bdd76a06f6d Mon Sep 17 00:00:00 2001 From: Erik Pilkington Date: Fri, 19 May 2017 23:02:49 +0000 Subject: [PATCH] [test] Add support for Objective-C++ tests Differential revision: https://reviews.llvm.org/D33049 llvm-svn: 303466 --- libcxx/test/libcxx/selftest/test.arc.fail.mm | 13 +++++++++++++ libcxx/test/libcxx/selftest/test.arc.pass.mm | 17 +++++++++++++++++ libcxx/test/libcxx/selftest/test.fail.mm | 13 +++++++++++++ libcxx/test/libcxx/selftest/test.pass.mm | 17 +++++++++++++++++ libcxx/utils/libcxx/compiler.py | 3 ++- libcxx/utils/libcxx/test/config.py | 6 ++++++ libcxx/utils/libcxx/test/format.py | 22 +++++++++++++++++++--- 7 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 libcxx/test/libcxx/selftest/test.arc.fail.mm create mode 100644 libcxx/test/libcxx/selftest/test.arc.pass.mm create mode 100644 libcxx/test/libcxx/selftest/test.fail.mm create mode 100644 libcxx/test/libcxx/selftest/test.pass.mm diff --git a/libcxx/test/libcxx/selftest/test.arc.fail.mm b/libcxx/test/libcxx/selftest/test.arc.fail.mm new file mode 100644 index 0000000..a185eab --- /dev/null +++ b/libcxx/test/libcxx/selftest/test.arc.fail.mm @@ -0,0 +1,13 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#if __has_feature(objc_arc) +#error This test should not compile. +#endif diff --git a/libcxx/test/libcxx/selftest/test.arc.pass.mm b/libcxx/test/libcxx/selftest/test.arc.pass.mm new file mode 100644 index 0000000..ec272a8 --- /dev/null +++ b/libcxx/test/libcxx/selftest/test.arc.pass.mm @@ -0,0 +1,17 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#if __has_feature(objc_arc) == 0 +#error "arc should be enabled" +#endif + +int main() +{ +} diff --git a/libcxx/test/libcxx/selftest/test.fail.mm b/libcxx/test/libcxx/selftest/test.fail.mm new file mode 100644 index 0000000..764daf0 --- /dev/null +++ b/libcxx/test/libcxx/selftest/test.fail.mm @@ -0,0 +1,13 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#if __has_feature(objc_arc) == 0 +#error This test should not compile. +#endif diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/test.pass.mm new file mode 100644 index 0000000..b428955 --- /dev/null +++ b/libcxx/test/libcxx/selftest/test.pass.mm @@ -0,0 +1,17 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#if __has_feature(objc_arc) +#error "arc should *not* be enabled" +#endif + +int main() +{ +} diff --git a/libcxx/utils/libcxx/compiler.py b/libcxx/utils/libcxx/compiler.py index 983bc26..e908e260 100644 --- a/libcxx/utils/libcxx/compiler.py +++ b/libcxx/utils/libcxx/compiler.py @@ -24,6 +24,7 @@ class CXXCompiler(object): modules_flags=None, use_modules=False, use_ccache=False, use_warnings=False, compile_env=None, cxx_type=None, cxx_version=None): + self.source_lang = 'c++' self.path = path self.flags = list(flags or []) self.compile_flags = list(compile_flags or []) @@ -108,7 +109,7 @@ class CXXCompiler(object): if out is not None: cmd += ['-o', out] if input_is_cxx: - cmd += ['-x', 'c++'] + cmd += ['-x', self.source_lang] if isinstance(source_files, list): cmd += source_files elif isinstance(source_files, str): diff --git a/libcxx/utils/libcxx/test/config.py b/libcxx/utils/libcxx/test/config.py index 25553c7..2118f9c 100644 --- a/libcxx/utils/libcxx/test/config.py +++ b/libcxx/utils/libcxx/test/config.py @@ -466,6 +466,12 @@ class Configuration(object): self.config.available_features.add('glibc-%s' % maj_v) self.config.available_features.add('glibc-%s.%s' % (maj_v, min_v)) + # Support Objective-C++ only on MacOS and if the compiler supports it. + if self.target_info.platform() == "darwin" and \ + self.target_info.is_host_macosx() and \ + self.cxx.hasCompileFlag(["-x", "objective-c++", "-fobjc-arc"]): + self.config.available_features.add("objective-c++") + def configure_compile_flags(self): no_default_flags = self.get_lit_bool('no_default_flags', False) if not no_default_flags: diff --git a/libcxx/utils/libcxx/test/format.py b/libcxx/utils/libcxx/test/format.py index 3ac5472..317fc80 100644 --- a/libcxx/utils/libcxx/test/format.py +++ b/libcxx/utils/libcxx/test/format.py @@ -87,14 +87,22 @@ class LibcxxTestFormat(object): name_root, name_ext = os.path.splitext(name) is_libcxx_test = test.path_in_suite[0] == 'libcxx' is_sh_test = name_root.endswith('.sh') - is_pass_test = name.endswith('.pass.cpp') - is_fail_test = name.endswith('.fail.cpp') - assert is_sh_test or name_ext == '.cpp', 'non-cpp file must be sh test' + is_pass_test = name.endswith('.pass.cpp') or name.endswith('.pass.mm') + is_fail_test = name.endswith('.fail.cpp') or name.endswith('.fail.mm') + is_objcxx_test = name.endswith('.mm') + is_objcxx_arc_test = name.endswith('.arc.pass.mm') or \ + name.endswith('.arc.fail.mm') + assert is_sh_test or name_ext == '.cpp' or name_ext == '.mm', \ + 'non-cpp file must be sh test' if test.config.unsupported: return (lit.Test.UNSUPPORTED, "A lit.local.cfg marked this unsupported") + if is_objcxx_test and not \ + 'objective-c++' in test.config.available_features: + return (lit.Test.UNSUPPORTED, "Objective-C++ is not supported") + parsers = self._make_custom_parsers() script = lit.TestRunner.parseIntegratedTestScript( test, additional_parsers=parsers, require_script=is_sh_test) @@ -133,6 +141,14 @@ class LibcxxTestFormat(object): if '#define _LIBCPP_ASSERT' in contents: test_cxx.useModules(False) + if is_objcxx_test: + test_cxx.source_lang = 'objective-c++' + if is_objcxx_arc_test: + test_cxx.compile_flags += ['-fobjc-arc'] + else: + test_cxx.compile_flags += ['-fno-objc-arc'] + test_cxx.link_flags += ['-framework', 'Foundation'] + # Dispatch the test based on its suffix. if is_sh_test: if not isinstance(self.executor, LocalExecutor): -- 2.7.4