summaryrefslogtreecommitdiff
path: root/test/SemaCXX/cxx2a-lambda-default-ctor-assign.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaCXX/cxx2a-lambda-default-ctor-assign.cpp')
-rw-r--r--test/SemaCXX/cxx2a-lambda-default-ctor-assign.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/test/SemaCXX/cxx2a-lambda-default-ctor-assign.cpp b/test/SemaCXX/cxx2a-lambda-default-ctor-assign.cpp
new file mode 100644
index 0000000000000..e555f16ecc1ec
--- /dev/null
+++ b/test/SemaCXX/cxx2a-lambda-default-ctor-assign.cpp
@@ -0,0 +1,37 @@
+// RUN: %clang_cc1 -std=c++2a -verify %s
+
+auto a = []{};
+decltype(a) a2;
+void f(decltype(a) x, decltype(a) y) {
+ x = y;
+ x = static_cast<decltype(a)&&>(y);
+}
+
+template<typename T>
+struct X {
+ constexpr X() { T::error; } // expected-error {{'::'}}
+ X(const X&);
+ constexpr X &operator=(const X&) { T::error; } // expected-error {{'::'}}
+ constexpr X &operator=(X&&) { T::error; } // expected-error {{'::'}}
+};
+extern X<int> x;
+auto b = [x = x]{}; // expected-note 3{{in instantiation of}}
+decltype(b) b2; // expected-note {{in implicit default constructor}}
+void f(decltype(b) x, decltype(b) y) {
+ x = y; // expected-note {{in implicit copy assignment}}
+ x = static_cast<decltype(b)&&>(y); // expected-note {{in implicit move assignment}}
+}
+
+struct Y {
+ Y() = delete; // expected-note {{deleted}}
+ Y(const Y&);
+ Y &operator=(const Y&) = delete; // expected-note 2{{deleted}}
+ Y &operator=(Y&&) = delete;
+};
+extern Y y;
+auto c = [y = y]{}; // expected-note 3{{deleted because}}
+decltype(c) c2; // expected-error {{deleted}}
+void f(decltype(c) x, decltype(c) y) {
+ x = y; // expected-error {{deleted}}
+ x = static_cast<decltype(c)&&>(y); // expected-error {{deleted}}
+}