diff options
author | JF Bastien <jfbastien@apple.com> | 2019-02-04 20:31:13 +0000 |
---|---|---|
committer | JF Bastien <jfbastien@apple.com> | 2019-02-04 20:31:13 +0000 |
commit | 2df59c50688c122bbcae7467d3eaf862c3ea3088 (patch) | |
tree | 29c9a3e1c54fe76a506ffecc0cc4d8fbaba5cb04 /libcxx/test/std/utilities/variant/variant.variant | |
parent | 6fd4e7fe0258ff71fe759535236883ea9060587c (diff) | |
download | bcm5719-llvm-2df59c50688c122bbcae7467d3eaf862c3ea3088.tar.gz bcm5719-llvm-2df59c50688c122bbcae7467d3eaf862c3ea3088.zip |
Support tests in freestanding
Summary:
Freestanding is *weird*. The standard allows it to differ in a bunch of odd
manners from regular C++, and the committee would like to improve that
situation. I'd like to make libc++ behave better with what freestanding should
be, so that it can be a tool we use in improving the standard. To do that we
need to try stuff out, both with "freestanding the language mode" and
"freestanding the library subset".
Let's start with the super basic: run the libc++ tests in freestanding, using
clang as the compiler, and see what works. The easiest hack to do this:
In utils/libcxx/test/config.py add:
self.cxx.compile_flags += ['-ffreestanding']
Run the tests and they all fail.
Why? Because in freestanding `main` isn't special. This "not special" property
has two effects: main doesn't get mangled, and main isn't allowed to omit its
`return` statement. The first means main gets mangled and the linker can't
create a valid executable for us to test. The second means we spew out warnings
(ew) and the compiler doesn't insert the `return` we omitted, and main just
falls of the end and does whatever undefined behavior (if you're luck, ud2
leading to non-zero return code).
Let's start my work with the basics. This patch changes all libc++ tests to
declare `main` as `int main(int, char**` so it mangles consistently (enabling us
to declare another `extern "C"` main for freestanding which calls the mangled
one), and adds `return 0;` to all places where it was missing. This touches 6124
files, and I apologize.
The former was done with The Magic Of Sed.
The later was done with a (not quite correct but decent) clang tool:
https://gist.github.com/jfbastien/793819ff360baa845483dde81170feed
This works for most tests, though I did have to adjust a few places when e.g.
the test runs with `-x c`, macros are used for main (such as for the filesystem
tests), etc.
Once this is in we can create a freestanding bot which will prevent further
regressions. After that, we can start the real work of supporting C++
freestanding fairly well in libc++.
<rdar://problem/47754795>
Reviewers: ldionne, mclow.lists, EricWF
Subscribers: christof, jkorous, dexonsmith, arphaman, miyuki, libcxx-commits
Differential Revision: https://reviews.llvm.org/D57624
llvm-svn: 353086
Diffstat (limited to 'libcxx/test/std/utilities/variant/variant.variant')
23 files changed, 69 insertions, 23 deletions
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp index 67deb3f2c62..6a4bb048627 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp @@ -254,10 +254,12 @@ void test_T_assignment_performs_assignment() { #endif // TEST_HAS_NO_EXCEPTIONS } -int main() { +int main(int, char**) { test_T_assignment_basic(); test_T_assignment_performs_construction(); test_T_assignment_performs_assignment(); test_T_assignment_noexcept(); test_T_assignment_sfinae(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/copy.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/copy.pass.cpp index 6a59989ddad..c36375cf299 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/copy.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/copy.pass.cpp @@ -590,7 +590,7 @@ void test_constexpr_copy_assignment() { #endif // > C++17 } -int main() { +int main(int, char**) { test_copy_assignment_empty_empty(); test_copy_assignment_non_empty_empty(); test_copy_assignment_empty_non_empty(); @@ -599,4 +599,6 @@ int main() { test_copy_assignment_sfinae(); test_copy_assignment_not_noexcept(); test_constexpr_copy_assignment(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/move.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/move.pass.cpp index 833883d294f..c213af4b2e7 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/move.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/move.pass.cpp @@ -506,7 +506,7 @@ void test_constexpr_move_assignment() { #endif // > C++17 } -int main() { +int main(int, char**) { test_move_assignment_empty_empty(); test_move_assignment_non_empty_empty(); test_move_assignment_empty_non_empty(); @@ -515,4 +515,6 @@ int main() { test_move_assignment_sfinae(); test_move_assignment_noexcept(); test_constexpr_move_assignment(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp index 7357b9b56c0..4ebfe052de1 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp @@ -126,8 +126,10 @@ void test_T_ctor_basic() { #endif } -int main() { +int main(int, char**) { test_T_ctor_basic(); test_T_ctor_noexcept(); test_T_ctor_sfinae(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/copy.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/copy.pass.cpp index b6471052f64..00c94ee33c3 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/copy.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/copy.pass.cpp @@ -260,7 +260,7 @@ void test_constexpr_copy_ctor() { #endif // > C++17 } -int main() { +int main(int, char**) { test_copy_ctor_basic(); test_copy_ctor_valueless_by_exception(); test_copy_ctor_sfinae(); @@ -274,4 +274,6 @@ int main() { (void) v2; } #endif + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/default.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/default.pass.cpp index ec6eb289ba6..1766ee1dbc0 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/default.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/default.pass.cpp @@ -122,9 +122,11 @@ void test_default_ctor_basic() { } } -int main() { +int main(int, char**) { test_default_ctor_basic(); test_default_ctor_sfinae(); test_default_ctor_noexcept(); test_default_ctor_throws(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_index_args.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_index_args.pass.cpp index a268adcea50..cb7d68a659f 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_index_args.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_index_args.pass.cpp @@ -104,7 +104,9 @@ void test_ctor_basic() { } } -int main() { +int main(int, char**) { test_ctor_basic(); test_ctor_sfinae(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_index_init_list_args.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_index_init_list_args.pass.cpp index 9c7e3faf862..4b78bf5690a 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_index_init_list_args.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_index_init_list_args.pass.cpp @@ -110,7 +110,9 @@ void test_ctor_basic() { } } -int main() { +int main(int, char**) { test_ctor_basic(); test_ctor_sfinae(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_type_args.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_type_args.pass.cpp index 05b2a29ce8f..ab8fe068831 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_type_args.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_type_args.pass.cpp @@ -114,7 +114,9 @@ void test_ctor_basic() { } } -int main() { +int main(int, char**) { test_ctor_basic(); test_ctor_sfinae(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_type_init_list_args.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_type_init_list_args.pass.cpp index c3f3e58d346..4061cfb2528 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_type_init_list_args.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/in_place_type_init_list_args.pass.cpp @@ -111,7 +111,9 @@ void test_ctor_basic() { } } -int main() { +int main(int, char**) { test_ctor_basic(); test_ctor_sfinae(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/move.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/move.pass.cpp index ecb4a720755..f146e16d3c0 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/move.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/move.pass.cpp @@ -331,10 +331,12 @@ void test_constexpr_move_ctor() { #endif // > C++17 } -int main() { +int main(int, char**) { test_move_ctor_basic(); test_move_ctor_valueless_by_exception(); test_move_noexcept(); test_move_ctor_sfinae(); test_constexpr_move_ctor(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.dtor/dtor.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.dtor/dtor.pass.cpp index 8ced5321b69..b26ab0c29bf 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.dtor/dtor.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.dtor/dtor.pass.cpp @@ -44,7 +44,7 @@ struct TDtor { static_assert(!std::is_trivially_copy_constructible<TDtor>::value, ""); static_assert(std::is_trivially_destructible<TDtor>::value, ""); -int main() { +int main(int, char**) { { using V = std::variant<int, long, TDtor>; static_assert(std::is_trivially_destructible<V>::value, ""); @@ -71,4 +71,6 @@ int main() { assert(NonTDtor::count == 0); assert(NonTDtor1::count == 1); } + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_index_args.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_index_args.pass.cpp index ea84ac94072..b688c8e7a54 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_index_args.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_index_args.pass.cpp @@ -159,7 +159,9 @@ void test_basic() { #endif } -int main() { +int main(int, char**) { test_basic(); test_emplace_sfinae(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_index_init_list_args.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_index_init_list_args.pass.cpp index 13e3c927c28..9d96a1dc272 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_index_init_list_args.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_index_init_list_args.pass.cpp @@ -92,7 +92,9 @@ void test_basic() { assert(&ref3 == &std::get<1>(v)); } -int main() { +int main(int, char**) { test_basic(); test_emplace_sfinae(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_type_args.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_type_args.pass.cpp index 7c9034f10a7..0719f5e7bdc 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_type_args.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_type_args.pass.cpp @@ -159,7 +159,9 @@ void test_basic() { #endif } -int main() { +int main(int, char**) { test_basic(); test_emplace_sfinae(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_type_init_list_args.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_type_init_list_args.pass.cpp index 85cd25d04de..49839eda4f3 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_type_init_list_args.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.mod/emplace_type_init_list_args.pass.cpp @@ -92,7 +92,9 @@ void test_basic() { assert(&ref3 == &std::get<InitList>(v)); } -int main() { +int main(int, char**) { test_basic(); test_emplace_sfinae(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.status/index.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.status/index.pass.cpp index 0afa10138e3..6d463ad2788 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.status/index.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.status/index.pass.cpp @@ -25,7 +25,7 @@ #include "variant_test_helpers.hpp" -int main() { +int main(int, char**) { { using V = std::variant<int, long>; constexpr V v; @@ -57,4 +57,6 @@ int main() { assert(v.index() == std::variant_npos); } #endif + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.status/valueless_by_exception.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.status/valueless_by_exception.pass.cpp index 147f380a19f..2cb730cb0ff 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.status/valueless_by_exception.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.status/valueless_by_exception.pass.cpp @@ -25,7 +25,7 @@ #include "variant_test_helpers.hpp" -int main() { +int main(int, char**) { { using V = std::variant<int, long>; constexpr V v; @@ -50,4 +50,6 @@ int main() { assert(v.valueless_by_exception()); } #endif + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.swap/swap.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.swap/swap.pass.cpp index e05cd13e69f..4e273f52e5e 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.swap/swap.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.swap/swap.pass.cpp @@ -589,10 +589,12 @@ void test_swap_noexcept() { template class std::variant<int, NotSwappable>; #endif -int main() { +int main(int, char**) { test_swap_valueless_by_exception(); test_swap_same_alternative(); test_swap_different_alternatives(); test_swap_sfinae(); test_swap_noexcept(); + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant_array.fail.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant_array.fail.cpp index a9caeb8b2db..ce79e9c4254 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant_array.fail.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant_array.fail.cpp @@ -23,10 +23,12 @@ #include "variant_test_helpers.hpp" #include "test_convertible.hpp" -int main() +int main(int, char**) { // expected-error@variant:* 3 {{static_assert failed}} std::variant<int, int[]> v; // expected-note {{requested here}} std::variant<int, int[42]> v2; // expected-note {{requested here}} std::variant<int, int[][42]> v3; // expected-note {{requested here}} + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant_empty.fail.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant_empty.fail.cpp index 85a10eff9af..3b93cb0ab70 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant_empty.fail.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant_empty.fail.cpp @@ -18,8 +18,10 @@ #include "test_macros.h" #include "variant_test_helpers.hpp" -int main() +int main(int, char**) { // expected-error@variant:* 1 {{static_assert failed}} std::variant<> v; // expected-note {{requested here}} + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant_reference.fail.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant_reference.fail.cpp index e659f47600a..7c2c4669083 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant_reference.fail.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant_reference.fail.cpp @@ -18,10 +18,12 @@ #include "test_macros.h" #include "variant_test_helpers.hpp" -int main() +int main(int, char**) { // expected-error@variant:* 3 {{static_assert failed}} std::variant<int, int&> v; // expected-note {{requested here}} std::variant<int, const int &> v2; // expected-note {{requested here}} std::variant<int, int&&> v3; // expected-note {{requested here}} + + return 0; } diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant_void.fail.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant_void.fail.cpp index ce0675d73c6..27e9c399f8d 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant_void.fail.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant_void.fail.cpp @@ -23,10 +23,12 @@ #include "variant_test_helpers.hpp" #include "test_convertible.hpp" -int main() +int main(int, char**) { // expected-error@variant:* 3 {{static_assert failed}} std::variant<int, void> v; // expected-note {{requested here}} std::variant<int, const void> v2; // expected-note {{requested here}} std::variant<const volatile void, int> v3; // expected-note {{requested here}} + + return 0; } |