[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