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 //
9*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
10330ab33fSMarshall Clow // <numeric>
11330ab33fSMarshall Clow
12330ab33fSMarshall Clow // template <class _Tp>
13330ab33fSMarshall Clow // _Tp* midpoint(_Tp* __a, _Tp* __b) noexcept
14330ab33fSMarshall Clow //
15330ab33fSMarshall Clow
16330ab33fSMarshall Clow #include <numeric>
17330ab33fSMarshall Clow #include <cassert>
18330ab33fSMarshall Clow
19330ab33fSMarshall Clow #include "test_macros.h"
20330ab33fSMarshall Clow
21330ab33fSMarshall Clow
22330ab33fSMarshall Clow
23330ab33fSMarshall Clow template <typename T>
constexpr_test()240d8df983SMarshall Clow constexpr void constexpr_test()
25330ab33fSMarshall Clow {
260d8df983SMarshall Clow constexpr T array[1000] = {};
270d8df983SMarshall Clow ASSERT_SAME_TYPE(decltype(std::midpoint(array, array)), const T*);
28330ab33fSMarshall Clow ASSERT_NOEXCEPT( std::midpoint(array, array));
29330ab33fSMarshall Clow
300d8df983SMarshall Clow static_assert(std::midpoint(array, array) == array, "");
310d8df983SMarshall Clow static_assert(std::midpoint(array, array + 1000) == array + 500, "");
320d8df983SMarshall Clow
330d8df983SMarshall Clow static_assert(std::midpoint(array, array + 9) == array + 4, "");
340d8df983SMarshall Clow static_assert(std::midpoint(array, array + 10) == array + 5, "");
350d8df983SMarshall Clow static_assert(std::midpoint(array, array + 11) == array + 5, "");
360d8df983SMarshall Clow static_assert(std::midpoint(array + 9, array) == array + 5, "");
370d8df983SMarshall Clow static_assert(std::midpoint(array + 10, array) == array + 5, "");
380d8df983SMarshall Clow static_assert(std::midpoint(array + 11, array) == array + 6, "");
390d8df983SMarshall Clow }
400d8df983SMarshall Clow
410d8df983SMarshall Clow template <typename T>
runtime_test()420d8df983SMarshall Clow void runtime_test()
430d8df983SMarshall Clow {
440d8df983SMarshall Clow T array[1000] = {}; // we need an array to make valid pointers
450d8df983SMarshall Clow ASSERT_SAME_TYPE(decltype(std::midpoint(array, array)), T*);
460d8df983SMarshall Clow ASSERT_NOEXCEPT( std::midpoint(array, array));
47330ab33fSMarshall Clow
48330ab33fSMarshall Clow assert(std::midpoint(array, array) == array);
49330ab33fSMarshall Clow assert(std::midpoint(array, array + 1000) == array + 500);
50330ab33fSMarshall Clow
51330ab33fSMarshall Clow assert(std::midpoint(array, array + 9) == array + 4);
52330ab33fSMarshall Clow assert(std::midpoint(array, array + 10) == array + 5);
53330ab33fSMarshall Clow assert(std::midpoint(array, array + 11) == array + 5);
54330ab33fSMarshall Clow assert(std::midpoint(array + 9, array) == array + 5);
55330ab33fSMarshall Clow assert(std::midpoint(array + 10, array) == array + 5);
56330ab33fSMarshall Clow assert(std::midpoint(array + 11, array) == array + 6);
57330ab33fSMarshall Clow }
58330ab33fSMarshall Clow
590d8df983SMarshall Clow template <typename T>
pointer_test()600d8df983SMarshall Clow void pointer_test()
610d8df983SMarshall Clow {
620d8df983SMarshall Clow runtime_test< T>();
630d8df983SMarshall Clow runtime_test<const T>();
640d8df983SMarshall Clow runtime_test< volatile T>();
650d8df983SMarshall Clow runtime_test<const volatile T>();
660d8df983SMarshall Clow
670d8df983SMarshall Clow // The constexpr tests are always const, but we can test them anyway.
680d8df983SMarshall Clow constexpr_test< T>();
690d8df983SMarshall Clow constexpr_test<const T>();
700d8df983SMarshall Clow
710d8df983SMarshall Clow // GCC 9.0.1 (unreleased as of 2019-03) barfs on this, but we have a bot for it.
720d8df983SMarshall Clow // Uncomment when gcc 9.1 is released
730d8df983SMarshall Clow #ifndef TEST_COMPILER_GCC
740d8df983SMarshall Clow constexpr_test< volatile T>();
750d8df983SMarshall Clow constexpr_test<const volatile T>();
760d8df983SMarshall Clow #endif
770d8df983SMarshall Clow }
780d8df983SMarshall Clow
79330ab33fSMarshall Clow
main(int,char **)80330ab33fSMarshall Clow int main(int, char**)
81330ab33fSMarshall Clow {
82330ab33fSMarshall Clow pointer_test<char>();
83330ab33fSMarshall Clow pointer_test<int>();
84330ab33fSMarshall Clow pointer_test<double>();
85330ab33fSMarshall Clow
86330ab33fSMarshall Clow return 0;
87330ab33fSMarshall Clow }
88