[cfe-commits] r123182 - /cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp

Douglas Gregor dgregor at apple.com
Mon Jan 10 09:53:52 PST 2011


Author: dgregor
Date: Mon Jan 10 11:53:52 2011
New Revision: 123182

URL: http://llvm.org/viewvc/llvm-project?rev=123182&view=rev
Log:
Repent for my copy-and-paste sins, factoring out the code that forms
argument packs from a set of deduced arguments, then checks that those
argument packs match previously-deduced argument packs.

Modified:
    cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp

Modified: cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp?rev=123182&r1=123181&r2=123182&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplateDeduction.cpp Mon Jan 10 11:53:52 2011
@@ -543,6 +543,61 @@
   }
 }
 
+/// \brief Finish template argument deduction for a set of argument packs,
+/// producing the argument packs and checking for consistency with prior
+/// deductions.
+static Sema::TemplateDeductionResult
+FinishArgumentPackDeduction(Sema &S,
+                            TemplateParameterList *TemplateParams,
+                            bool HasAnyArguments,
+                        llvm::SmallVectorImpl<DeducedTemplateArgument> &Deduced, 
+                            const llvm::SmallVectorImpl<unsigned> &PackIndices,
+                    llvm::SmallVectorImpl<DeducedTemplateArgument> &SavedPacks, 
+        llvm::SmallVectorImpl<
+          llvm::SmallVector<DeducedTemplateArgument, 4> > &NewlyDeducedPacks,
+                            TemplateDeductionInfo &Info) {
+  // Build argument packs for each of the parameter packs expanded by this
+  // pack expansion.
+  for (unsigned I = 0, N = PackIndices.size(); I != N; ++I) {
+    if (HasAnyArguments && NewlyDeducedPacks[I].empty()) {
+      // We were not able to deduce anything for this parameter pack,
+      // so just restore the saved argument pack.
+      Deduced[PackIndices[I]] = SavedPacks[I];
+      continue;
+    }
+    
+    DeducedTemplateArgument NewPack;
+    
+    if (NewlyDeducedPacks[I].empty()) {
+      // If we deduced an empty argument pack, create it now.
+      NewPack = DeducedTemplateArgument(TemplateArgument(0, 0));
+    } else {
+      TemplateArgument *ArgumentPack
+      = new (S.Context) TemplateArgument [NewlyDeducedPacks[I].size()];
+      std::copy(NewlyDeducedPacks[I].begin(), NewlyDeducedPacks[I].end(),
+                ArgumentPack);
+      NewPack
+      = DeducedTemplateArgument(TemplateArgument(ArgumentPack,
+                                                 NewlyDeducedPacks[I].size()),
+                                NewlyDeducedPacks[I][0].wasDeducedFromArrayBound());        
+    }
+    
+    DeducedTemplateArgument Result
+      = checkDeducedTemplateArguments(S.Context, SavedPacks[I], NewPack);
+    if (Result.isNull()) {
+      Info.Param
+        = makeTemplateParameter(TemplateParams->getParam(PackIndices[I]));
+      Info.FirstArg = SavedPacks[I];
+      Info.SecondArg = NewPack;
+      return Sema::TDK_Inconsistent;
+    }
+    
+    Deduced[PackIndices[I]] = Result;
+  }
+  
+  return Sema::TDK_Success;
+}
+
 /// \brief Deduce the template arguments by comparing the list of parameter
 /// types to the list of argument types, as in the parameter-type-lists of 
 /// function types (C++ [temp.deduct.type]p10). 
@@ -672,42 +727,11 @@
     
     // Build argument packs for each of the parameter packs expanded by this
     // pack expansion.
-    for (unsigned I = 0, N = PackIndices.size(); I != N; ++I) {
-      if (HasAnyArguments && NewlyDeducedPacks[I].empty()) {
-        // We were not able to deduce anything for this parameter pack,
-        // so just restore the saved argument pack.
-        Deduced[PackIndices[I]] = SavedPacks[I];
-        continue;
-      }
-      
-      DeducedTemplateArgument NewPack;
-      
-      if (NewlyDeducedPacks[I].empty()) {
-        // If we deduced an empty argument pack, create it now.
-        NewPack = DeducedTemplateArgument(TemplateArgument(0, 0));
-      } else {
-        TemplateArgument *ArgumentPack
-          = new (S.Context) TemplateArgument [NewlyDeducedPacks[I].size()];
-        std::copy(NewlyDeducedPacks[I].begin(), NewlyDeducedPacks[I].end(),
-                  ArgumentPack);
-        NewPack
-          = DeducedTemplateArgument(TemplateArgument(ArgumentPack,
-                                                   NewlyDeducedPacks[I].size()),
-                            NewlyDeducedPacks[I][0].wasDeducedFromArrayBound());        
-      }
-      
-      DeducedTemplateArgument Result
-        = checkDeducedTemplateArguments(S.Context, SavedPacks[I], NewPack);
-      if (Result.isNull()) {
-        Info.Param
-          = makeTemplateParameter(TemplateParams->getParam(PackIndices[I]));
-        Info.FirstArg = SavedPacks[I];
-        Info.SecondArg = NewPack;
-        return Sema::TDK_Inconsistent;
-      }
-      
-      Deduced[PackIndices[I]] = Result;
-    }
+    if (Sema::TemplateDeductionResult Result
+          = FinishArgumentPackDeduction(S, TemplateParams, HasAnyArguments, 
+                                        Deduced, PackIndices, SavedPacks,
+                                        NewlyDeducedPacks, Info))
+      return Result;    
   }
   
   // Make sure we don't have any extra arguments.
@@ -1425,42 +1449,11 @@
     
     // Build argument packs for each of the parameter packs expanded by this
     // pack expansion.
-    for (unsigned I = 0, N = PackIndices.size(); I != N; ++I) {
-      if (HasAnyArguments && NewlyDeducedPacks[I].empty()) {
-        // We were not able to deduce anything for this parameter pack,
-        // so just restore the saved argument pack.
-        Deduced[PackIndices[I]] = SavedPacks[I];
-        continue;
-      }
-      
-      DeducedTemplateArgument NewPack;
-      
-      if (NewlyDeducedPacks[I].empty()) {
-        // If we deduced an empty argument pack, create it now.
-        NewPack = DeducedTemplateArgument(TemplateArgument(0, 0));
-      } else {
-        TemplateArgument *ArgumentPack
-          = new (S.Context) TemplateArgument [NewlyDeducedPacks[I].size()];
-        std::copy(NewlyDeducedPacks[I].begin(), NewlyDeducedPacks[I].end(),
-                  ArgumentPack);
-        NewPack
-          = DeducedTemplateArgument(TemplateArgument(ArgumentPack,
-                                                   NewlyDeducedPacks[I].size()),
-                            NewlyDeducedPacks[I][0].wasDeducedFromArrayBound());        
-      }
-
-      DeducedTemplateArgument Result
-        = checkDeducedTemplateArguments(S.Context, SavedPacks[I], NewPack);
-      if (Result.isNull()) {
-        Info.Param
-          = makeTemplateParameter(TemplateParams->getParam(PackIndices[I]));
-        Info.FirstArg = SavedPacks[I];
-        Info.SecondArg = NewPack;
-        return Sema::TDK_Inconsistent;
-      }
-      
-      Deduced[PackIndices[I]] = Result;
-    }
+    if (Sema::TemplateDeductionResult Result
+          = FinishArgumentPackDeduction(S, TemplateParams, HasAnyArguments, 
+                                        Deduced, PackIndices, SavedPacks,
+                                        NewlyDeducedPacks, Info))
+      return Result;    
   }
   
   // If there is an argument remaining, then we had too many arguments.
@@ -2557,42 +2550,11 @@
     
     // Build argument packs for each of the parameter packs expanded by this
     // pack expansion.
-    for (unsigned I = 0, N = PackIndices.size(); I != N; ++I) {
-      if (HasAnyArguments && NewlyDeducedPacks[I].empty()) {
-        // We were not able to deduce anything for this parameter pack,
-        // so just restore the saved argument pack.
-        Deduced[PackIndices[I]] = SavedPacks[I];
-        continue;
-      }
-      
-      DeducedTemplateArgument NewPack;
-      
-      if (NewlyDeducedPacks[I].empty()) {
-        // If we deduced an empty argument pack, create it now.
-        NewPack = DeducedTemplateArgument(TemplateArgument(0, 0));
-      } else {
-        TemplateArgument *ArgumentPack
-          = new (Context) TemplateArgument [NewlyDeducedPacks[I].size()];
-        std::copy(NewlyDeducedPacks[I].begin(), NewlyDeducedPacks[I].end(),
-                  ArgumentPack);
-        NewPack
-          = DeducedTemplateArgument(TemplateArgument(ArgumentPack,
-                                                   NewlyDeducedPacks[I].size()),
-                                  NewlyDeducedPacks[I][0].wasDeducedFromArrayBound());        
-      }
-      
-      DeducedTemplateArgument Result
-        = checkDeducedTemplateArguments(Context, SavedPacks[I], NewPack);
-      if (Result.isNull()) {
-        Info.Param
-          = makeTemplateParameter(TemplateParams->getParam(PackIndices[I]));
-        Info.FirstArg = SavedPacks[I];
-        Info.SecondArg = NewPack;
-        return Sema::TDK_Inconsistent;
-      }
-      
-      Deduced[PackIndices[I]] = Result;
-    }
+    if (Sema::TemplateDeductionResult Result
+          = FinishArgumentPackDeduction(*this, TemplateParams, HasAnyArguments, 
+                                        Deduced, PackIndices, SavedPacks,
+                                        NewlyDeducedPacks, Info))
+      return Result;    
 
     // After we've matching against a parameter pack, we're done.
     break;





More information about the cfe-commits mailing list