forked from OSchip/llvm-project
Introduce a new routine, LookupConstructors(), and use it for all
constructor-name lookup. llvm-svn: 107536
This commit is contained in:
parent
04b97967dd
commit
52b7282081
|
@ -1478,6 +1478,7 @@ public:
|
|||
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S,
|
||||
QualType T1, QualType T2,
|
||||
UnresolvedSetImpl &Functions);
|
||||
DeclContext::lookup_result LookupConstructors(CXXRecordDecl *Class);
|
||||
CXXDestructorDecl *LookupDestructor(CXXRecordDecl *Class);
|
||||
|
||||
void ArgumentDependentLookup(DeclarationName Name, bool Operator,
|
||||
|
|
|
@ -2272,11 +2272,8 @@ static OverloadingResult TryRefInitWithConversionFunction(Sema &S,
|
|||
// The type we're converting to is a class type. Enumerate its constructors
|
||||
// to see if there is a suitable conversion.
|
||||
CXXRecordDecl *T1RecordDecl = cast<CXXRecordDecl>(T1RecordType->getDecl());
|
||||
DeclarationName ConstructorName
|
||||
= S.Context.DeclarationNames.getCXXConstructorName(
|
||||
S.Context.getCanonicalType(T1).getUnqualifiedType());
|
||||
DeclContext::lookup_iterator Con, ConEnd;
|
||||
for (llvm::tie(Con, ConEnd) = T1RecordDecl->lookup(ConstructorName);
|
||||
for (llvm::tie(Con, ConEnd) = S.LookupConstructors(T1RecordDecl);
|
||||
Con != ConEnd; ++Con) {
|
||||
NamedDecl *D = *Con;
|
||||
DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess());
|
||||
|
@ -2670,11 +2667,8 @@ static void TryConstructorInitialization(Sema &S,
|
|||
CXXRecordDecl *DestRecordDecl
|
||||
= cast<CXXRecordDecl>(DestRecordType->getDecl());
|
||||
|
||||
DeclarationName ConstructorName
|
||||
= S.Context.DeclarationNames.getCXXConstructorName(
|
||||
S.Context.getCanonicalType(DestType).getUnqualifiedType());
|
||||
DeclContext::lookup_iterator Con, ConEnd;
|
||||
for (llvm::tie(Con, ConEnd) = DestRecordDecl->lookup(ConstructorName);
|
||||
for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl);
|
||||
Con != ConEnd; ++Con) {
|
||||
NamedDecl *D = *Con;
|
||||
DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess());
|
||||
|
@ -2850,11 +2844,8 @@ static void TryUserDefinedConversion(Sema &S,
|
|||
|
||||
// Try to complete the type we're converting to.
|
||||
if (!S.RequireCompleteType(Kind.getLocation(), DestType, 0)) {
|
||||
DeclarationName ConstructorName
|
||||
= S.Context.DeclarationNames.getCXXConstructorName(
|
||||
S.Context.getCanonicalType(DestType).getUnqualifiedType());
|
||||
DeclContext::lookup_iterator Con, ConEnd;
|
||||
for (llvm::tie(Con, ConEnd) = DestRecordDecl->lookup(ConstructorName);
|
||||
for (llvm::tie(Con, ConEnd) = S.LookupConstructors(DestRecordDecl);
|
||||
Con != ConEnd; ++Con) {
|
||||
NamedDecl *D = *Con;
|
||||
DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess());
|
||||
|
@ -3303,12 +3294,9 @@ static Sema::OwningExprResult CopyObject(Sema &S,
|
|||
return move(CurInit);
|
||||
|
||||
// Perform overload resolution using the class's copy constructors.
|
||||
DeclarationName ConstructorName
|
||||
= S.Context.DeclarationNames.getCXXConstructorName(
|
||||
S.Context.getCanonicalType(S.Context.getTypeDeclType(Class)));
|
||||
DeclContext::lookup_iterator Con, ConEnd;
|
||||
OverloadCandidateSet CandidateSet(Loc);
|
||||
for (llvm::tie(Con, ConEnd) = Class->lookup(ConstructorName);
|
||||
for (llvm::tie(Con, ConEnd) = S.LookupConstructors(Class);
|
||||
Con != ConEnd; ++Con) {
|
||||
// Only consider copy constructors.
|
||||
CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(*Con);
|
||||
|
|
|
@ -1990,6 +1990,16 @@ void Sema::LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S,
|
|||
}
|
||||
}
|
||||
|
||||
/// \brief Look up the constructors for the given class.
|
||||
DeclContext::lookup_result Sema::LookupConstructors(CXXRecordDecl *Class) {
|
||||
if (!Class->getDefinition())
|
||||
return DeclContext::lookup_result();
|
||||
|
||||
CanQualType T = Context.getCanonicalType(Context.getTypeDeclType(Class));
|
||||
DeclarationName Name = Context.DeclarationNames.getCXXConstructorName(T);
|
||||
return Class->lookup(Name);
|
||||
}
|
||||
|
||||
/// \brief Look for the destructor of the given class.
|
||||
///
|
||||
/// During semantic analysis, this routine should be used in lieu of
|
||||
|
|
|
@ -1896,12 +1896,8 @@ OverloadingResult Sema::IsUserDefinedConversion(Expr *From, QualType ToType,
|
|||
// We're not going to find any constructors.
|
||||
} else if (CXXRecordDecl *ToRecordDecl
|
||||
= dyn_cast<CXXRecordDecl>(ToRecordType->getDecl())) {
|
||||
DeclarationName ConstructorName
|
||||
= Context.DeclarationNames.getCXXConstructorName(
|
||||
Context.getCanonicalType(ToType).getUnqualifiedType());
|
||||
DeclContext::lookup_iterator Con, ConEnd;
|
||||
for (llvm::tie(Con, ConEnd)
|
||||
= ToRecordDecl->lookup(ConstructorName);
|
||||
for (llvm::tie(Con, ConEnd) = LookupConstructors(ToRecordDecl);
|
||||
Con != ConEnd; ++Con) {
|
||||
NamedDecl *D = *Con;
|
||||
DeclAccessPair FoundDecl = DeclAccessPair::make(D, D->getAccess());
|
||||
|
|
Loading…
Reference in New Issue