Seems like a reasonable candidate for branch: just turning an assertion failure into proper handling of the relevant case.
On Tue, Feb 10, 2015 at 5:48 PM, Richard Smith <[email protected]> wrote: > Author: rsmith > Date: Tue Feb 10 19:48:47 2015 > New Revision: 228785 > > URL: http://llvm.org/viewvc/llvm-project?rev=228785&view=rev > Log: > PR21857: weaken an incorrect assertion. > > Modified: > cfe/trunk/lib/Sema/SemaLookup.cpp > cfe/trunk/test/SemaCXX/lambda-expressions.cpp > > Modified: cfe/trunk/lib/Sema/SemaLookup.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=228785&r1=228784&r2=228785&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaLookup.cpp (original) > +++ cfe/trunk/lib/Sema/SemaLookup.cpp Tue Feb 10 19:48:47 2015 > @@ -2503,8 +2503,18 @@ Sema::SpecialMemberOverloadResult *Sema: > // 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. > > Modified: cfe/trunk/test/SemaCXX/lambda-expressions.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/lambda-expressions.cpp?rev=228785&r1=228784&r2=228785&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaCXX/lambda-expressions.cpp (original) > +++ cfe/trunk/test/SemaCXX/lambda-expressions.cpp Tue Feb 10 19:48:47 2015 > @@ -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([](){}); > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
