| //===----------------------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // REQUIRES: std-at-least-c++26 | |
| // constant_wrapper | |
| // template<auto X> | |
| // constexpr auto cw = constant_wrapper<X>{}; | |
| #include <cassert> | |
| #include <concepts> | |
| #include <utility> | |
| #include <cstddef> | |
| struct S { | |
| int value; | |
| constexpr S(int v) : value(v) {} | |
| constexpr bool operator==(const S& other) const { return value == other.value; } | |
| }; | |
| constexpr bool test() { | |
| { | |
| // int constant | |
| std::same_as<const std::constant_wrapper<42>> decltype(auto) cw_val = std::cw<42>; | |
| static_assert(cw_val == 42); | |
| } | |
| { | |
| // struct constant | |
| constexpr S s{13}; | |
| std::same_as<const std::constant_wrapper<s>> decltype(auto) cw_val = std::cw<s>; | |
| static_assert(cw_val == s); | |
| } | |
| { | |
| // array constant | |
| constexpr static int arr[] = {1, 2, 3}; | |
| // gcc complains that cw_val is unused | |
| [[maybe_unused]] std::same_as<const std::constant_wrapper<arr>> decltype(auto) cw_val = std::cw<arr>; | |
| static_assert(cw_val[0] == 1); | |
| static_assert(cw_val[1] == 2); | |
| static_assert(cw_val[2] == 3); | |
| } | |
| return true; | |
| } | |
| int main(int, char**) { | |
| test(); | |
| static_assert(test()); | |
| return 0; | |
| } |