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
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
index e40af08..8d2a8a0 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp
@@ -241,7 +241,7 @@
 
 using Fn = void(*)();
 
-int main()
+int main(int, char**)
 {
     test_sfinae();
     // Test with instrumented type
@@ -268,4 +268,6 @@
         assert(**opt == 3);
     }
     test_throws();
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/const_optional_U.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/const_optional_U.pass.cpp
index a9a1c07..6ccaafa 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/const_optional_U.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/const_optional_U.pass.cpp
@@ -196,7 +196,7 @@
 }
 
 
-int main()
+int main(int, char**)
 {
     test_with_test_type();
     test_ambigious_assign();
@@ -250,4 +250,6 @@
         }
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/copy.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/copy.pass.cpp
index 8a4540e..5900e60 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/copy.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/copy.pass.cpp
@@ -48,7 +48,7 @@
     return lhs.has_value() && rhs.has_value() && *lhs == *rhs;
 }
 
-int main()
+int main(int, char**)
 {
     {
         using O = optional<int>;
@@ -102,4 +102,6 @@
         }
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp
index cf09bb5..c5cebc5 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp
@@ -208,7 +208,7 @@
 
 
 
-int main()
+int main(int, char**)
 {
     {
         test_on_test_type<TestTypes::TestType>();
@@ -265,4 +265,6 @@
         }
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp
index 9141bea..446e9ae 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp
@@ -69,7 +69,7 @@
 
 bool Z::dtor_called = false;
 
-int main()
+int main(int, char**)
 {
     {
         X x;
@@ -117,4 +117,6 @@
         }
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/move.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/move.pass.cpp
index 0c36da9..c862c5f 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/move.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/move.pass.cpp
@@ -66,7 +66,7 @@
     return lhs.has_value() && rhs.has_value() && *lhs == Tp{101};
 }
 
-int main()
+int main(int, char**)
 {
     {
         static_assert(std::is_nothrow_move_assignable<optional<int>>::value, "");
@@ -204,4 +204,5 @@
         };
         static_assert(std::is_nothrow_move_assignable<optional<NoThrowMove>>::value, "");
     }
+    return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp
index e6b6743..af582d7 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp
@@ -22,7 +22,7 @@
 using std::nullopt_t;
 using std::nullopt;
 
-int main()
+int main(int, char**)
 {
     {
         optional<int> opt;
@@ -63,4 +63,6 @@
     assert(TT::alive == 0);
     assert(TT::destroyed == 1);
     TT::reset();
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/optional_U.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/optional_U.pass.cpp
index d043fd1..cabaa07 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/optional_U.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.assign/optional_U.pass.cpp
@@ -201,7 +201,7 @@
 }
 
 
-int main()
+int main(int, char**)
 {
     test_with_test_type();
     test_ambigious_assign();
@@ -264,4 +264,6 @@
         }
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/U.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/U.pass.cpp
index 861ab91..f91cd11 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/U.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/U.pass.cpp
@@ -153,7 +153,9 @@
 #endif
 }
 
-int main() {
+int main(int, char**) {
     test_implicit();
     test_explicit();
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_T.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_T.pass.cpp
index 462811e..1a7b36a 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_T.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_T.pass.cpp
@@ -29,7 +29,7 @@
 
 using std::optional;
 
-int main()
+int main(int, char**)
 {
     {
         typedef int T;
@@ -132,4 +132,6 @@
         }
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_optional_U.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_optional_U.pass.cpp
index 4666d6d..b28d223 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_optional_U.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/const_optional_U.pass.cpp
@@ -78,7 +78,7 @@
 };
 
 
-int main()
+int main(int, char**)
 {
     {
         typedef short U;
@@ -130,4 +130,6 @@
     }
 
     static_assert(!(std::is_constructible<optional<X>, const optional<Y>&>::value), "");
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp
index 844abda..e6793cd 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp
@@ -113,7 +113,7 @@
 #endif
 }
 
-int main()
+int main(int, char**)
 {
     test<int>();
     test<int>(3);
@@ -169,4 +169,6 @@
         constexpr std::optional<int> o2 = o1;
         static_assert( *o2 == 4, "" );
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.fail.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.fail.cpp
index 9439642..7c6ae9b 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.fail.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.fail.cpp
@@ -23,7 +23,7 @@
 
 struct A {};
 
-int main()
+int main(int, char**)
 {
 //  Test the explicit deduction guides
 
@@ -42,4 +42,6 @@
 //  optional(nullopt_t)
     std::optional opt(std::nullopt);   // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with nullopt_t is ill-formed"}}
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.pass.cpp
index 973b49d..fa2edfc 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.pass.cpp
@@ -23,7 +23,7 @@
 
 struct A {};
 
-int main()
+int main(int, char**)
 {
 //  Test the explicit deduction guides
     {
@@ -50,4 +50,6 @@
     assert(static_cast<bool>(opt) == static_cast<bool>(source));
     assert(*opt == *source);
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/default.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/default.pass.cpp
index a00fa17..3dd38da 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/default.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/default.pass.cpp
@@ -61,7 +61,7 @@
     };
 }
 
-int main()
+int main(int, char**)
 {
     test_constexpr<optional<int>>();
     test_constexpr<optional<int*>>();
@@ -77,4 +77,6 @@
     test_constexpr<optional<NonLiteralTypes::NoCtors&>>();
     test_constexpr<optional<NonLiteralTypes::NoCtors&&>>();
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_const_optional_U.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_const_optional_U.pass.cpp
index 37adf8b..7741e03 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_const_optional_U.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_const_optional_U.pass.cpp
@@ -79,7 +79,7 @@
 };
 
 
-int main()
+int main(int, char**)
 {
     {
         typedef X T;
@@ -117,4 +117,6 @@
         optional<U> rhs(3);
         test<T>(rhs, true);
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_optional_U.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_optional_U.pass.cpp
index ea4b7aa..71febba 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_optional_U.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_optional_U.pass.cpp
@@ -62,7 +62,7 @@
     explicit Z(int) { TEST_THROW(6); }
 };
 
-int main()
+int main(int, char**)
 {
     {
         optional<int> rhs;
@@ -80,4 +80,6 @@
         optional<int> rhs(3);
         test<Z>(std::move(rhs), true);
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp
index 5cd23ba..db995b4 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp
@@ -58,7 +58,7 @@
 };
 
 
-int main()
+int main(int, char**)
 {
     {
         constexpr optional<int> opt(in_place, 5);
@@ -144,4 +144,6 @@
         }
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp
index f62e6a3..c8c76df 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp
@@ -66,7 +66,7 @@
         {return x.i_ == y.i_ && x.j_ == y.j_;}
 };
 
-int main()
+int main(int, char**)
 {
     {
         static_assert(!std::is_constructible<X, std::initializer_list<int>&>::value, "");
@@ -112,4 +112,6 @@
         }
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.fail.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.fail.cpp
index 622b8e4..a8634b9 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.fail.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.fail.cpp
@@ -28,9 +28,11 @@
     };
 
 
-int main()
+int main(int, char**)
 {
     static_assert (!std::is_trivially_move_constructible_v<S>, "" );
     constexpr std::optional<S> o1;
     constexpr std::optional<S> o2 = std::move(o1);  // not constexpr
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp
index afba631..bf536ec 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp
@@ -151,7 +151,7 @@
 }
 
 
-int main()
+int main(int, char**)
 {
     test<int>();
     test<int>(3);
@@ -225,4 +225,6 @@
     constexpr std::optional<int> o2 = std::move(o1);
     static_assert( *o2 == 4, "" );
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/nullopt_t.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/nullopt_t.pass.cpp
index 850ed6e..927ac19 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/nullopt_t.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/nullopt_t.pass.cpp
@@ -61,7 +61,7 @@
     };
 }
 
-int main()
+int main(int, char**)
 {
     test_constexpr<optional<int>>();
     test_constexpr<optional<int*>>();
@@ -69,4 +69,6 @@
     test_constexpr<optional<NonTrivialTypes::NoCtors>>();
     test_constexpr<optional<NonConstexprTypes::NoCtors>>();
     test<optional<NonLiteralTypes::NoCtors>>();
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/optional_U.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/optional_U.pass.cpp
index fd74f9a..fe4252b 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/optional_U.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/optional_U.pass.cpp
@@ -61,7 +61,7 @@
     Z(int) { TEST_THROW(6); }
 };
 
-int main()
+int main(int, char**)
 {
     {
         optional<short> rhs;
@@ -89,4 +89,6 @@
     }
 
     static_assert(!(std::is_constructible<optional<X>, optional<Z>>::value), "");
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp
index 5e9a216..7fd1f2f 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp
@@ -39,7 +39,7 @@
 };
 
 
-int main()
+int main(int, char**)
 {
     {
         typedef int T;
@@ -157,4 +157,6 @@
         }
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp
index ca96586..23497bc 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp
@@ -32,7 +32,7 @@
 
 bool X::dtor_called = false;
 
-int main()
+int main(int, char**)
 {
     {
         typedef int T;
@@ -64,4 +64,6 @@
         }
         assert(X::dtor_called == true);
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.mod/reset.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.mod/reset.pass.cpp
index e766db8..704606c 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.mod/reset.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.mod/reset.pass.cpp
@@ -26,7 +26,7 @@
 
 bool X::dtor_called = false;
 
-int main()
+int main(int, char**)
 {
     {
         optional<int> opt;
@@ -55,4 +55,6 @@
         assert(static_cast<bool>(opt) == false);
         X::dtor_called = false;
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/bool.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/bool.pass.cpp
index 29bf20b..7c008ef 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/bool.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/bool.pass.cpp
@@ -17,7 +17,7 @@
 
 #include "test_macros.h"
 
-int main()
+int main(int, char**)
 {
     using std::optional;
     {
@@ -33,4 +33,6 @@
         constexpr optional<int> opt(0);
         static_assert(opt, "");
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp
index b109346..368f841 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp
@@ -43,7 +43,7 @@
     return (*opt).test();
 }
 
-int main()
+int main(int, char**)
 {
     {
         optional<X> opt; ((void)opt);
@@ -69,4 +69,6 @@
         assert(false);
     }
 #endif  // _LIBCPP_DEBUG
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp
index 6663d88..99a60e8 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp
@@ -36,7 +36,7 @@
     int test() const {return 2;}
 };
 
-int main()
+int main(int, char**)
 {
     {
         const optional<X> opt; ((void)opt);
@@ -65,4 +65,6 @@
         assert(false);
     }
 #endif  // _LIBCPP_DEBUG
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const_rvalue.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const_rvalue.pass.cpp
index 02466d5..ca494c5 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const_rvalue.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const_rvalue.pass.cpp
@@ -36,7 +36,7 @@
     int test() const && {return 2;}
 };
 
-int main()
+int main(int, char**)
 {
     {
         const optional<X> opt; ((void)opt);
@@ -65,4 +65,6 @@
         assert(false);
     }
 #endif  // _LIBCPP_DEBUG
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_rvalue.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_rvalue.pass.cpp
index 7dca9f6..f1b2ca3 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_rvalue.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/dereference_rvalue.pass.cpp
@@ -43,7 +43,7 @@
     return (*std::move(opt)).test();
 }
 
-int main()
+int main(int, char**)
 {
     {
         optional<X> opt; ((void)opt);
@@ -69,4 +69,6 @@
         assert(false);
     }
 #endif  // _LIBCPP_DEBUG
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/has_value.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/has_value.pass.cpp
index 59ce4c7..560fa88 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/has_value.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/has_value.pass.cpp
@@ -17,7 +17,7 @@
 
 #include "test_macros.h"
 
-int main()
+int main(int, char**)
 {
     using std::optional;
     {
@@ -33,4 +33,6 @@
         constexpr optional<int> opt(0);
         static_assert(opt.has_value(), "");
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp
index ac0b9a5..8c6c098 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp
@@ -40,7 +40,7 @@
     return opt->test();
 }
 
-int main()
+int main(int, char**)
 {
     {
         std::optional<X> opt; ((void)opt);
@@ -68,4 +68,6 @@
         assert(false);
     }
 #endif  // _LIBCPP_DEBUG
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp
index fd7e683..b953982 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp
@@ -39,7 +39,7 @@
     constexpr int test() const {return 1;}
 };
 
-int main()
+int main(int, char**)
 {
     {
         const std::optional<X> opt; ((void)opt);
@@ -72,4 +72,6 @@
         assert(false);
     }
 #endif  // _LIBCPP_DEBUG
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value.pass.cpp
index 04a4fcf..23fd85b 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value.pass.cpp
@@ -52,7 +52,7 @@
 }
 
 
-int main()
+int main(int, char**)
 {
     {
         optional<X> opt; ((void)opt);
@@ -78,4 +78,6 @@
     }
 #endif
     static_assert(test() == 7, "");
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const.fail.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const.fail.cpp
index ab6504d..5e81f2f 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const.fail.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const.fail.cpp
@@ -23,10 +23,12 @@
     int test() {return 4;}
 };
 
-int main()
+int main(int, char**)
 {
     {
         constexpr optional<X> opt;
         static_assert(opt.value().test() == 3, "");
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const.pass.cpp
index dcc9306..54bdc10 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const.pass.cpp
@@ -41,7 +41,7 @@
     int test() && {return 6;}
 };
 
-int main()
+int main(int, char**)
 {
     {
         const optional<X> opt; ((void)opt);
@@ -69,4 +69,6 @@
         }
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const_rvalue.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const_rvalue.pass.cpp
index 5e218d8..b330bb8 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const_rvalue.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_const_rvalue.pass.cpp
@@ -41,7 +41,7 @@
     int test() && {return 6;}
 };
 
-int main()
+int main(int, char**)
 {
     {
         const optional<X> opt; ((void)opt);
@@ -69,4 +69,6 @@
         }
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp
index 93ec45b..8f22f1c 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp
@@ -67,7 +67,9 @@
     return 0;
 }
 
-int main()
+int main(int, char**)
 {
     static_assert(test() == 0);
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp
index 0b4c792..736fe79 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp
@@ -35,7 +35,7 @@
         {return x.i_ == y.i_;}
 };
 
-int main()
+int main(int, char**)
 {
     {
         constexpr optional<X> opt(2);
@@ -73,4 +73,6 @@
         const optional<X> opt;
         assert(opt.value_or(Y(3)) == 4);
     }
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_rvalue.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_rvalue.pass.cpp
index 21f630e..06206a3 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_rvalue.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.observe/value_rvalue.pass.cpp
@@ -50,7 +50,7 @@
     return std::move(opt).value().test();
 }
 
-int main()
+int main(int, char**)
 {
     {
         optional<X> opt; ((void)opt);
@@ -76,4 +76,6 @@
     }
 #endif
     static_assert(test() == 7, "");
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.swap/swap.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.swap/swap.pass.cpp
index 7d79251..e881a0c 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional.object.swap/swap.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.swap/swap.pass.cpp
@@ -64,7 +64,7 @@
 };
 
 
-int main()
+int main(int, char**)
 {
     {
         optional<int> opt1;
@@ -302,4 +302,6 @@
         assert(*opt2 == 2);
     }
 #endif
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional_requires_destructible_object.fail.cpp b/libcxx/test/std/utilities/optional/optional.object/optional_requires_destructible_object.fail.cpp
index 67e1b76..531173a 100644
--- a/libcxx/test/std/utilities/optional/optional.object/optional_requires_destructible_object.fail.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/optional_requires_destructible_object.fail.cpp
@@ -21,7 +21,7 @@
     ~X() {}
 };
 
-int main()
+int main(int, char**)
 {
     using std::optional;
     {
@@ -46,4 +46,6 @@
     }
     // FIXME these are garbage diagnostics that Clang should not produce
     // expected-error@optional:* 0+ {{is not a base class}}
+
+  return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/special_members.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/special_members.pass.cpp
index a315ed8..2878326 100644
--- a/libcxx/test/std/utilities/optional/optional.object/special_members.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/special_members.pass.cpp
@@ -52,11 +52,12 @@
     DoTestsMetafunction() { sink(SpecialMemberTest<TestTypes>{}...); }
 };
 
-int main() {
+int main(int, char**) {
     sink(
         ImplicitTypes::ApplyTypes<DoTestsMetafunction>{},
         ExplicitTypes::ApplyTypes<DoTestsMetafunction>{},
         NonLiteralTypes::ApplyTypes<DoTestsMetafunction>{},
         NonTrivialTypes::ApplyTypes<DoTestsMetafunction>{}
     );
+    return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/triviality.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/triviality.pass.cpp
index 7c82e17..f53d860 100644
--- a/libcxx/test/std/utilities/optional/optional.object/triviality.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/triviality.pass.cpp
@@ -85,7 +85,7 @@
     TrivialCopyNonTrivialMove& operator=(TrivialCopyNonTrivialMove&&) { return *this; }
 };
 
-int main() {
+int main(int, char**) {
     sink(
         ImplicitTypes::ApplyTypes<DoTestsMetafunction>{},
         ExplicitTypes::ApplyTypes<DoTestsMetafunction>{},
@@ -93,4 +93,5 @@
         NonTrivialTypes::ApplyTypes<DoTestsMetafunction>{},
         DoTestsMetafunction<TrivialMoveNonTrivialCopy, TrivialCopyNonTrivialMove>{}
     );
+    return 0;
 }
diff --git a/libcxx/test/std/utilities/optional/optional.object/types.pass.cpp b/libcxx/test/std/utilities/optional/optional.object/types.pass.cpp
index cef2957..7c32d18 100644
--- a/libcxx/test/std/utilities/optional/optional.object/types.pass.cpp
+++ b/libcxx/test/std/utilities/optional/optional.object/types.pass.cpp
@@ -28,10 +28,12 @@
     static_assert(std::is_same<typename Opt::value_type, T>::value, "");
 }
 
-int main()
+int main(int, char**)
 {
     test<optional<int>, int>();
     test<optional<const int>, const int>();
     test<optional<double>, double>();
     test<optional<const double>, const double>();
+
+  return 0;
 }