blob: def76084835b0be32d6f34cf51b570cbe69af5e7 [file] [log] [blame]
Marshall Clow330ab332019-03-14 16:25:55 +00001//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
10// <numeric>
11
12// template <class _Tp>
13// _Tp* midpoint(_Tp* __a, _Tp* __b) noexcept
14//
15
16#include <numeric>
17#include <cassert>
18
19#include "test_macros.h"
20
21
22
23template <typename T>
Marshall Clow0d8df982019-03-14 17:43:41 +000024constexpr void constexpr_test()
Marshall Clow330ab332019-03-14 16:25:55 +000025{
Marshall Clow0d8df982019-03-14 17:43:41 +000026 constexpr T array[1000] = {};
27 ASSERT_SAME_TYPE(decltype(std::midpoint(array, array)), const T*);
Marshall Clow330ab332019-03-14 16:25:55 +000028 ASSERT_NOEXCEPT( std::midpoint(array, array));
29
Marshall Clow0d8df982019-03-14 17:43:41 +000030 static_assert(std::midpoint(array, array) == array, "");
31 static_assert(std::midpoint(array, array + 1000) == array + 500, "");
32
33 static_assert(std::midpoint(array, array + 9) == array + 4, "");
34 static_assert(std::midpoint(array, array + 10) == array + 5, "");
35 static_assert(std::midpoint(array, array + 11) == array + 5, "");
36 static_assert(std::midpoint(array + 9, array) == array + 5, "");
37 static_assert(std::midpoint(array + 10, array) == array + 5, "");
38 static_assert(std::midpoint(array + 11, array) == array + 6, "");
39}
40
41template <typename T>
42void runtime_test()
43{
44 T array[1000] = {}; // we need an array to make valid pointers
45 ASSERT_SAME_TYPE(decltype(std::midpoint(array, array)), T*);
46 ASSERT_NOEXCEPT( std::midpoint(array, array));
Marshall Clow330ab332019-03-14 16:25:55 +000047
48 assert(std::midpoint(array, array) == array);
49 assert(std::midpoint(array, array + 1000) == array + 500);
50
51 assert(std::midpoint(array, array + 9) == array + 4);
52 assert(std::midpoint(array, array + 10) == array + 5);
53 assert(std::midpoint(array, array + 11) == array + 5);
54 assert(std::midpoint(array + 9, array) == array + 5);
55 assert(std::midpoint(array + 10, array) == array + 5);
56 assert(std::midpoint(array + 11, array) == array + 6);
57}
58
Marshall Clow0d8df982019-03-14 17:43:41 +000059template <typename T>
60void pointer_test()
61{
62 runtime_test< T>();
63 runtime_test<const T>();
64 runtime_test< volatile T>();
65 runtime_test<const volatile T>();
66
67// The constexpr tests are always const, but we can test them anyway.
68 constexpr_test< T>();
69 constexpr_test<const T>();
70
71// GCC 9.0.1 (unreleased as of 2019-03) barfs on this, but we have a bot for it.
72// Uncomment when gcc 9.1 is released
73#ifndef TEST_COMPILER_GCC
74 constexpr_test< volatile T>();
75 constexpr_test<const volatile T>();
76#endif
77}
78
Marshall Clow330ab332019-03-14 16:25:55 +000079
80int main(int, char**)
81{
Marshall Clow0d8df982019-03-14 17:43:41 +000082 pointer_test<char>();
Marshall Clow330ab332019-03-14 16:25:55 +000083 pointer_test<int>();
84 pointer_test<double>();
85
86 return 0;
87}