brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · 3f0f9d9 Raw
49 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++1410 11// template <class T> constexpr add_const<T>& as_const(T& t) noexcept;      // C++1712// template <class T>           add_const<T>& as_const(const T&&) = delete; // C++1713 14#include <cassert>15#include <type_traits>16#include <utility>17 18struct S {int i;};19bool operator==(const S& x, const S& y) { return x.i == y.i; }20bool operator==(const volatile S& x, const volatile S& y) { return x.i == y.i; }21 22template<typename T>23void test(T& t)24{25    static_assert(std::is_const<typename std::remove_reference<decltype(std::as_const                  (t))>::type>::value, "");26    static_assert(std::is_const<typename std::remove_reference<decltype(std::as_const<               T>(t))>::type>::value, "");27    static_assert(std::is_const<typename std::remove_reference<decltype(std::as_const<const          T>(t))>::type>::value, "");28    static_assert(std::is_const<typename std::remove_reference<decltype(std::as_const<volatile       T>(t))>::type>::value, "");29    static_assert(std::is_const<typename std::remove_reference<decltype(std::as_const<const volatile T>(t))>::type>::value, "");30 31    assert(std::as_const(t) == t);32    assert(std::as_const<               T>(t) == t);33    assert(std::as_const<const          T>(t) == t);34    assert(std::as_const<volatile       T>(t) == t);35    assert(std::as_const<const volatile T>(t) == t);36}37 38int main(int, char**)39{40    int i = 3;41    double d = 4.0;42    S s{2};43    test(i);44    test(d);45    test(s);46 47  return 0;48}49