Skip to content

Commit

Permalink
[test] Add support for Objective-C++ tests
Browse files Browse the repository at this point in the history
Differential revision: https://reviews.llvm.org/D33049

llvm-svn: 303466
  • Loading branch information
epilk committed May 19, 2017
1 parent 631a0bb commit 0de31c7
Show file tree
Hide file tree
Showing 7 changed files with 87 additions and 4 deletions.
13 changes: 13 additions & 0 deletions libcxx/test/libcxx/selftest/test.arc.fail.mm
Original file line number Diff line number Diff line change
@@ -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
17 changes: 17 additions & 0 deletions libcxx/test/libcxx/selftest/test.arc.pass.mm
Original file line number Diff line number Diff line change
@@ -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()
{
}
13 changes: 13 additions & 0 deletions libcxx/test/libcxx/selftest/test.fail.mm
Original file line number Diff line number Diff line change
@@ -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
17 changes: 17 additions & 0 deletions libcxx/test/libcxx/selftest/test.pass.mm
Original file line number Diff line number Diff line change
@@ -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()
{
}
3 changes: 2 additions & 1 deletion libcxx/utils/libcxx/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def __init__(self, path, flags=None, compile_flags=None, link_flags=None,
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 [])
Expand Down Expand Up @@ -108,7 +109,7 @@ def _basicCmd(self, source_files, out, mode=CM_Default, flags=[],
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):
Expand Down
6 changes: 6 additions & 0 deletions libcxx/utils/libcxx/test/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,12 @@ def configure_features(self):
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:
Expand Down
22 changes: 19 additions & 3 deletions libcxx/utils/libcxx/test/format.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,14 +87,22 @@ def _execute(self, test, lit_config):
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)
Expand Down Expand Up @@ -133,6 +141,14 @@ def _execute(self, test, lit_config):
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):
Expand Down

0 comments on commit 0de31c7

Please sign in to comment.