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