brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · e8a25c1 Raw
99 lines · cpp
1//===----------------------------------------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8//9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// MSVC warning C5215: a function parameter with a volatile qualified type is deprecated in C++2012// MSVC warning C5216: a volatile qualified return type is deprecated in C++2013// ADDITIONAL_COMPILE_FLAGS(cl-style-warnings): /wd5215 /wd521614 15// <numeric>16 17// template <class _Tp>18// _Tp* midpoint(_Tp* __a, _Tp* __b) noexcept19//20 21#include <numeric>22#include <cassert>23 24#include "test_macros.h"25 26 27 28template <typename T>29constexpr void constexpr_test()30{31    constexpr T array[1000] = {};32    ASSERT_SAME_TYPE(decltype(std::midpoint(array, array)), const T*);33    ASSERT_NOEXCEPT(          std::midpoint(array, array));34 35    static_assert(std::midpoint(array, array)        == array, "");36    static_assert(std::midpoint(array, array + 1000) == array + 500, "");37 38    static_assert(std::midpoint(array, array +    9) == array + 4, "");39    static_assert(std::midpoint(array, array +   10) == array + 5, "");40    static_assert(std::midpoint(array, array +   11) == array + 5, "");41    static_assert(std::midpoint(array +    9, array) == array + 5, "");42    static_assert(std::midpoint(array +   10, array) == array + 5, "");43    static_assert(std::midpoint(array +   11, array) == array + 6, "");44}45 46template <typename T>47void runtime_test()48{49    T array[1000] = {}; // we need an array to make valid pointers50    ASSERT_SAME_TYPE(decltype(std::midpoint(array, array)), T*);51    ASSERT_NOEXCEPT(          std::midpoint(array, array));52 53    assert(std::midpoint(array, array)        == array);54    assert(std::midpoint(array, array + 1000) == array + 500);55 56    assert(std::midpoint(array, array +    9) == array + 4);57    assert(std::midpoint(array, array +   10) == array + 5);58    assert(std::midpoint(array, array +   11) == array + 5);59    assert(std::midpoint(array +    9, array) == array + 5);60    assert(std::midpoint(array +   10, array) == array + 5);61    assert(std::midpoint(array +   11, array) == array + 6);62 63    // explicit instantiation64    ASSERT_SAME_TYPE(decltype(std::midpoint<T>(array, array)), T*);65    ASSERT_NOEXCEPT(std::midpoint<T>(array, array));66    assert(std::midpoint<T>(array, array) == array);67    assert(std::midpoint<T>(array, array + 1000) == array + 500);68}69 70template <typename T>71void pointer_test()72{73    runtime_test<               T>();74    runtime_test<const          T>();75    runtime_test<      volatile T>();76    runtime_test<const volatile T>();77 78//  The constexpr tests are always const, but we can test them anyway.79    constexpr_test<               T>();80    constexpr_test<const          T>();81 82//  GCC 9.0.1 (unreleased as of 2019-03) barfs on this, but we have a bot for it.83//  Uncomment when gcc 9.1 is released84#ifndef TEST_COMPILER_GCC85    constexpr_test<      volatile T>();86    constexpr_test<const volatile T>();87#endif88}89 90 91int main(int, char**)92{93    pointer_test<char>();94    pointer_test<int>();95    pointer_test<double>();96 97    return 0;98}99