1 //===----------------------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // UNSUPPORTED: c++03, c++11, c++14
11 // template <class T> constexpr add_const<T>& as_const(T& t) noexcept; // C++17
12 // template <class T> add_const<T>& as_const(const T&&) = delete; // C++17
15 #include <type_traits>
19 bool operator==(const S
& x
, const S
& y
) { return x
.i
== y
.i
; }
20 bool operator==(const volatile S
& x
, const volatile S
& y
) { return x
.i
== y
.i
; }
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
, "");
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
);