summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2014-12-10 20:04:48 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2014-12-10 20:04:48 +0000
commit80f57f68429897fa611b39adf9190019355ec73b (patch)
tree81ad3339f89cb01283adeb1875cdfcfcf7a4388b /clang
parent2326650ceb3efd7b75c96eef8e6e7ecb0f1cc3c7 (diff)
downloadbcm5719-llvm-80f57f68429897fa611b39adf9190019355ec73b.tar.gz
bcm5719-llvm-80f57f68429897fa611b39adf9190019355ec73b.zip
DR1891, PR21787: a lambda closure type has no default constructor, rather than
having a deleted default constructor. llvm-svn: 223953
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/AST/DeclCXX.h6
-rw-r--r--clang/test/CXX/drs/dr18xx.cpp24
-rw-r--r--clang/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp4
-rw-r--r--clang/test/CXX/expr/expr.prim/expr.prim.lambda/p3.cpp6
4 files changed, 34 insertions, 6 deletions
diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h
index 062c1527d7b..027b41e27da 100644
--- a/clang/include/clang/AST/DeclCXX.h
+++ b/clang/include/clang/AST/DeclCXX.h
@@ -826,7 +826,11 @@ public:
/// This value is used for lazy creation of default constructors.
bool needsImplicitDefaultConstructor() const {
return !data().UserDeclaredConstructor &&
- !(data().DeclaredSpecialMembers & SMF_DefaultConstructor);
+ !(data().DeclaredSpecialMembers & SMF_DefaultConstructor) &&
+ // C++14 [expr.prim.lambda]p20:
+ // The closure type associated with a lambda-expression has no
+ // default constructor.
+ !isLambda();
}
/// \brief Determine whether this class has any user-declared constructors.
diff --git a/clang/test/CXX/drs/dr18xx.cpp b/clang/test/CXX/drs/dr18xx.cpp
new file mode 100644
index 00000000000..d81ab82e74f
--- /dev/null
+++ b/clang/test/CXX/drs/dr18xx.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -std=c++98 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
+// RUN: %clang_cc1 -std=c++1z -triple x86_64-unknown-unknown %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
+
+#if __cplusplus < 201103L
+// expected-no-diagnostics
+#endif
+
+void dr1891() { // dr1891: yes
+#if __cplusplus >= 201103L
+ int n;
+ auto a = []{}; // expected-note 2{{candidate}}
+ auto b = [=]{ return n; }; // expected-note 2{{candidate}}
+ typedef decltype(a) A;
+ typedef decltype(b) B;
+
+ static_assert(!__has_trivial_constructor(A), "");
+ static_assert(!__has_trivial_constructor(B), "");
+
+ A x; // expected-error {{no matching constructor}}
+ B y; // expected-error {{no matching constructor}}
+#endif
+}
diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp
index 35b77896c86..40360e40694 100644
--- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp
+++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp
@@ -7,10 +7,10 @@ struct MoveOnly {
template<typename T> T &&move(T&);
void test_special_member_functions(MoveOnly mo, int i) {
- auto lambda1 = [i]() { }; // expected-note 2 {{lambda expression begins here}}
+ auto lambda1 = [i]() { }; // expected-note {{lambda expression begins here}} expected-note 2{{candidate}}
// Default constructor
- decltype(lambda1) lambda2; // expected-error{{call to implicitly-deleted default constructor of 'decltype(lambda1)' (aka '(lambda}}
+ decltype(lambda1) lambda2; // expected-error{{no matching constructor}}
// Copy assignment operator
lambda1 = lambda1; // expected-error{{copy assignment operator is implicitly deleted}}
diff --git a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p3.cpp b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p3.cpp
index c0fa72ba42f..80771d7a229 100644
--- a/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p3.cpp
+++ b/clang/test/CXX/expr/expr.prim/expr.prim.lambda/p3.cpp
@@ -1,11 +1,11 @@
// RUN: %clang_cc1 -fsyntax-only -std=c++11 %s -verify
void test_nonaggregate(int i) {
- auto lambda = [i]() -> void {}; // expected-note 3{{candidate constructor}}
+ auto lambda = [i]() -> void {}; // expected-note 2{{candidate constructor}}
decltype(lambda) foo = { 1 }; // expected-error{{no matching constructor}}
static_assert(!__is_literal(decltype(lambda)), "");
- auto lambda2 = []{}; // expected-note {{lambda}}
- decltype(lambda2) bar = {}; // expected-error{{call to implicitly-deleted default constructor}}
+ auto lambda2 = []{}; // expected-note 2{{candidate constructor}}
+ decltype(lambda2) bar = {}; // expected-error{{no matching constructor}}
static_assert(!__is_literal(decltype(lambda2)), "");
}
OpenPOWER on IntegriCloud