// RUN: %clang_cc1 -std=c++20 %s -verify template struct Nothing {}; Nothing<[]() { return 0; }()> nothing; template struct NothingT {}; Nothing<[]() { return 0; }> nothingT; template concept True = [] { return true; }(); static_assert(True); static_assert(sizeof([] { return 0; })); static_assert(sizeof([] { return 0; }())); void f() noexcept(noexcept([] { return 0; }())); using a = decltype([] { return 0; }); using b = decltype([] { return 0; }()); using c = decltype([]() noexcept(noexcept([] { return 0; }())) { return 0; }); using d = decltype(sizeof([] { return 0; })); template int unique_test1(); static_assert(&unique_test1<[](){}> != &unique_test1<[](){}>); template auto g(T) -> decltype([]() { T::invalid; } ()); auto e = g(0); // expected-error{{no matching function for call}} // expected-note@-2 {{substitution failure}} template auto foo(decltype([] { return [] { return T(); }(); })) {} void test() { foo({}); } template struct C { template auto foo(decltype([] { return [] { return T(); }(); })) {} }; void test2() { C{}.foo({}); } namespace PR52073 { // OK, these are distinct functions not redefinitions. template void f(decltype([]{})) {} // expected-note {{candidate}} template void f(decltype([]{})) {} // expected-note {{candidate}} void use_f() { f({}); } // expected-error {{ambiguous}} // Same. template void g(const char (*)[([]{ return N; })()]) {} // expected-note {{candidate}} template void g(const char (*)[([]{ return N; })()]) {} // expected-note {{candidate}} // FIXME: We instantiate the lambdas into the context of the function template, // so we think they're dependent and can't evaluate a call to them. void use_g() { g<6>(&"hello"); } // expected-error {{no matching function}} } namespace GH51416 { template struct A { void spam(decltype([] {})); }; template void A::spam(decltype([] {})) // expected-error{{out-of-line definition of 'spam' does not match}} {} struct B { template void spam(decltype([] {})); }; template void B::spam(decltype([] {})) {} // expected-error{{out-of-line definition of 'spam' does not match}} } // namespace GH51416 namespace GH50376 { template struct foo_t { // expected-note 2{{candidate constructor}} foo_t(T ptr) {} // expected-note{{candidate constructor}} }; template using alias = foo_t; template auto fun(T const &t) -> alias { return alias{t}; // expected-error{{no viable conversion from returned value of type 'alias<...>'}} } void f() { int i; auto const error = fun(i); // expected-note{{in instantiation}} } } // namespace GH50376 namespace GH51414 { template void spam(decltype([] {}) (*s)[sizeof(T)] = nullptr) {} void foo() { spam(); } } // namespace GH51414 namespace GH51641 { template void foo(decltype(+[](T) {}) lambda, T param); static_assert(!__is_same(decltype(foo), void)); } // namespace GH51641