aboutsummaryrefslogtreecommitdiff
path: root/test/CXX/expr/expr.prim/expr.prim.lambda
diff options
context:
space:
mode:
Diffstat (limited to 'test/CXX/expr/expr.prim/expr.prim.lambda')
-rw-r--r--test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp31
-rw-r--r--test/CXX/expr/expr.prim/expr.prim.lambda/p20.cpp12
-rw-r--r--test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp1
-rw-r--r--test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp2
4 files changed, 46 insertions, 0 deletions
diff --git a/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp b/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp
new file mode 100644
index 0000000000..b5a445cd9e
--- /dev/null
+++ b/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp
@@ -0,0 +1,31 @@
+// RUN: %clang_cc1 -std=c++11 %s -Wunused -verify
+
+struct MoveOnly {
+ MoveOnly(MoveOnly&&);
+ MoveOnly(const MoveOnly&);
+};
+
+template<typename T> T &&move(T&);
+void test_special_member_functions(MoveOnly mo, int i) {
+ // FIXME: terrible note
+ auto lambda1 = [i]() { }; // expected-note{{function has been explicitly marked deleted here}} \
+ // expected-note{{the implicit copy assignment operator}} \
+ // expected-note{{the implicit move assignment operator}} \
+
+ // Default constructor
+ decltype(lambda1) lambda2; // expected-error{{call to deleted constructor}}
+
+ // Copy assignment operator
+ lambda1 = lambda1; // expected-error{{overload resolution selected deleted operator '='}}
+
+ // Move assignment operator
+ lambda1 = move(lambda1);
+
+ // Copy constructor
+ decltype(lambda1) lambda3 = lambda1;
+ decltype(lambda1) lambda4(lambda1);
+
+ // Move constructor
+ decltype(lambda1) lambda5 = move(lambda1);
+ decltype(lambda1) lambda6(move(lambda1));
+}
diff --git a/test/CXX/expr/expr.prim/expr.prim.lambda/p20.cpp b/test/CXX/expr/expr.prim/expr.prim.lambda/p20.cpp
new file mode 100644
index 0000000000..4487cfc4ba
--- /dev/null
+++ b/test/CXX/expr/expr.prim/expr.prim.lambda/p20.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -std=c++11 %s -Wunused -verify
+
+template<typename T>
+void destroy(T* ptr) {
+ ptr->~T();
+ (*ptr).~T();
+}
+
+void destructor() {
+ auto lambda = []{};
+ destroy(&lambda);
+}
diff --git a/test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp b/test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp
index 74003431c6..581dbca309 100644
--- a/test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp
+++ b/test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp
@@ -8,6 +8,7 @@ void test_attributes() {
template<typename T>
struct bogus_override_if_virtual : public T {
+ bogus_override_if_virtual() : T(*(T*)0) { }
int operator()() const;
};
diff --git a/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp b/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp
index 8fa3837214..627071343e 100644
--- a/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp
+++ b/test/CXX/expr/expr.prim/expr.prim.lambda/p7.cpp
@@ -45,9 +45,11 @@ void test_capture_constness(int i, const int ic) {
struct S1 {
int x, y;
+ S1 &operator=(int*);
int operator()(int);
void f() {
[&]()->int {
+ S1 &s1 = operator=(&this->x);
return operator()(this->x + y);
}();
}