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