diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/additional_compile_flags/substitutes-in-compile-flags.sh.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/additional_compile_flags/substitutes-in-compile-flags.sh.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/additional_compile_flags/substitutes-in-compile-flags.sh.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure that substitutions are performed inside additional compiler flags. -int main(int, char**) { return 0; } +// ADDITIONAL_COMPILE_FLAGS: -I %t.1 +// ADDITIONAL_COMPILE_FLAGS: -isystem %t.2 , -isysroot %t.3 +// RUN: echo "%{compile_flags}" | grep -e '-I %t.1 -isystem %t.2 -isysroot %t.3' diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/additional_compile_flags/substitutes-in-run.sh.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/additional_compile_flags/substitutes-in-run.sh.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/additional_compile_flags/substitutes-in-run.sh.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,10 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure that additional compiler flags are added to the %{compile_flags} +// substitution. -int main(int, char**) { return 0; } +// ADDITIONAL_COMPILE_FLAGS: -foo +// ADDITIONAL_COMPILE_FLAGS: -bar +// ADDITIONAL_COMPILE_FLAGS: -baz, -foom +// RUN: echo "%{compile_flags}" | grep -e '-foo -bar -baz -foom' diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/compile.fail.cpp/compile-error.compile.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/compile.fail.cpp/compile-error.compile.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/compile.fail.cpp/compile-error.compile.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,11 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// REQUIRES: verify-support -int main(int, char**) { return 0; } +// Make sure the test passes if it fails at compile-time + +struct Foo { }; +typedef Foo::x x; // expected-error{{no type named 'x' in 'Foo'}} + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/compile.fail.cpp/compile-success.compile.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/compile.fail.cpp/compile-success.compile.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/compile.fail.cpp/compile-success.compile.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it succeeds at compile-time + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/compile.fail.cpp/wrong-expected.compile.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/compile.fail.cpp/wrong-expected.compile.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/compile.fail.cpp/wrong-expected.compile.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,12 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it fails at compile-time, but the +// expected-error is wrong. + +struct Foo { }; +typedef Foo::x x; // expected-error{{this is not found in the errors}} + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/compile-error.compile.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/compile-error.compile.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/compile-error.compile.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,11 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it fails at compile-time + +struct Foo { }; +typedef Foo::x x; + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/compile-success.compile.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/compile-success.compile.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/compile-success.compile.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,6 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure the test passes if it succeeds to compile -int main(int, char**) { return 0; } +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/link-error.compile.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/link-error.compile.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/link-error.compile.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,10 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure the test passes even if there's a link error, i.e. it isn't linked. -int main(int, char**) { return 0; } +extern void this_is_an_undefined_symbol(); + +int main() { + this_is_an_undefined_symbol(); +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/run-error.compile.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/run-error.compile.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/compile.pass.cpp/run-error.compile.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure the test passes even if there's a runtime error, i.e. it isn't run. -int main(int, char**) { return 0; } +int main() { + return 1; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/fail.cpp/compile-error-with-verify.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/fail.cpp/compile-error-with-verify.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/fail.cpp/compile-error-with-verify.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,9 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure the test passes if it fails at compile-time, with verify -int main(int, char**) { return 0; } +struct Foo { }; +typedef Foo::x x; // expected-error{{no type named 'x' in 'Foo'}} + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/fail.cpp/compile-error-without-verify.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/fail.cpp/compile-error-without-verify.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/fail.cpp/compile-error-without-verify.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,9 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure the test passes if it fails at compile-time, without verify -int main(int, char**) { return 0; } +struct Foo { }; +typedef Foo::x x; + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/fail.cpp/compile-success.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/fail.cpp/compile-success.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/fail.cpp/compile-success.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it succeeds at compile-time + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/fail.cpp/wrong-expected.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/fail.cpp/wrong-expected.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/fail.cpp/wrong-expected.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,14 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// REQUIRES: verify-support -int main(int, char**) { return 0; } +// XFAIL: * + +// Make sure the test DOES NOT pass if it fails at compile-time, but the +// expected-error is wrong. + +struct Foo { }; +typedef Foo::x x; // expected-error{{this is not found in the errors}} + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/fail.mm/compile-error-with-verify.fail.mm copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/fail.mm/compile-error-with-verify.fail.mm --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/fail.mm/compile-error-with-verify.fail.mm @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,11 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// REQUIRES: objective-c++ -int main(int, char**) { return 0; } +// Make sure the test passes if it fails at compile-time, with verify + +struct Foo { }; +typedef Foo::x x; // expected-error{{no type named 'x' in 'Foo'}} + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/fail.mm/compile-error-without-verify.fail.mm copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/fail.mm/compile-error-without-verify.fail.mm --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/fail.mm/compile-error-without-verify.fail.mm @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,11 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// REQUIRES: objective-c++ -int main(int, char**) { return 0; } +// Make sure the test passes if it fails at compile-time, without verify + +struct Foo { }; +typedef Foo::x x; + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/fail.mm/compile-success.fail.mm copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/fail.mm/compile-success.fail.mm --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/fail.mm/compile-success.fail.mm @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,10 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// REQUIRES: objective-c++ -int main(int, char**) { return 0; } +// XFAIL: * + +// Make sure the test DOES NOT pass if it succeeds at compile-time + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/fail.mm/wrong-expected.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/fail.mm/wrong-expected.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/fail.mm/wrong-expected.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,14 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// REQUIRES: objective-c++ -int main(int, char**) { return 0; } +// XFAIL: * + +// Make sure the test DOES NOT pass if it fails at compile-time, but the +// expected-error is wrong. + +struct Foo { }; +typedef Foo::x x; // expected-error{{this is not found in the errors}} + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/file_dependencies/no-dependencies.sh.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/file_dependencies/no-dependencies.sh.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/file_dependencies/no-dependencies.sh.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure that %{file_dependencies} is empty when no FILE_DEPENDENCIES +// line appears. Amongst other things, this makes sure that we don't share +// file dependencies across unrelated Lit tests. -int main(int, char**) { return 0; } +// RUN: test -z "%{file_dependencies}" diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-dependencies.sh.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-dependencies.sh.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-dependencies.sh.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,7 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure that lit substitutions are expanded inside FILE_DEPENDENCIES lines. -int main(int, char**) { return 0; } +// FILE_DEPENDENCIES: %s +// RUN: echo %{file_dependencies} | grep 'substitute-in-dependencies.sh.cpp' diff --git a/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-run.sh.cpp b/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-run.sh.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/selftest/newformat/file_dependencies/substitute-in-run.sh.cpp @@ -0,0 +1,17 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Make sure %{file_dependencies} are substituted properly into RUN commands. + +// FILE_DEPENDENCIES: a.txt +// FILE_DEPENDENCIES: b.txt, c.txt +// FILE_DEPENDENCIES: /absolute/d.txt +// RUN: echo %{file_dependencies} | grep 'a.txt' +// RUN: echo %{file_dependencies} | grep 'b.txt' +// RUN: echo %{file_dependencies} | grep 'c.txt' +// RUN: echo %{file_dependencies} | grep '/absolute/d.txt' diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/link.fail.cpp/compile-error.link.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/link.fail.cpp/compile-error.link.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/link.fail.cpp/compile-error.link.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,11 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it fails at compile-time. + +struct Foo { }; +typedef Foo::x x; + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/link.fail.cpp/link-error.link.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/link.fail.cpp/link-error.link.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/link.fail.cpp/link-error.link.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,10 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure the test passes if it fails at link time. -int main(int, char**) { return 0; } +extern void this_is_an_undefined_symbol(); + +int main() { + this_is_an_undefined_symbol(); +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/link.fail.cpp/link-success.link.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/link.fail.cpp/link-success.link.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/link.fail.cpp/link-success.link.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it succeeds to link. + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/link.pass.cpp/compile-error.link.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/link.pass.cpp/compile-error.link.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/link.pass.cpp/compile-error.link.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,11 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it fails at compile-time. + +struct Foo { }; +typedef Foo::x x; + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/link.pass.cpp/link-error.link.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/link.pass.cpp/link-error.link.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/link.pass.cpp/link-error.link.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,12 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it fails to link. + +extern void this_is_an_undefined_symbol(); + +int main() { + this_is_an_undefined_symbol(); +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/link.pass.cpp/link-success.link.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/link.pass.cpp/link-success.link.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/link.pass.cpp/link-success.link.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,6 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure the test passes if it succeeds to link. -int main(int, char**) { return 0; } +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/link.pass.cpp/run-error.link.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/link.pass.cpp/run-error.link.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/link.pass.cpp/run-error.link.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,9 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure the test passes if it succeeds to link, even though it would have +// failed at runtime. -int main(int, char**) { return 0; } +int main() { + return 1; +} diff --git a/libcxx/test/libcxx/selftest/newformat/lit.local.cfg b/libcxx/test/libcxx/selftest/newformat/lit.local.cfg new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/selftest/newformat/lit.local.cfg @@ -0,0 +1,4 @@ +import libcxx.test.newformat + +if not isinstance(config.test_format, libcxx.test.newformat.CxxStandardLibraryTest): + config.unsupported = True diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/pass.cpp/compile-error.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/pass.cpp/compile-error.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/pass.cpp/compile-error.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,11 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it fails at compile-time + +struct Foo { }; +typedef Foo::x x; + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/pass.cpp/link-error.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/pass.cpp/link-error.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/pass.cpp/link-error.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,12 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it fails at link-time + +extern void this_is_an_undefined_symbol(); + +int main() { + this_is_an_undefined_symbol(); +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/pass.cpp/run-error.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/pass.cpp/run-error.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/pass.cpp/run-error.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,10 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it fails at runtime. + +int main() { + return 1; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/pass.cpp/run-success.pass.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/pass.cpp/run-success.pass.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/pass.cpp/run-success.pass.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure the test passes pass if it succeeds at runtime. -int main(int, char**) { return 0; } +int main() { + return 0; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/pass.mm/compile-error.pass.mm copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/pass.mm/compile-error.pass.mm --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/pass.mm/compile-error.pass.mm @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,13 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// REQUIRES: objective-c++ -int main(int, char**) { return 0; } +// XFAIL: * + +// Make sure the test DOES NOT pass if it fails at compile-time + +struct Foo { }; +typedef Foo::x x; + +int main() { } diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/pass.mm/link-error.pass.mm copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/pass.mm/link-error.pass.mm --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/pass.mm/link-error.pass.mm @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,14 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// REQUIRES: objective-c++ -int main(int, char**) { return 0; } +// XFAIL: * + +// Make sure the test DOES NOT pass if it fails at link-time + +extern void this_is_an_undefined_symbol(); + +int main() { + this_is_an_undefined_symbol(); +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/pass.mm/no-arc.pass.mm copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/pass.mm/no-arc.pass.mm --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/pass.mm/no-arc.pass.mm @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,14 @@ // //===----------------------------------------------------------------------===// +// REQUIRES: objective-c++ + +// Make sure ARC is not enabled by default in these tests. + #if __has_feature(objc_arc) -#error "arc should *not* be enabled" +# error "arc should not be enabled by default" #endif -int main(int, char**) { return 0; } +int main() { + return 0; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/pass.mm/run-error.pass.mm copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/pass.mm/run-error.pass.mm --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/pass.mm/run-error.pass.mm @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,12 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// REQUIRES: objective-c++ -int main(int, char**) { return 0; } +// XFAIL: * + +// Make sure the test DOES NOT pass if it fails at runtime. + +int main() { + return 1; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/pass.mm/run-success.pass.mm copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/pass.mm/run-success.pass.mm --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/pass.mm/run-success.pass.mm @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,10 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// REQUIRES: objective-c++ -int main(int, char**) { return 0; } +// Make sure the test passes pass if it succeeds at runtime. + +int main() { + return 0; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/pass.mm/use-objective-cxx.pass.mm copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/pass.mm/use-objective-cxx.pass.mm --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/pass.mm/use-objective-cxx.pass.mm @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,13 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// REQUIRES: objective-c++ -int main(int, char**) { return 0; } +// Make sure we can use Objective C++ features in these tests. + +@interface Foo +@end + +int main() { + return 0; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/run.fail.cpp/compile-error.run.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/run.fail.cpp/compile-error.run.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/run.fail.cpp/compile-error.run.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,13 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it fails at compile-time + +struct Foo { }; +typedef Foo::x x; + +int main() { + return 1; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/run.fail.cpp/link-error.run.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/run.fail.cpp/link-error.run.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/run.fail.cpp/link-error.run.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,13 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure that the test DOES NOT pass if it fails at link-time + +extern void this_is_an_undefined_symbol(); + +int main() { + this_is_an_undefined_symbol(); + return 1; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/run.fail.cpp/run-error.run.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/run.fail.cpp/run-error.run.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/run.fail.cpp/run-error.run.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure the test passes if it fails at runtime. -int main(int, char**) { return 0; } +int main() { + return 1; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/run.fail.cpp/run-success.run.fail.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/run.fail.cpp/run-success.run.fail.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/run.fail.cpp/run-success.run.fail.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,10 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it succeeds at runtime. + +int main() { + return 0; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/sh.cpp/empty.sh.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/sh.cpp/empty.sh.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/sh.cpp/empty.sh.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,6 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it has no 'RUN:' steps diff --git a/libcxx/test/libcxx/selftest/newformat/sh.cpp/remote-substitutions.sh.cpp b/libcxx/test/libcxx/selftest/newformat/sh.cpp/remote-substitutions.sh.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/selftest/newformat/sh.cpp/remote-substitutions.sh.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Make sure that test-executables can appear in RUN lines and be executed +// effectively. This somewhat difficult-to-understand test checks that when +// we run with a remote executor, test-executables are copied to the remote +// host and their path is fixed up (directly in the command-line) to their +// path on the remote host instead of the local host. +// +// We also check that the path of test-executables is replaced whether they +// appear first in the command-line or not. + +// FILE_DEPENDENCIES: %t.exe +// RUN: %{cxx} %{compile_flags} %{link_flags} -o %t.exe %s +// RUN: %{exec} %t.exe 0 +// RUN: %{exec} ! %t.exe 1 + +#include +#include + +int main(int argc, char** argv) { + assert(argc == 2); + int ret = std::atoi(argv[1]); + return ret; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/sh.cpp/run-error.sh.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/sh.cpp/run-error.sh.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/sh.cpp/run-error.sh.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// XFAIL: * -int main(int, char**) { return 0; } +// Make sure the test DOES NOT pass if it fails to run + +// RUN: exit 1 diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/newformat/sh.cpp/run-success.sh.cpp copy from libcxx/test/libcxx/selftest/test.pass.mm copy to libcxx/test/libcxx/selftest/newformat/sh.cpp/run-success.sh.cpp --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/newformat/sh.cpp/run-success.sh.cpp @@ -1,4 +1,3 @@ -// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. @@ -7,8 +6,6 @@ // //===----------------------------------------------------------------------===// -#if __has_feature(objc_arc) -#error "arc should *not* be enabled" -#endif +// Make sure the test passes if it succeeds to run -int main(int, char**) { return 0; } +// RUN: exit 0 diff --git a/libcxx/test/libcxx/selftest/newformat/sh.cpp/substitutions.sh.cpp b/libcxx/test/libcxx/selftest/newformat/sh.cpp/substitutions.sh.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/libcxx/selftest/newformat/sh.cpp/substitutions.sh.cpp @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// Make sure we have access to the following substitutions at all times: +// - %{cxx} +// - %{compile_flags} +// - %{link_flags} +// - %{exec} + +// FILE_DEPENDENCIES: %t.exe +// RUN: %{cxx} %{compile_flags} %{link_flags} -o %t.exe %s +// RUN: %{exec} %t.exe "HELLO" + +#include +#include + +int main(int argc, char** argv) { + assert(argc == 2); + + std::string arg = argv[1]; + assert(arg == "HELLO"); + return 0; +} diff --git a/libcxx/test/libcxx/selftest/test.pass.mm b/libcxx/test/libcxx/selftest/test.pass.mm --- a/libcxx/test/libcxx/selftest/test.pass.mm +++ b/libcxx/test/libcxx/selftest/test.pass.mm @@ -7,6 +7,8 @@ // //===----------------------------------------------------------------------===// +// REQUIRES: objective-c++ + #if __has_feature(objc_arc) #error "arc should *not* be enabled" #endif diff --git a/libcxx/test/lit.cfg b/libcxx/test/lit.cfg --- a/libcxx/test/lit.cfg +++ b/libcxx/test/lit.cfg @@ -52,4 +52,9 @@ configuration = config_module.Configuration(lit_config, config) configuration.configure() configuration.print_config_info() -config.test_format = configuration.get_test_format() +if lit_config.params.get('use_new_format', False): + lit_config.note("Using the experimental libc++ testing format") + import libcxx.test.newformat + config.test_format = libcxx.test.newformat.CxxStandardLibraryTest() +else: + config.test_format = configuration.get_test_format() diff --git a/libcxx/utils/libcxx/test/newformat.py b/libcxx/utils/libcxx/test/newformat.py new file mode 100644 --- /dev/null +++ b/libcxx/utils/libcxx/test/newformat.py @@ -0,0 +1,243 @@ +#===----------------------------------------------------------------------===## +# +# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +# See https://llvm.org/LICENSE.txt for license information. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +# +#===----------------------------------------------------------------------===## + +import lit +import os +import pipes + +class CxxStandardLibraryTest(lit.formats.TestFormat): + """ + Lit test format for the C++ Standard Library conformance test suite. + + This test format is based on top of the ShTest format -- it basically + creates a shell script performing the right operations (compile/link/run) + based on the extension of the test file it encounters. It supports files + with the following extensions: + + FOO.pass.cpp - Compiles, links and runs successfully + FOO.pass.mm - Same as .pass.cpp, but for Objective-C++ + FOO.run.fail.cpp - Compiles and links successfully, but fails at runtime + FOO.compile.pass.cpp - Compiles successfully, link and run not attempted + FOO.compile.fail.cpp - Does not compile successfully. These tests run with + clang-verify. + FOO.link.pass.cpp - Compiles and links successfully, run not attempted + FOO.link.fail.cpp - Compiles successfully, but fails to link + FOO.sh.cpp - A builtin lit Shell test + + FOO.fail.cpp - Does not compile successfully -- run with clang-verify + if any expected-meow appears in the file, otherwise + just test that compilation fails. This is supported + only for backwards compatibility with the test suite + FOO.fail.mm - Same as .fail.cpp, but for Objective-C++ + + The test format operates by assuming that each test's configuration provides + the following substitutions, which it will reuse in the shell scripts it + constructs: + %{cxx} - A command that can be used to invoke the compiler + %{compile_flags} - Flags to use when compiling a test case + %{link_flags} - Flags to use when linking a test case + %{exec} - A command to prefix the execution of executables + + Note that when building an executable (as opposed to only compiling a source + file), both %{compile_flags} and %{link_flags} will be used in the same + command line. In other words, the test format doesn't perform separate + compilation and linking steps in this case. + + + In addition to everything that's supported in Lit ShTests, this test format + also understands the following directives inside test files: + + // FILE_DEPENDENCIES: file, directory, /path/to/file + + This directive expresses that the test requires the provided files + or directories in order to run. An example is a test that requires + some test input stored in a data file. When a test file contains + such a directive, this test format will collect them and make them + available in a special %{file_dependencies} substitution. The intent + is that if one needs to e.g. execute tests on a remote host, the + %{exec} substitution could use %{file_dependencies} to know which + files and directories to copy to the remote host. + + // ADDITIONAL_COMPILE_FLAGS: flag1, flag2, flag3 + + This directive will cause the provided flags to be added to the + %{compile_flags} substitution for the test that contains it. This + allows adding special compilation flags without having to use a + .sh.cpp test, which would be more powerful but perhaps overkill. + + + Design note: + This test format never implicitly disables a type of test. For example, + we could be tempted to automatically mark `.compile.fail.cpp` tests as + UNSUPPORTED when clang-verify isn't supported by the compiler. However, + this sort of logic has been known to cause tests to be ignored in the + past, so we favour having tests mark themselves as unsupported explicitly. + + This test format still needs work in the following areas: + - It doesn't support the MODULES_DEFINES from the old test format, but + that can be achieved easily with ADDITIONAL_COMPILE_FLAGS. + - It is unknown how well it works on Windows yet. + """ + def getTestsInDirectory(self, testSuite, pathInSuite, litConfig, localConfig): + SUPPORTED_SUFFIXES = ['.pass.cpp', '.run.fail.cpp', + '.pass.mm', + '.compile.pass.cpp', '.compile.fail.cpp', + '.link.pass.cpp', '.link.fail.cpp', + '.sh.cpp', + '.fail.cpp', '.fail.mm'] + sourcePath = testSuite.getSourcePath(pathInSuite) + for filename in os.listdir(sourcePath): + # Ignore dot files and excluded tests. + if filename.startswith('.') or filename in localConfig.excludes: + continue + + filepath = os.path.join(sourcePath, filename) + if not os.path.isdir(filepath): + if any([filename.endswith(ext) for ext in SUPPORTED_SUFFIXES]): + yield lit.Test.Test(testSuite, pathInSuite + (filename,), localConfig) + + def _checkSubstitutions(self, substitutions): + substitutions = [s for (s, _) in substitutions] + for s in ['%{cxx}', '%{compile_flags}', '%{link_flags}', '%{exec}']: + assert s in substitutions, "Required substitution {} was not provided".format(s) + + # Determine whether -verify should be used for a given test. We use -verify + # if the compiler supports it and there's at least one -verify tag in the + # source file. + # + # This is only supported for backwards compatibility with .fail.cpp tests. + def _useVerify(self, test, litConfig): + VERIFY_TAGS = (b'expected-note', b'expected-remark', + b'expected-warning', b'expected-error', + b'expected-no-diagnostics') + with open(test.getSourcePath(), 'rb') as f: + contents = f.read() + testContainsTags = any(tag in contents for tag in VERIFY_TAGS) + + command = "echo | %{cxx} -xc++ - -Werror -fsyntax-only -Xclang -verify-ignore-unexpected" + result = lit.TestRunner.executeShTest(test, litConfig, + useExternalSh=True, + preamble_commands=[command]) + compilerSupportsVerify = result.code != lit.Test.FAIL + return compilerSupportsVerify and testContainsTags + + def execute(self, test, litConfig): + self._checkSubstitutions(test.config.substitutions) + VERIFY_FLAGS = '-Xclang -verify -Xclang -verify-ignore-unexpected=note -ferror-limit=0' + filename = test.path_in_suite[-1] + if filename.endswith('.sh.cpp'): + steps = [ ] # The steps are already in the script + return self._executeShTest(test, litConfig, steps) + elif filename.endswith('.compile.pass.cpp'): + steps = [ + "%dbg(COMPILED WITH) %{cxx} %s %{compile_flags} -fsyntax-only" + ] + return self._executeShTest(test, litConfig, steps) + elif filename.endswith('.compile.fail.cpp'): + steps = [ + "%dbg(COMPILED WITH) %{cxx} %s %{compile_flags} -fsyntax-only " + VERIFY_FLAGS + ] + return self._executeShTest(test, litConfig, steps) + elif filename.endswith('.link.pass.cpp'): + steps = [ + "%dbg(COMPILED WITH) %{cxx} %s %{compile_flags} %{link_flags} -o %t.exe" + ] + return self._executeShTest(test, litConfig, steps) + elif filename.endswith('.link.fail.cpp'): + steps = [ + "%dbg(COMPILED WITH) %{cxx} %s %{compile_flags} -c -o %t.o", + "%dbg(LINKED WITH) ! %{cxx} %t.o %{link_flags} -o %t.exe" + ] + return self._executeShTest(test, litConfig, steps) + elif filename.endswith('.run.fail.cpp'): + steps = [ + "%dbg(COMPILED WITH) %{cxx} %s %{compile_flags} %{link_flags} -o %t.exe", + "%dbg(EXECUTED AS) %{exec} ! %t.exe" + ] + return self._executeShTest(test, litConfig, steps, fileDependencies=['%t.exe']) + # Make sure to check these ones last, since they will match other + # suffixes above too. + elif filename.endswith('.pass.cpp') or filename.endswith('.pass.mm'): + steps = [ + "%dbg(COMPILED WITH) %{cxx} %s %{compile_flags} %{link_flags} -o %t.exe", + "%dbg(EXECUTED AS) %{exec} %t.exe" + ] + return self._executeShTest(test, litConfig, steps, fileDependencies=['%t.exe']) + # This is the same as .compile.fail.cpp, provided for backwards + # compatibility with the test suite. + elif filename.endswith('.fail.cpp') or filename.endswith('.fail.mm'): + if self._useVerify(test, litConfig): + steps = [ + "%dbg(COMPILED WITH) %{cxx} %s %{compile_flags} -fsyntax-only " + VERIFY_FLAGS + ] + else: + steps = [ + "%dbg(COMPILED WITH) ! %{cxx} %s %{compile_flags} -fsyntax-only" + ] + return self._executeShTest(test, litConfig, steps) + else: + return lit.Test.Result(lit.Test.FAIL, "Unknown test suffix for '{}'".format(filename)) + + # Utility function to add compile flags in lit.local.cfg files. + def addCompileFlags(self, config, *flags): + string = ' '.join(flags) + config.substitutions = [(s, x + ' ' + string) if s == '%{compile_flags}' else (s, x) for (s, x) in config.substitutions] + + # Modified version of lit.TestRunner.executeShTest to handle custom parsers correctly. + def _executeShTest(self, test, litConfig, steps, fileDependencies=None): + recursiveExpansionLimit = 10 # TODO: Use the value in litConfig once we set it. + if test.config.unsupported: + return lit.Test.Result(lit.Test.UNSUPPORTED, 'Test is unsupported') + + additionalCompileFlags = [] + fileDependencies = fileDependencies or [] + parsers = [ + lit.TestRunner.IntegratedTestKeywordParser('FILE_DEPENDENCIES:', + lit.TestRunner.ParserKind.LIST, + initial_value=fileDependencies), + lit.TestRunner.IntegratedTestKeywordParser('ADDITIONAL_COMPILE_FLAGS:', + lit.TestRunner.ParserKind.LIST, + initial_value=additionalCompileFlags) + ] + + script = list(steps) + parsed = lit.TestRunner.parseIntegratedTestScript(test, additional_parsers=parsers, + require_script=not script) + if isinstance(parsed, lit.Test.Result): + return parsed + script += parsed + + if litConfig.noExecute: + return lit.Test.Result(lit.Test.PASS) + + # Add compile flags specified with ADDITIONAL_COMPILE_FLAGS. + self.addCompileFlags(test.config, *additionalCompileFlags) + + tmpDir, tmpBase = lit.TestRunner.getTempPaths(test) + useExternalSh = True + substitutions = lit.TestRunner.getDefaultSubstitutions(test, tmpDir, tmpBase, + normalize_slashes=useExternalSh) + + # Perform substitutions inside FILE_DEPENDENCIES lines (or injected dependencies). + # This allows using variables like %t in file dependencies. Also note that we really + # need to resolve %{file_dependencies} now, because otherwise we won't be able to + # make all paths absolute below. + fileDependencies = lit.TestRunner.applySubstitutions(fileDependencies, substitutions, + recursion_limit=recursiveExpansionLimit) + + # Add the %{file_dependencies} substitution before we perform substitutions + # inside the script. + testDir = os.path.dirname(test.getSourcePath()) + fileDependencies = [f if os.path.isabs(f) else os.path.join(testDir, f) for f in fileDependencies] + substitutions.append(('%{file_dependencies}', ' '.join(map(pipes.quote, fileDependencies)))) + + # Perform substitution in the script itself. + script = lit.TestRunner.applySubstitutions(script, substitutions, + recursion_limit=recursiveExpansionLimit) + + return lit.TestRunner._runShTest(test, litConfig, useExternalSh, script, tmpBase) diff --git a/libcxxabi/test/lit.cfg b/libcxxabi/test/lit.cfg --- a/libcxxabi/test/lit.cfg +++ b/libcxxabi/test/lit.cfg @@ -64,4 +64,9 @@ configuration = config_module.Configuration(lit_config, config) configuration.configure() configuration.print_config_info() -config.test_format = configuration.get_test_format() +if lit_config.params.get('use_new_format', False): + lit_config.note("Using the experimental libc++ testing format") + import libcxx.test.newformat + config.test_format = libcxx.test.newformat.CxxStandardLibraryTest() +else: + config.test_format = configuration.get_test_format()