mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-02 14:56:08 +00:00
Fix assertion failure due to implicit special member lookup lacking a source location.
llvm-svn: 295149
This commit is contained in:
parent
96e36a67ed
commit
171e4b545d
@ -2838,6 +2838,9 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD,
|
||||
assert((SM != CXXDefaultConstructor && SM != CXXDestructor) &&
|
||||
"parameter-less special members can't have qualified arguments");
|
||||
|
||||
// FIXME: Get the caller to pass in a location for the lookup.
|
||||
SourceLocation LookupLoc = RD->getLocation();
|
||||
|
||||
llvm::FoldingSetNodeID ID;
|
||||
ID.AddPointer(RD);
|
||||
ID.AddInteger(SM);
|
||||
@ -2919,7 +2922,7 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD,
|
||||
VK = VK_RValue;
|
||||
}
|
||||
|
||||
OpaqueValueExpr FakeArg(SourceLocation(), ArgType, VK);
|
||||
OpaqueValueExpr FakeArg(LookupLoc, ArgType, VK);
|
||||
|
||||
if (SM != CXXDefaultConstructor) {
|
||||
NumArgs = 1;
|
||||
@ -2933,13 +2936,13 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD,
|
||||
if (VolatileThis)
|
||||
ThisTy.addVolatile();
|
||||
Expr::Classification Classification =
|
||||
OpaqueValueExpr(SourceLocation(), ThisTy,
|
||||
OpaqueValueExpr(LookupLoc, ThisTy,
|
||||
RValueThis ? VK_RValue : VK_LValue).Classify(Context);
|
||||
|
||||
// Now we perform lookup on the name we computed earlier and do overload
|
||||
// resolution. Lookup is only performed directly into the class since there
|
||||
// will always be a (possibly implicit) declaration to shadow any others.
|
||||
OverloadCandidateSet OCS(RD->getLocation(), OverloadCandidateSet::CSK_Normal);
|
||||
OverloadCandidateSet OCS(LookupLoc, OverloadCandidateSet::CSK_Normal);
|
||||
DeclContext::lookup_result R = RD->lookup(Name);
|
||||
|
||||
if (R.empty()) {
|
||||
@ -2994,7 +2997,7 @@ Sema::SpecialMemberOverloadResult *Sema::LookupSpecialMember(CXXRecordDecl *RD,
|
||||
}
|
||||
|
||||
OverloadCandidateSet::iterator Best;
|
||||
switch (OCS.BestViableFunction(*this, SourceLocation(), Best)) {
|
||||
switch (OCS.BestViableFunction(*this, LookupLoc, Best)) {
|
||||
case OR_Success:
|
||||
Result->setMethod(cast<CXXMethodDecl>(Best->Function));
|
||||
Result->setKind(SpecialMemberOverloadResult::Success);
|
||||
|
@ -105,3 +105,31 @@ namespace PR31606 {
|
||||
// Note, we do *not* allow operator=='s argument to use the inherited A::A(Base&&) constructor to construct from B{}.
|
||||
bool b = A{} == B{}; // expected-error {{invalid operands}}
|
||||
}
|
||||
|
||||
namespace implicit_member_srcloc {
|
||||
template<class T>
|
||||
struct S3 {
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct S2 {
|
||||
S2(S3<T> &&);
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct S1 : S2<T> {
|
||||
using S2<T>::S2;
|
||||
S1();
|
||||
};
|
||||
|
||||
template<class T>
|
||||
struct S0 {
|
||||
S0();
|
||||
S0(S0&&) = default;
|
||||
S1<T> m1;
|
||||
};
|
||||
|
||||
void foo1() {
|
||||
S0<int> s0;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user