//===----------------------------------------------------------------------===// // // 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 // constexpr auto cw = constant_wrapper{}; #include #include #include 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> decltype(auto) cw_val = std::cw<42>; static_assert(cw_val == 42); } { // struct constant constexpr S s{13}; std::same_as> decltype(auto) cw_val = std::cw; static_assert(cw_val == s); } { // array constant constexpr int arr[] = {1, 2, 3}; // gcc complains that cw_val is unused [[maybe_unused]] std::same_as> decltype(auto) cw_val = std::cw; static_assert(cw_val[0] == 1); static_assert(cw_val[1] == 2); static_assert(cw_val[2] == 3); } { // string literals [[maybe_unused]] std::same_as> decltype(auto) cw_val = std::cw<"hello">; static_assert(cw_val[0] == 'h'); static_assert(cw_val[1] == 'e'); static_assert(cw_val[2] == 'l'); static_assert(cw_val[3] == 'l'); static_assert(cw_val[4] == 'o'); static_assert(cw_val[5] == '\0'); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }