зеркало из https://github.com/microsoft/clang-1.git
Undid my yesterday patch which is not needed with an upcoming patch.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81549 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
6cc1518b9f
Коммит
8664ad5cbd
|
@ -858,9 +858,6 @@ public:
|
|||
void AddTemplateConversionCandidate(FunctionTemplateDecl *FunctionTemplate,
|
||||
Expr *From, QualType ToType,
|
||||
OverloadCandidateSet &CandidateSet);
|
||||
void AddAllConversionCandidate(CXXRecordDecl *ClassDecl, Expr *From,
|
||||
QualType ToType, bool AllowExplicit,
|
||||
OverloadCandidateSet &CandidateSet);
|
||||
void AddSurrogateCandidate(CXXConversionDecl *Conversion,
|
||||
const FunctionProtoType *Proto,
|
||||
Expr *Object, Expr **Args, unsigned NumArgs,
|
||||
|
|
|
@ -1331,52 +1331,6 @@ static void GetFunctionAndTemplate(AnyFunctionDecl Orig, T *&Function,
|
|||
Function = cast<T>(Orig);
|
||||
}
|
||||
|
||||
void
|
||||
Sema::AddAllConversionCandidate(CXXRecordDecl *ClassDecl, Expr *From,
|
||||
QualType ToType, bool AllowExplicit,
|
||||
OverloadCandidateSet &CandidateSet) {
|
||||
for (CXXRecordDecl::base_class_iterator VBase = ClassDecl->vbases_begin(),
|
||||
E = ClassDecl->vbases_end(); VBase != E; ++VBase) {
|
||||
CXXRecordDecl *BaseClassDecl
|
||||
= cast<CXXRecordDecl>(VBase->getType()->getAs<RecordType>()->getDecl());
|
||||
AddAllConversionCandidate(BaseClassDecl, From, ToType, AllowExplicit,
|
||||
CandidateSet);
|
||||
}
|
||||
for (CXXRecordDecl::base_class_iterator Base =
|
||||
ClassDecl->bases_begin(),
|
||||
E = ClassDecl->bases_end(); Base != E; ++Base) {
|
||||
if (Base->isVirtual())
|
||||
continue;
|
||||
CXXRecordDecl *BaseClassDecl
|
||||
= cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
|
||||
AddAllConversionCandidate(BaseClassDecl, From, ToType, AllowExplicit,
|
||||
CandidateSet);
|
||||
}
|
||||
|
||||
OverloadedFunctionDecl *Conversions
|
||||
= ClassDecl->getConversionFunctions();
|
||||
|
||||
for (OverloadedFunctionDecl::function_iterator Func
|
||||
= Conversions->function_begin();
|
||||
Func != Conversions->function_end(); ++Func) {
|
||||
CXXConversionDecl *Conv;
|
||||
FunctionTemplateDecl *ConvTemplate;
|
||||
GetFunctionAndTemplate(*Func, Conv, ConvTemplate);
|
||||
if (ConvTemplate)
|
||||
Conv = dyn_cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
|
||||
else
|
||||
Conv = dyn_cast<CXXConversionDecl>(*Func);
|
||||
|
||||
if (AllowExplicit || !Conv->isExplicit()) {
|
||||
if (ConvTemplate)
|
||||
AddTemplateConversionCandidate(ConvTemplate, From, ToType,
|
||||
CandidateSet);
|
||||
else
|
||||
AddConversionCandidate(Conv, From, ToType, CandidateSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Determines whether there is a user-defined conversion sequence
|
||||
/// (C++ [over.ics.user]) that converts expression From to the type
|
||||
/// ToType. If such a conversion exists, User will contain the
|
||||
|
@ -1451,10 +1405,31 @@ bool Sema::IsUserDefinedConversion(Expr *From, QualType ToType,
|
|||
} else if (const RecordType *FromRecordType
|
||||
= From->getType()->getAs<RecordType>()) {
|
||||
if (CXXRecordDecl *FromRecordDecl
|
||||
= dyn_cast<CXXRecordDecl>(FromRecordType->getDecl()))
|
||||
// Add all of the conversion functions as candidates.
|
||||
AddAllConversionCandidate(FromRecordDecl, From, ToType, AllowExplicit,
|
||||
CandidateSet);
|
||||
= dyn_cast<CXXRecordDecl>(FromRecordType->getDecl())) {
|
||||
// Add all of the conversion functions as candidates.
|
||||
// FIXME: Look for conversions in base classes!
|
||||
OverloadedFunctionDecl *Conversions
|
||||
= FromRecordDecl->getConversionFunctions();
|
||||
for (OverloadedFunctionDecl::function_iterator Func
|
||||
= Conversions->function_begin();
|
||||
Func != Conversions->function_end(); ++Func) {
|
||||
CXXConversionDecl *Conv;
|
||||
FunctionTemplateDecl *ConvTemplate;
|
||||
GetFunctionAndTemplate(*Func, Conv, ConvTemplate);
|
||||
if (ConvTemplate)
|
||||
Conv = dyn_cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
|
||||
else
|
||||
Conv = dyn_cast<CXXConversionDecl>(*Func);
|
||||
|
||||
if (AllowExplicit || !Conv->isExplicit()) {
|
||||
if (ConvTemplate)
|
||||
AddTemplateConversionCandidate(ConvTemplate, From, ToType,
|
||||
CandidateSet);
|
||||
else
|
||||
AddConversionCandidate(Conv, From, ToType, CandidateSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OverloadCandidateSet::iterator Best;
|
||||
|
|
Загрузка…
Ссылка в новой задаче