xref: /llvm-project/libcxx/test/std/numerics/numeric.ops/numeric.ops.midpoint/midpoint.pointer.pass.cpp (revision c9535d7b61a37d6fa58e51222a9ccecc54431193)
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