//===----------------------------------------------------------------------===// // // 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 operator=(R) const noexcept // -> constant_wrapper { return {}; } #include #include #include #include "helpers.h" struct WithOps { int value; constexpr WithOps(int v) : value(v) {} constexpr WithOps operator=(int i) const { return WithOps{value + i}; } }; struct OpsReturnNonStructural { int value; constexpr OpsReturnNonStructural(int v) : value(v) {} constexpr NonStructural operator=(int i) const { return NonStructural{value + i}; } }; template concept HasAssign = requires(const T t, R r) { { t = r }; }; template concept HasNoexceptAssign = requires(const T t, R r) { { t = r } noexcept; }; static_assert(!HasAssign, std::constant_wrapper<3>>); static_assert(!HasNoexceptAssign, std::constant_wrapper<3>>); static_assert(HasAssign, std::constant_wrapper<3>>); static_assert(HasNoexceptAssign, std::constant_wrapper<3>>); static_assert(!HasAssign, std::constant_wrapper<5>>); constexpr bool test() { { // WithOps assignment const std::constant_wrapper cwOps5; std::constant_wrapper<3> cw3; std::same_as> decltype(auto) result = cwOps5 = cw3; static_assert(result.value.value == 8); } { // with integral_constant const std::constant_wrapper cwOps5; std::integral_constant ic3; std::same_as> decltype(auto) result = cwOps5 = ic3; static_assert(result.value.value == 8); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }