summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-02-11 01:48:47 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-02-11 01:48:47 +0000
commit8c37ab5ffdbab1f3cd5c9348db49782ff41b1279 (patch)
treeb02f38fa52c43c0be4ba8f16eebc8cfd856ccfec
parentfe21713e2ae095f1bac938944f3112550fc91757 (diff)
downloadbcm5719-llvm-8c37ab5ffdbab1f3cd5c9348db49782ff41b1279.tar.gz
bcm5719-llvm-8c37ab5ffdbab1f3cd5c9348db49782ff41b1279.zip
PR21857: weaken an incorrect assertion.
llvm-svn: 228785
-rw-r--r--clang/lib/Sema/SemaLookup.cpp14
-rw-r--r--clang/test/SemaCXX/lambda-expressions.cpp9
2 files changed, 21 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp
index 9184a9fd828..65e8ffb6010 100644
--- a/clang/lib/Sema/SemaLookup.cpp
+++ b/clang/lib/Sema/SemaLookup.cpp
@@ -2503,8 +2503,18 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD,
// will always be a (possibly implicit) declaration to shadow any others.
OverloadCandidateSet OCS(RD->getLocation(), OverloadCandidateSet::CSK_Normal);
DeclContext::lookup_result R = RD->lookup(Name);
- assert(!R.empty() &&
- "lookup for a constructor or assignment operator was empty");
+
+ if (R.empty()) {
+ // We might have no default constructor because we have a lambda's closure
+ // type, rather than because there's some other declared constructor.
+ // Every class has a copy/move constructor, copy/move assignment, and
+ // destructor.
+ assert(SM == CXXDefaultConstructor &&
+ "lookup for a constructor or assignment operator was empty");
+ Result->setMethod(nullptr);
+ Result->setKind(SpecialMemberOverloadResult::NoMemberOrDeleted);
+ return Result;
+ }
// Copy the candidates as our processing of them may load new declarations
// from an external source and invalidate lookup_result.
diff --git a/clang/test/SemaCXX/lambda-expressions.cpp b/clang/test/SemaCXX/lambda-expressions.cpp
index cad322ab52f..7911c1b7cc5 100644
--- a/clang/test/SemaCXX/lambda-expressions.cpp
+++ b/clang/test/SemaCXX/lambda-expressions.cpp
@@ -437,3 +437,12 @@ namespace error_in_transform_prototype {
f(S()); // expected-note {{requested here}}
}
}
+
+namespace PR21857 {
+ template<typename Fn> struct fun : Fn {
+ fun() = default;
+ using Fn::operator();
+ };
+ template<typename Fn> fun<Fn> wrap(Fn fn);
+ auto x = wrap([](){});
+}
OpenPOWER on IntegriCloud