Fix a handful of tests that fail in C++03

llvm-svn: 243392
This commit is contained in:
Eric Fiselier 2015-07-28 07:31:50 +00:00
parent 47a7b95b1d
commit abd52cad84
8 changed files with 35 additions and 35 deletions

View File

@ -19,6 +19,7 @@
#include <array> #include <array>
#include <cassert> #include <cassert>
#include "test_macros.h"
#include "../suppress_array_warnings.h" #include "../suppress_array_warnings.h"
int main() int main()
@ -27,6 +28,11 @@ int main()
typedef double T; typedef double T;
typedef std::array<T, 3> C; typedef std::array<T, 3> C;
C c = {1, 2, 3.5}; C c = {1, 2, 3.5};
std::get<3>(c) = 5.5; // expected-error@array:* {{static_assert failed "Index out of bounds in std::get<> (std::array)"}} std::get<3>(c) = 5.5; // expected-note {{requested here}}
#if TEST_STD_VER >= 11
// expected-error@array:* {{static_assert failed "Index out of bounds in std::get<> (std::array)"}}
#else
// expected-error@array:* {{implicit instantiation of undefined template '__static_assert_test<false>'}}
#endif
} }
} }

View File

@ -17,7 +17,7 @@ void f() {}
int main() int main()
{ {
static_assert(std::is_same<std::new_handler, void(*)()>::value, ""); static_assert((std::is_same<std::new_handler, void(*)()>::value), "");
std::new_handler p = f; std::new_handler p = f;
assert(p == &f); assert(p == &f);
} }

View File

@ -17,7 +17,7 @@ void f() {}
int main() int main()
{ {
static_assert(std::is_same<std::terminate_handler, void(*)()>::value, ""); static_assert((std::is_same<std::terminate_handler, void(*)()>::value), "");
std::terminate_handler p = f; std::terminate_handler p = f;
assert(p == &f); assert(p == &f);
} }

View File

@ -37,8 +37,8 @@ template <class TestType, class IntType>
void test_div_struct() { void test_div_struct() {
TestType obj; TestType obj;
static_assert(sizeof(obj) >= sizeof(IntType) * 2, ""); // >= to account for alignment. static_assert(sizeof(obj) >= sizeof(IntType) * 2, ""); // >= to account for alignment.
static_assert(std::is_same<decltype(obj.quot), IntType>::value, ""); static_assert((std::is_same<decltype(obj.quot), IntType>::value), "");
static_assert(std::is_same<decltype(obj.rem), IntType>::value, ""); static_assert((std::is_same<decltype(obj.rem), IntType>::value), "");
((void) obj); ((void) obj);
}; };
@ -46,7 +46,7 @@ int main()
{ {
std::size_t s = 0; std::size_t s = 0;
((void)s); ((void)s);
static_assert(std::is_same<std::size_t, decltype(sizeof(int))>::value, ""); static_assert((std::is_same<std::size_t, decltype(sizeof(int))>::value), "");
test_div_struct<std::div_t, int>(); test_div_struct<std::div_t, int>();
test_div_struct<std::ldiv_t, long>(); test_div_struct<std::ldiv_t, long>();
test_div_struct<std::lldiv_t, long long>(); test_div_struct<std::lldiv_t, long long>();

View File

@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// //
// UNSUPPORTED: libcpp-has-no-threads // UNSUPPORTED: libcpp-has-no-threads
// UNSUPPORTED: c++98, c++03
// NOTE: std::terminate is called so the destructors are not invoked and the // NOTE: std::terminate is called so the destructors are not invoked and the
// memory is not freed. This will cause ASAN to fail. // memory is not freed. This will cause ASAN to fail.
@ -38,12 +39,7 @@ public:
G(const G& g) : alive_(g.alive_) {++n_alive;} G(const G& g) : alive_(g.alive_) {++n_alive;}
~G() {alive_ = 0; --n_alive;} ~G() {alive_ = 0; --n_alive;}
void operator()()
{
assert(alive_ == 1);
assert(n_alive >= 1);
op_run = true;
}
void operator()(int i, double j) void operator()(int i, double j)
{ {
@ -60,7 +56,7 @@ bool G::op_run = false;
void f1() void f1()
{ {
std::exit(0); std::_Exit(0);
} }
int main() int main()

View File

@ -15,6 +15,7 @@
#include <memory> #include <memory>
#include <cassert> #include <cassert>
#include "test_macros.h"
#include "count_new.hpp" #include "count_new.hpp"
int A_constructed = 0; int A_constructed = 0;
@ -34,30 +35,22 @@ struct A
int move_only_constructed = 0; int move_only_constructed = 0;
#if TEST_STD_VER >= 11
class move_only class move_only
{ {
int data; int data;
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
move_only(const move_only&); move_only(const move_only&) = delete;
move_only& operator=(const move_only&); move_only& operator=(const move_only&)= delete;
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
move_only(move_only&);
move_only& operator=(move_only&);
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
public: public:
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
move_only(move_only&&) {++move_only_constructed;} move_only(move_only&&) {++move_only_constructed;}
move_only& operator=(move_only&&) {return *this;} move_only& operator=(move_only&&) {return *this;}
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES
operator std::__rv<move_only> () {return std::__rv<move_only>(*this);}
move_only(std::__rv<move_only>) {++move_only_constructed;}
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
move_only() {++move_only_constructed;} move_only() {++move_only_constructed;}
~move_only() {--move_only_constructed;} ~move_only() {--move_only_constructed;}
}; };
#endif // TEST_STD_VER >= 11
int main() int main()
{ {
@ -108,6 +101,7 @@ int main()
assert(globalMemCounter.checkOutstandingNewEq(0)); assert(globalMemCounter.checkOutstandingNewEq(0));
assert(A_constructed == 0); assert(A_constructed == 0);
} }
#if TEST_STD_VER >= 11
{ {
std::allocator<move_only> a; std::allocator<move_only> a;
assert(globalMemCounter.checkOutstandingNewEq(0)); assert(globalMemCounter.checkOutstandingNewEq(0));
@ -139,4 +133,5 @@ int main()
assert(globalMemCounter.checkOutstandingNewEq(0)); assert(globalMemCounter.checkOutstandingNewEq(0));
assert(move_only_constructed == 0); assert(move_only_constructed == 0);
} }
#endif
} }

View File

@ -14,6 +14,8 @@
#include <utility> #include <utility>
#include <type_traits> #include <type_traits>
#include "test_macros.h"
class A class A
{ {
A(const A&); A(const A&);
@ -22,9 +24,9 @@ class A
int main() int main()
{ {
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES #if TEST_STD_VER >= 11
static_assert((std::is_same<decltype(std::declval<A>()), A&&>::value), ""); static_assert((std::is_same<decltype(std::declval<A>()), A&&>::value), "");
#else #else
static_assert((std::is_same<decltype(std::declval<A>()), A>::value), ""); static_assert((std::is_same<decltype(std::declval<A>()), A&>::value), "");
#endif #endif
} }

View File

@ -56,13 +56,14 @@ int main()
static_assert((std::is_same<decltype(std::move_if_noexcept(ca)), const A&&>::value), ""); static_assert((std::is_same<decltype(std::move_if_noexcept(ca)), const A&&>::value), "");
static_assert((std::is_same<decltype(std::move_if_noexcept(l)), const legacy&>::value), ""); static_assert((std::is_same<decltype(std::move_if_noexcept(l)), const legacy&>::value), "");
#else // C++ < 11 #else // C++ < 11
// libc++ defines decltype to be __typeof__ in C++03. __typeof__ does not // In C++03 libc++ #define's decltype to be __decltype on clang and
// deduce the reference qualifiers. // __typeof__ for other compilers. __typeof__ does not deduce the reference
static_assert((std::is_same<decltype(std::move_if_noexcept(i)), const int>::value), ""); // qualifiers and will cause this test to fail.
static_assert((std::is_same<decltype(std::move_if_noexcept(ci)), const int>::value), ""); static_assert((std::is_same<decltype(std::move_if_noexcept(i)), const int&>::value), "");
static_assert((std::is_same<decltype(std::move_if_noexcept(a)), const A>::value), ""); static_assert((std::is_same<decltype(std::move_if_noexcept(ci)), const int&>::value), "");
static_assert((std::is_same<decltype(std::move_if_noexcept(ca)), const A>::value), ""); static_assert((std::is_same<decltype(std::move_if_noexcept(a)), const A&>::value), "");
static_assert((std::is_same<decltype(std::move_if_noexcept(l)), const legacy>::value), ""); static_assert((std::is_same<decltype(std::move_if_noexcept(ca)), const A&>::value), "");
static_assert((std::is_same<decltype(std::move_if_noexcept(l)), const legacy&>::value), "");
#endif #endif
#if TEST_STD_VER > 11 #if TEST_STD_VER > 11