]> granicus.if.org Git - clang/commitdiff
Fix review comment; no visible change.
authorEli Friedman <eli.friedman@gmail.com>
Sun, 20 Dec 2009 22:12:03 +0000 (22:12 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sun, 20 Dec 2009 22:12:03 +0000 (22:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91797 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaInit.cpp

index 18164d685f6f565912646da71ebd82afaeb0eaaa..466e6ccaf8f989fd4037d500b06851fa5bdb6d70 100644 (file)
@@ -2727,37 +2727,38 @@ static void TryUserDefinedConversion(Sema &S,
     // The type we're converting from is a class type, enumerate its conversion
     // functions.
 
-    // Try to force the type to be complete before enumerating the conversion
-    // functions; it's okay if this fails, though.
-    S.RequireCompleteType(DeclLoc, SourceType, 0);
-
-    CXXRecordDecl *SourceRecordDecl
-      = cast<CXXRecordDecl>(SourceRecordType->getDecl());
-    
-    const UnresolvedSet *Conversions
-      = SourceRecordDecl->getVisibleConversionFunctions();
-    for (UnresolvedSet::iterator I = Conversions->begin(),
-         E = Conversions->end(); 
-         I != E; ++I) {
-      NamedDecl *D = *I;
-      CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
-      if (isa<UsingShadowDecl>(D))
-        D = cast<UsingShadowDecl>(D)->getTargetDecl();
-      
-      FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
-      CXXConversionDecl *Conv;
-      if (ConvTemplate)
-        Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
-      else
-        Conv = cast<CXXConversionDecl>(*I);
+    // We can only enumerate the conversion functions for a complete type; if
+    // the type isn't complete, simply skip this step.
+    if (!S.RequireCompleteType(DeclLoc, SourceType, 0)) {
+      CXXRecordDecl *SourceRecordDecl
+        = cast<CXXRecordDecl>(SourceRecordType->getDecl());
       
-      if (AllowExplicit || !Conv->isExplicit()) {
+      const UnresolvedSet *Conversions
+        = SourceRecordDecl->getVisibleConversionFunctions();
+      for (UnresolvedSet::iterator I = Conversions->begin(),
+           E = Conversions->end(); 
+           I != E; ++I) {
+        NamedDecl *D = *I;
+        CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(D->getDeclContext());
+        if (isa<UsingShadowDecl>(D))
+          D = cast<UsingShadowDecl>(D)->getTargetDecl();
+        
+        FunctionTemplateDecl *ConvTemplate = dyn_cast<FunctionTemplateDecl>(D);
+        CXXConversionDecl *Conv;
         if (ConvTemplate)
-          S.AddTemplateConversionCandidate(ConvTemplate, ActingDC, Initializer,
-                                           DestType, CandidateSet);
+          Conv = cast<CXXConversionDecl>(ConvTemplate->getTemplatedDecl());
         else
-          S.AddConversionCandidate(Conv, ActingDC, Initializer, DestType,
-                                   CandidateSet);
+          Conv = cast<CXXConversionDecl>(*I);
+        
+        if (AllowExplicit || !Conv->isExplicit()) {
+          if (ConvTemplate)
+            S.AddTemplateConversionCandidate(ConvTemplate, ActingDC,
+                                             Initializer, DestType,
+                                             CandidateSet);
+          else
+            S.AddConversionCandidate(Conv, ActingDC, Initializer, DestType,
+                                     CandidateSet);
+        }
       }
     }
   }