33 lines · cpp
1// RUN: %clang_cc1 -std=c++20 -verify %s2 3// expected-no-diagnostics4 5namespace P1937R2 {6struct N {7 constexpr N() {}8 N(N const&) = delete;9};10 11template<typename T> constexpr void bad_assert_copyable() { T t; T t2 = t; }12using ineffective = decltype(bad_assert_copyable<N>());13 14template<typename T> consteval void assert_copyable() { T t; T t2 = t; }15// Prior to P1937R2 consteval functions were evaluated even in otherwise16// unevaluated context, now this is well-formed.17using check = decltype(assert_copyable<N>());18 19template<typename T>20__add_rvalue_reference(T) declval();21 22constexpr auto add1(auto lhs, auto rhs) {23 return lhs + rhs;24}25using T = decltype(add1(declval<int>(), declval<int>()));26 27consteval auto add2(auto lhs, auto rhs) {28 return lhs + rhs;29}30using T = decltype(add2(declval<int>(), declval<int>()));31} // namespace P1937R232 33