//===----------------------------------------------------------------------===// // // 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 // ADDITIONAL_COMPILE_FLAGS: -Wno-unused-value // constant_wrapper // template // friend constexpr auto operator,(L, R) noexcept = delete; #include #include #include struct WithOps { int value; constexpr WithOps(int v) : value(v) {} friend constexpr auto operator,(const WithOps& /*l*/, WithOps r) { return WithOps{r.value}; } }; struct NoOps {}; template concept HasComma = requires(L l, R r) { { l, r }; }; // Comma operator is deleted for constant_wrapper operands static_assert(!HasComma, std::constant_wrapper<3>>); static_assert(!HasComma, std::constant_wrapper>); static_assert(!HasComma, std::constant_wrapper>); // Mixed operands - one constant_wrapper, one runtime type (uses built-in operator) static_assert(HasComma, int>); static_assert(HasComma>); constexpr bool test() { { // only mixed with runtime parameters std::constant_wrapper<42> cw42; int i = 0; std::same_as decltype(auto) result1 = (cw42, i); assert(result1 == 0); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }