diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-11 18:46:22 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-09-11 18:46:22 +0000 |
commit | 8664ad5cbdf01ac9878c8f762cc91f4bb7196098 (patch) | |
tree | 180ce2a0713ff4afd570a1a40b9eaeec2404f77a /lib/Sema/SemaOverload.cpp | |
parent | 6cc1518b9f15ca846b8c35518eeae9557935678d (diff) |
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
Diffstat (limited to 'lib/Sema/SemaOverload.cpp')
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 75 |
1 files changed, 25 insertions, 50 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 4891527e7b..dde58882a9 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -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; |