1330ab33fSMarshall Clow //===----------------------------------------------------------------------===//
2330ab33fSMarshall Clow //
3330ab33fSMarshall Clow // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4330ab33fSMarshall Clow // See https://llvm.org/LICENSE.txt for license information.
5330ab33fSMarshall Clow // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6330ab33fSMarshall Clow //
7330ab33fSMarshall Clow //===----------------------------------------------------------------------===//
8330ab33fSMarshall Clow //
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
10*c9535d7bSStephan T. Lavavej
11*c9535d7bSStephan T. Lavavej // MSVC warning C5215: a function parameter with a volatile qualified type is deprecated in C++20
12*c9535d7bSStephan T. Lavavej // MSVC warning C5216: a volatile qualified return type is deprecated in C++20
13*c9535d7bSStephan T. Lavavej // ADDITIONAL_COMPILE_FLAGS(cl-style-warnings): /wd5215 /wd5216
14*c9535d7bSStephan T. Lavavej
15330ab33fSMarshall Clow // <numeric>
16330ab33fSMarshall Clow
17330ab33fSMarshall Clow // template <class _Tp>
18330ab33fSMarshall Clow // _Tp* midpoint(_Tp* __a, _Tp* __b) noexcept
19330ab33fSMarshall Clow //
20330ab33fSMarshall Clow
21330ab33fSMarshall Clow #include <numeric>
22330ab33fSMarshall Clow #include <cassert>
23330ab33fSMarshall Clow
24330ab33fSMarshall Clow #include "test_macros.h"
25330ab33fSMarshall Clow
26330ab33fSMarshall Clow
27330ab33fSMarshall Clow
28330ab33fSMarshall Clow template <typename T>
constexpr_test()290d8df983SMarshall Clow constexpr void constexpr_test()
30330ab33fSMarshall Clow {
310d8df983SMarshall Clow constexpr T array[1000] = {};
320d8df983SMarshall Clow ASSERT_SAME_TYPE(decltype(std::midpoint(array, array)), const T*);
33330ab33fSMarshall Clow ASSERT_NOEXCEPT( std::midpoint(array, array));
34330ab33fSMarshall Clow
350d8df983SMarshall Clow static_assert(std::midpoint(array, array) == array, "");
360d8df983SMarshall Clow static_assert(std::midpoint(array, array + 1000) == array + 500, "");
370d8df983SMarshall Clow
380d8df983SMarshall Clow static_assert(std::midpoint(array, array + 9) == array + 4, "");
390d8df983SMarshall Clow static_assert(std::midpoint(array, array + 10) == array + 5, "");
400d8df983SMarshall Clow static_assert(std::midpoint(array, array + 11) == array + 5, "");
410d8df983SMarshall Clow static_assert(std::midpoint(array + 9, array) == array + 5, "");
420d8df983SMarshall Clow static_assert(std::midpoint(array + 10, array) == array + 5, "");
430d8df983SMarshall Clow static_assert(std::midpoint(array + 11, array) == array + 6, "");
440d8df983SMarshall Clow }
450d8df983SMarshall Clow
460d8df983SMarshall Clow template <typename T>
runtime_test()470d8df983SMarshall Clow void runtime_test()
480d8df983SMarshall Clow {
490d8df983SMarshall Clow T array[1000] = {}; // we need an array to make valid pointers
500d8df983SMarshall Clow ASSERT_SAME_TYPE(decltype(std::midpoint(array, array)), T*);
510d8df983SMarshall Clow ASSERT_NOEXCEPT( std::midpoint(array, array));
52330ab33fSMarshall Clow
53330ab33fSMarshall Clow assert(std::midpoint(array, array) == array);
54330ab33fSMarshall Clow assert(std::midpoint(array, array + 1000) == array + 500);
55330ab33fSMarshall Clow
56330ab33fSMarshall Clow assert(std::midpoint(array, array + 9) == array + 4);
57330ab33fSMarshall Clow assert(std::midpoint(array, array + 10) == array + 5);
58330ab33fSMarshall Clow assert(std::midpoint(array, array + 11) == array + 5);
59330ab33fSMarshall Clow assert(std::midpoint(array + 9, array) == array + 5);
60330ab33fSMarshall Clow assert(std::midpoint(array + 10, array) == array + 5);
61330ab33fSMarshall Clow assert(std::midpoint(array + 11, array) == array + 6);
62c37734d4SSanjay Marreddi
63c37734d4SSanjay Marreddi // explicit instantiation
64c37734d4SSanjay Marreddi ASSERT_SAME_TYPE(decltype(std::midpoint<T>(array, array)), T*);
65c37734d4SSanjay Marreddi ASSERT_NOEXCEPT(std::midpoint<T>(array, array));
66c37734d4SSanjay Marreddi assert(std::midpoint<T>(array, array) == array);
67c37734d4SSanjay Marreddi assert(std::midpoint<T>(array, array + 1000) == array + 500);
68330ab33fSMarshall Clow }
69330ab33fSMarshall Clow
700d8df983SMarshall Clow template <typename T>
pointer_test()710d8df983SMarshall Clow void pointer_test()
720d8df983SMarshall Clow {
730d8df983SMarshall Clow runtime_test< T>();
740d8df983SMarshall Clow runtime_test<const T>();
750d8df983SMarshall Clow runtime_test< volatile T>();
760d8df983SMarshall Clow runtime_test<const volatile T>();
770d8df983SMarshall Clow
780d8df983SMarshall Clow // The constexpr tests are always const, but we can test them anyway.
790d8df983SMarshall Clow constexpr_test< T>();
800d8df983SMarshall Clow constexpr_test<const T>();
810d8df983SMarshall Clow
820d8df983SMarshall Clow // GCC 9.0.1 (unreleased as of 2019-03) barfs on this, but we have a bot for it.
830d8df983SMarshall Clow // Uncomment when gcc 9.1 is released
840d8df983SMarshall Clow #ifndef TEST_COMPILER_GCC
850d8df983SMarshall Clow constexpr_test< volatile T>();
860d8df983SMarshall Clow constexpr_test<const volatile T>();
870d8df983SMarshall Clow #endif
880d8df983SMarshall Clow }
890d8df983SMarshall Clow
90330ab33fSMarshall Clow
main(int,char **)91330ab33fSMarshall Clow int main(int, char**)
92330ab33fSMarshall Clow {
93330ab33fSMarshall Clow pointer_test<char>();
94330ab33fSMarshall Clow pointer_test<int>();
95330ab33fSMarshall Clow pointer_test<double>();
96330ab33fSMarshall Clow
97330ab33fSMarshall Clow return 0;
98330ab33fSMarshall Clow }
99