1 // RUN: %clang_cc1 -std=c++2a -verify %s 2 3 auto a = []{}; 4 decltype(a) a2; 5 void f(decltype(a) x, decltype(a) y) { 6 x = y; 7 x = static_cast<decltype(a)&&>(y); 8 } 9 10 template<typename T> 11 struct X { 12 constexpr X() { T::error; } // expected-error {{'::'}} 13 X(const X&); 14 constexpr X &operator=(const X&) { T::error; } // expected-error {{'::'}} 15 constexpr X &operator=(X&&) { T::error; } // expected-error {{'::'}} 16 }; 17 extern X<int> x; 18 auto b = [x = x]{}; // expected-note 3{{in instantiation of}} 19 decltype(b) b2; // expected-note {{in implicit default constructor}} 20 void f(decltype(b) x, decltype(b) y) { 21 x = y; // expected-note {{in implicit copy assignment}} 22 x = static_cast<decltype(b)&&>(y); // expected-note {{in implicit move assignment}} 23 } 24 25 struct Y { 26 Y() = delete; // expected-note {{deleted}} 27 Y(const Y&); 28 Y &operator=(const Y&) = delete; // expected-note 2{{deleted}} 29 Y &operator=(Y&&) = delete; 30 }; 31 extern Y y; 32 auto c = [y = y]{}; // expected-note 3{{deleted because}} 33 decltype(c) c2; // expected-error {{deleted}} 34 void f(decltype(c) x, decltype(c) y) { 35 x = y; // expected-error {{deleted}} 36 x = static_cast<decltype(c)&&>(y); // expected-error {{deleted}} 37 } 38