[cfe-commits] r81467 - in /cfe/trunk/lib/Sema: Sema.h SemaOverload.cpp
Fariborz Jahanian
fjahanian at apple.com
Thu Sep 10 15:26:16 PDT 2009
Author: fjahanian
Date: Thu Sep 10 17:26:16 2009
New Revision: 81467
URL: http://llvm.org/viewvc/llvm-project?rev=81467&view=rev
Log:
Patch to collect conversion methods in base(s) and derived
class into a candidate set.
Modified:
cfe/trunk/lib/Sema/Sema.h
cfe/trunk/lib/Sema/SemaOverload.cpp
Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=81467&r1=81466&r2=81467&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Thu Sep 10 17:26:16 2009
@@ -850,6 +850,9 @@
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,
Modified: cfe/trunk/lib/Sema/SemaOverload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=81467&r1=81466&r2=81467&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Thu Sep 10 17:26:16 2009
@@ -1331,6 +1331,51 @@
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
@@ -1406,31 +1451,10 @@
} 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.
- // 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);
- }
- }
- }
+ = dyn_cast<CXXRecordDecl>(FromRecordType->getDecl()))
+ // Add all of the conversion functions as candidates.
+ AddAllConversionCandidate(FromRecordDecl, From, ToType, AllowExplicit,
+ CandidateSet);
}
OverloadCandidateSet::iterator Best;
More information about the cfe-commits
mailing list