1 //===------- SemaTemplateDeduction.cpp - Template Argument Deduction ------===/
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //===----------------------------------------------------------------------===/
8 //
9 //  This file implements C++ template argument deduction.
10 //
11 //===----------------------------------------------------------------------===/
12 
13 #include "Sema.h"
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/DeclTemplate.h"
16 #include "clang/AST/StmtVisitor.h"
17 #include "clang/AST/Expr.h"
18 #include "clang/AST/ExprCXX.h"
19 #include "clang/Parse/DeclSpec.h"
20 #include "llvm/Support/Compiler.h"
21 
22 namespace clang {
23   /// \brief Various flags that control template argument deduction.
24   ///
25   /// These flags can be bitwise-OR'd together.
26   enum TemplateDeductionFlags {
27     /// \brief No template argument deduction flags, which indicates the
28     /// strictest results for template argument deduction (as used for, e.g.,
29     /// matching class template partial specializations).
30     TDF_None = 0,
31     /// \brief Within template argument deduction from a function call, we are
32     /// matching with a parameter type for which the original parameter was
33     /// a reference.
34     TDF_ParamWithReferenceType = 0x1,
35     /// \brief Within template argument deduction from a function call, we
36     /// are matching in a case where we ignore cv-qualifiers.
37     TDF_IgnoreQualifiers = 0x02,
38     /// \brief Within template argument deduction from a function call,
39     /// we are matching in a case where we can perform template argument
40     /// deduction from a template-id of a derived class of the argument type.
41     TDF_DerivedClass = 0x04
42   };
43 }
44 
45 using namespace clang;
46 
47 static Sema::TemplateDeductionResult
48 DeduceTemplateArguments(ASTContext &Context,
49                         TemplateParameterList *TemplateParams,
50                         const TemplateArgument &Param,
51                         const TemplateArgument &Arg,
52                         Sema::TemplateDeductionInfo &Info,
53                         llvm::SmallVectorImpl<TemplateArgument> &Deduced);
54 
55 /// \brief If the given expression is of a form that permits the deduction
56 /// of a non-type template parameter, return the declaration of that
57 /// non-type template parameter.
58 static NonTypeTemplateParmDecl *getDeducedParameterFromExpr(Expr *E) {
59   if (ImplicitCastExpr *IC = dyn_cast<ImplicitCastExpr>(E))
60     E = IC->getSubExpr();
61 
62   if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
63     return dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl());
64 
65   return 0;
66 }
67 
68 /// \brief Deduce the value of the given non-type template parameter
69 /// from the given constant.
70 static Sema::TemplateDeductionResult
71 DeduceNonTypeTemplateArgument(ASTContext &Context,
72                               NonTypeTemplateParmDecl *NTTP,
73                               llvm::APSInt Value,
74                               Sema::TemplateDeductionInfo &Info,
75                               llvm::SmallVectorImpl<TemplateArgument> &Deduced) {
76   assert(NTTP->getDepth() == 0 &&
77          "Cannot deduce non-type template argument with depth > 0");
78 
79   if (Deduced[NTTP->getIndex()].isNull()) {
80     QualType T = NTTP->getType();
81 
82     // FIXME: Make sure we didn't overflow our data type!
83     unsigned AllowedBits = Context.getTypeSize(T);
84     if (Value.getBitWidth() != AllowedBits)
85       Value.extOrTrunc(AllowedBits);
86     Value.setIsSigned(T->isSignedIntegerType());
87 
88     Deduced[NTTP->getIndex()] = TemplateArgument(SourceLocation(), Value, T);
89     return Sema::TDK_Success;
90   }
91 
92   assert(Deduced[NTTP->getIndex()].getKind() == TemplateArgument::Integral);
93 
94   // If the template argument was previously deduced to a negative value,
95   // then our deduction fails.
96   const llvm::APSInt *PrevValuePtr = Deduced[NTTP->getIndex()].getAsIntegral();
97   if (PrevValuePtr->isNegative()) {
98     Info.Param = NTTP;
99     Info.FirstArg = Deduced[NTTP->getIndex()];
100     Info.SecondArg = TemplateArgument(SourceLocation(), Value, NTTP->getType());
101     return Sema::TDK_Inconsistent;
102   }
103 
104   llvm::APSInt PrevValue = *PrevValuePtr;
105   if (Value.getBitWidth() > PrevValue.getBitWidth())
106     PrevValue.zext(Value.getBitWidth());
107   else if (Value.getBitWidth() < PrevValue.getBitWidth())
108     Value.zext(PrevValue.getBitWidth());
109 
110   if (Value != PrevValue) {
111     Info.Param = NTTP;
112     Info.FirstArg = Deduced[NTTP->getIndex()];
113     Info.SecondArg = TemplateArgument(SourceLocation(), Value, NTTP->getType());
114     return Sema::TDK_Inconsistent;
115   }
116 
117   return Sema::TDK_Success;
118 }
119 
120 /// \brief Deduce the value of the given non-type template parameter
121 /// from the given type- or value-dependent expression.
122 ///
123 /// \returns true if deduction succeeded, false otherwise.
124 
125 static Sema::TemplateDeductionResult
126 DeduceNonTypeTemplateArgument(ASTContext &Context,
127                               NonTypeTemplateParmDecl *NTTP,
128                               Expr *Value,
129                               Sema::TemplateDeductionInfo &Info,
130                            llvm::SmallVectorImpl<TemplateArgument> &Deduced) {
131   assert(NTTP->getDepth() == 0 &&
132          "Cannot deduce non-type template argument with depth > 0");
133   assert((Value->isTypeDependent() || Value->isValueDependent()) &&
134          "Expression template argument must be type- or value-dependent.");
135 
136   if (Deduced[NTTP->getIndex()].isNull()) {
137     // FIXME: Clone the Value?
138     Deduced[NTTP->getIndex()] = TemplateArgument(Value);
139     return Sema::TDK_Success;
140   }
141 
142   if (Deduced[NTTP->getIndex()].getKind() == TemplateArgument::Integral) {
143     // Okay, we deduced a constant in one case and a dependent expression
144     // in another case. FIXME: Later, we will check that instantiating the
145     // dependent expression gives us the constant value.
146     return Sema::TDK_Success;
147   }
148 
149   // FIXME: Compare the expressions for equality!
150   return Sema::TDK_Success;
151 }
152 
153 static Sema::TemplateDeductionResult
154 DeduceTemplateArguments(ASTContext &Context,
155                         TemplateName Param,
156                         TemplateName Arg,
157                         Sema::TemplateDeductionInfo &Info,
158                         llvm::SmallVectorImpl<TemplateArgument> &Deduced) {
159   // FIXME: Implement template argument deduction for template
160   // template parameters.
161 
162   // FIXME: this routine does not have enough information to produce
163   // good diagnostics.
164 
165   TemplateDecl *ParamDecl = Param.getAsTemplateDecl();
166   TemplateDecl *ArgDecl = Arg.getAsTemplateDecl();
167 
168   if (!ParamDecl || !ArgDecl) {
169     // FIXME: fill in Info.Param/Info.FirstArg
170     return Sema::TDK_Inconsistent;
171   }
172 
173   ParamDecl = cast<TemplateDecl>(Context.getCanonicalDecl(ParamDecl));
174   ArgDecl = cast<TemplateDecl>(Context.getCanonicalDecl(ArgDecl));
175   if (ParamDecl != ArgDecl) {
176     // FIXME: fill in Info.Param/Info.FirstArg
177     return Sema::TDK_Inconsistent;
178   }
179 
180   return Sema::TDK_Success;
181 }
182 
183 /// \brief Deduce the template arguments by comparing the parameter type and
184 /// the argument type (C++ [temp.deduct.type]).
185 ///
186 /// \param Context the AST context in which this deduction occurs.
187 ///
188 /// \param TemplateParams the template parameters that we are deducing
189 ///
190 /// \param ParamIn the parameter type
191 ///
192 /// \param ArgIn the argument type
193 ///
194 /// \param Info information about the template argument deduction itself
195 ///
196 /// \param Deduced the deduced template arguments
197 ///
198 /// \param TDF bitwise OR of the TemplateDeductionFlags bits that describe
199 /// how template argument deduction is performed.
200 ///
201 /// \returns the result of template argument deduction so far. Note that a
202 /// "success" result means that template argument deduction has not yet failed,
203 /// but it may still fail, later, for other reasons.
204 static Sema::TemplateDeductionResult
205 DeduceTemplateArguments(ASTContext &Context,
206                         TemplateParameterList *TemplateParams,
207                         QualType ParamIn, QualType ArgIn,
208                         Sema::TemplateDeductionInfo &Info,
209                         llvm::SmallVectorImpl<TemplateArgument> &Deduced,
210                         unsigned TDF) {
211   // We only want to look at the canonical types, since typedefs and
212   // sugar are not part of template argument deduction.
213   QualType Param = Context.getCanonicalType(ParamIn);
214   QualType Arg = Context.getCanonicalType(ArgIn);
215 
216   // C++0x [temp.deduct.call]p4 bullet 1:
217   //   - If the original P is a reference type, the deduced A (i.e., the type
218   //     referred to by the reference) can be more cv-qualified than the
219   //     transformed A.
220   if (TDF & TDF_ParamWithReferenceType) {
221     unsigned ExtraQualsOnParam
222       = Param.getCVRQualifiers() & ~Arg.getCVRQualifiers();
223     Param.setCVRQualifiers(Param.getCVRQualifiers() & ~ExtraQualsOnParam);
224   }
225 
226   // If the parameter type is not dependent, there is nothing to deduce.
227   if (!Param->isDependentType())
228     return Sema::TDK_Success;
229 
230   // C++ [temp.deduct.type]p9:
231   //   A template type argument T, a template template argument TT or a
232   //   template non-type argument i can be deduced if P and A have one of
233   //   the following forms:
234   //
235   //     T
236   //     cv-list T
237   if (const TemplateTypeParmType *TemplateTypeParm
238         = Param->getAsTemplateTypeParmType()) {
239     unsigned Index = TemplateTypeParm->getIndex();
240 
241     // The argument type can not be less qualified than the parameter
242     // type.
243     if (Param.isMoreQualifiedThan(Arg) && !(TDF & TDF_IgnoreQualifiers)) {
244       Info.Param = cast<TemplateTypeParmDecl>(TemplateParams->getParam(Index));
245       Info.FirstArg = Deduced[Index];
246       Info.SecondArg = TemplateArgument(SourceLocation(), Arg);
247       return Sema::TDK_InconsistentQuals;
248     }
249 
250     assert(TemplateTypeParm->getDepth() == 0 && "Can't deduce with depth > 0");
251 
252     unsigned Quals = Arg.getCVRQualifiers() & ~Param.getCVRQualifiers();
253     QualType DeducedType = Arg.getQualifiedType(Quals);
254 
255     if (Deduced[Index].isNull())
256       Deduced[Index] = TemplateArgument(SourceLocation(), DeducedType);
257     else {
258       // C++ [temp.deduct.type]p2:
259       //   [...] If type deduction cannot be done for any P/A pair, or if for
260       //   any pair the deduction leads to more than one possible set of
261       //   deduced values, or if different pairs yield different deduced
262       //   values, or if any template argument remains neither deduced nor
263       //   explicitly specified, template argument deduction fails.
264       if (Deduced[Index].getAsType() != DeducedType) {
265         Info.Param
266           = cast<TemplateTypeParmDecl>(TemplateParams->getParam(Index));
267         Info.FirstArg = Deduced[Index];
268         Info.SecondArg = TemplateArgument(SourceLocation(), Arg);
269         return Sema::TDK_Inconsistent;
270       }
271     }
272     return Sema::TDK_Success;
273   }
274 
275   // Set up the template argument deduction information for a failure.
276   Info.FirstArg = TemplateArgument(SourceLocation(), ParamIn);
277   Info.SecondArg = TemplateArgument(SourceLocation(), ArgIn);
278 
279   // Check the cv-qualifiers on the parameter and argument types.
280   if (!(TDF & TDF_IgnoreQualifiers)) {
281     if (TDF & TDF_ParamWithReferenceType) {
282       if (Param.isMoreQualifiedThan(Arg))
283         return Sema::TDK_NonDeducedMismatch;
284     } else {
285       if (Param.getCVRQualifiers() != Arg.getCVRQualifiers())
286         return Sema::TDK_NonDeducedMismatch;
287     }
288   }
289 
290   switch (Param->getTypeClass()) {
291     // No deduction possible for these types
292     case Type::Builtin:
293       return Sema::TDK_NonDeducedMismatch;
294 
295     //     T *
296     case Type::Pointer: {
297       const PointerType *PointerArg = Arg->getAsPointerType();
298       if (!PointerArg)
299         return Sema::TDK_NonDeducedMismatch;
300 
301       unsigned SubTDF = TDF & (TDF_IgnoreQualifiers | TDF_DerivedClass);
302       return DeduceTemplateArguments(Context, TemplateParams,
303                                    cast<PointerType>(Param)->getPointeeType(),
304                                      PointerArg->getPointeeType(),
305                                      Info, Deduced, SubTDF);
306     }
307 
308     //     T &
309     case Type::LValueReference: {
310       const LValueReferenceType *ReferenceArg = Arg->getAsLValueReferenceType();
311       if (!ReferenceArg)
312         return Sema::TDK_NonDeducedMismatch;
313 
314       return DeduceTemplateArguments(Context, TemplateParams,
315                            cast<LValueReferenceType>(Param)->getPointeeType(),
316                                      ReferenceArg->getPointeeType(),
317                                      Info, Deduced, 0);
318     }
319 
320     //     T && [C++0x]
321     case Type::RValueReference: {
322       const RValueReferenceType *ReferenceArg = Arg->getAsRValueReferenceType();
323       if (!ReferenceArg)
324         return Sema::TDK_NonDeducedMismatch;
325 
326       return DeduceTemplateArguments(Context, TemplateParams,
327                            cast<RValueReferenceType>(Param)->getPointeeType(),
328                                      ReferenceArg->getPointeeType(),
329                                      Info, Deduced, 0);
330     }
331 
332     //     T [] (implied, but not stated explicitly)
333     case Type::IncompleteArray: {
334       const IncompleteArrayType *IncompleteArrayArg =
335         Context.getAsIncompleteArrayType(Arg);
336       if (!IncompleteArrayArg)
337         return Sema::TDK_NonDeducedMismatch;
338 
339       return DeduceTemplateArguments(Context, TemplateParams,
340                      Context.getAsIncompleteArrayType(Param)->getElementType(),
341                                      IncompleteArrayArg->getElementType(),
342                                      Info, Deduced, 0);
343     }
344 
345     //     T [integer-constant]
346     case Type::ConstantArray: {
347       const ConstantArrayType *ConstantArrayArg =
348         Context.getAsConstantArrayType(Arg);
349       if (!ConstantArrayArg)
350         return Sema::TDK_NonDeducedMismatch;
351 
352       const ConstantArrayType *ConstantArrayParm =
353         Context.getAsConstantArrayType(Param);
354       if (ConstantArrayArg->getSize() != ConstantArrayParm->getSize())
355         return Sema::TDK_NonDeducedMismatch;
356 
357       return DeduceTemplateArguments(Context, TemplateParams,
358                                      ConstantArrayParm->getElementType(),
359                                      ConstantArrayArg->getElementType(),
360                                      Info, Deduced, 0);
361     }
362 
363     //     type [i]
364     case Type::DependentSizedArray: {
365       const ArrayType *ArrayArg = dyn_cast<ArrayType>(Arg);
366       if (!ArrayArg)
367         return Sema::TDK_NonDeducedMismatch;
368 
369       // Check the element type of the arrays
370       const DependentSizedArrayType *DependentArrayParm
371         = cast<DependentSizedArrayType>(Param);
372       if (Sema::TemplateDeductionResult Result
373             = DeduceTemplateArguments(Context, TemplateParams,
374                                       DependentArrayParm->getElementType(),
375                                       ArrayArg->getElementType(),
376                                       Info, Deduced, 0))
377         return Result;
378 
379       // Determine the array bound is something we can deduce.
380       NonTypeTemplateParmDecl *NTTP
381         = getDeducedParameterFromExpr(DependentArrayParm->getSizeExpr());
382       if (!NTTP)
383         return Sema::TDK_Success;
384 
385       // We can perform template argument deduction for the given non-type
386       // template parameter.
387       assert(NTTP->getDepth() == 0 &&
388              "Cannot deduce non-type template argument at depth > 0");
389       if (const ConstantArrayType *ConstantArrayArg
390             = dyn_cast<ConstantArrayType>(ArrayArg)) {
391         llvm::APSInt Size(ConstantArrayArg->getSize());
392         return DeduceNonTypeTemplateArgument(Context, NTTP, Size,
393                                              Info, Deduced);
394       }
395       if (const DependentSizedArrayType *DependentArrayArg
396             = dyn_cast<DependentSizedArrayType>(ArrayArg))
397         return DeduceNonTypeTemplateArgument(Context, NTTP,
398                                              DependentArrayArg->getSizeExpr(),
399                                              Info, Deduced);
400 
401       // Incomplete type does not match a dependently-sized array type
402       return Sema::TDK_NonDeducedMismatch;
403     }
404 
405     //     type(*)(T)
406     //     T(*)()
407     //     T(*)(T)
408     case Type::FunctionProto: {
409       const FunctionProtoType *FunctionProtoArg =
410         dyn_cast<FunctionProtoType>(Arg);
411       if (!FunctionProtoArg)
412         return Sema::TDK_NonDeducedMismatch;
413 
414       const FunctionProtoType *FunctionProtoParam =
415         cast<FunctionProtoType>(Param);
416 
417       if (FunctionProtoParam->getTypeQuals() !=
418           FunctionProtoArg->getTypeQuals())
419         return Sema::TDK_NonDeducedMismatch;
420 
421       if (FunctionProtoParam->getNumArgs() != FunctionProtoArg->getNumArgs())
422         return Sema::TDK_NonDeducedMismatch;
423 
424       if (FunctionProtoParam->isVariadic() != FunctionProtoArg->isVariadic())
425         return Sema::TDK_NonDeducedMismatch;
426 
427       // Check return types.
428       if (Sema::TemplateDeductionResult Result
429             = DeduceTemplateArguments(Context, TemplateParams,
430                                       FunctionProtoParam->getResultType(),
431                                       FunctionProtoArg->getResultType(),
432                                       Info, Deduced, 0))
433         return Result;
434 
435       for (unsigned I = 0, N = FunctionProtoParam->getNumArgs(); I != N; ++I) {
436         // Check argument types.
437         if (Sema::TemplateDeductionResult Result
438               = DeduceTemplateArguments(Context, TemplateParams,
439                                         FunctionProtoParam->getArgType(I),
440                                         FunctionProtoArg->getArgType(I),
441                                         Info, Deduced, 0))
442           return Result;
443       }
444 
445       return Sema::TDK_Success;
446     }
447 
448     //     template-name<T> (where template-name refers to a class template)
449     //     template-name<i>
450     //     TT<T> (TODO)
451     //     TT<i> (TODO)
452     //     TT<> (TODO)
453     case Type::TemplateSpecialization: {
454       const TemplateSpecializationType *SpecParam
455         = cast<TemplateSpecializationType>(Param);
456 
457       // Check whether the template argument is a dependent template-id.
458       // FIXME: This is untested code; it can be tested when we implement
459       // partial ordering of class template partial specializations.
460       if (const TemplateSpecializationType *SpecArg
461             = dyn_cast<TemplateSpecializationType>(Arg)) {
462         // Perform template argument deduction for the template name.
463         if (Sema::TemplateDeductionResult Result
464               = DeduceTemplateArguments(Context,
465                                         SpecParam->getTemplateName(),
466                                         SpecArg->getTemplateName(),
467                                         Info, Deduced))
468           return Result;
469 
470         unsigned NumArgs = SpecParam->getNumArgs();
471 
472         // FIXME: When one of the template-names refers to a
473         // declaration with default template arguments, do we need to
474         // fill in those default template arguments here? Most likely,
475         // the answer is "yes", but I don't see any references. This
476         // issue may be resolved elsewhere, because we may want to
477         // instantiate default template arguments when
478         if (SpecArg->getNumArgs() != NumArgs)
479           return Sema::TDK_NonDeducedMismatch;
480 
481         // Perform template argument deduction on each template
482         // argument.
483         for (unsigned I = 0; I != NumArgs; ++I)
484           if (Sema::TemplateDeductionResult Result
485                 = DeduceTemplateArguments(Context, TemplateParams,
486                                           SpecParam->getArg(I),
487                                           SpecArg->getArg(I),
488                                           Info, Deduced))
489             return Result;
490 
491         return Sema::TDK_Success;
492       }
493 
494       // If the argument type is a class template specialization, we
495       // perform template argument deduction using its template
496       // arguments.
497       const RecordType *RecordArg = dyn_cast<RecordType>(Arg);
498       if (!RecordArg)
499         return Sema::TDK_NonDeducedMismatch;
500 
501       // FIXME: Check TDF_DerivedClass here. When this flag is set, we need
502       // to troll through the base classes of the argument and try matching
503       // all of them. Failure to match does not mean that there is a problem,
504       // of course.
505 
506       ClassTemplateSpecializationDecl *SpecArg
507         = dyn_cast<ClassTemplateSpecializationDecl>(RecordArg->getDecl());
508       if (!SpecArg)
509         return Sema::TDK_NonDeducedMismatch;
510 
511       // Perform template argument deduction for the template name.
512       if (Sema::TemplateDeductionResult Result
513             = DeduceTemplateArguments(Context,
514                                       SpecParam->getTemplateName(),
515                               TemplateName(SpecArg->getSpecializedTemplate()),
516                                       Info, Deduced))
517           return Result;
518 
519       // FIXME: Can the # of arguments in the parameter and the argument differ?
520       unsigned NumArgs = SpecParam->getNumArgs();
521       const TemplateArgumentList &ArgArgs = SpecArg->getTemplateArgs();
522       if (NumArgs != ArgArgs.size())
523         return Sema::TDK_NonDeducedMismatch;
524 
525       for (unsigned I = 0; I != NumArgs; ++I)
526         if (Sema::TemplateDeductionResult Result
527               = DeduceTemplateArguments(Context, TemplateParams,
528                                         SpecParam->getArg(I),
529                                         ArgArgs.get(I),
530                                         Info, Deduced))
531           return Result;
532 
533       return Sema::TDK_Success;
534     }
535 
536     //     T type::*
537     //     T T::*
538     //     T (type::*)()
539     //     type (T::*)()
540     //     type (type::*)(T)
541     //     type (T::*)(T)
542     //     T (type::*)(T)
543     //     T (T::*)()
544     //     T (T::*)(T)
545     case Type::MemberPointer: {
546       const MemberPointerType *MemPtrParam = cast<MemberPointerType>(Param);
547       const MemberPointerType *MemPtrArg = dyn_cast<MemberPointerType>(Arg);
548       if (!MemPtrArg)
549         return Sema::TDK_NonDeducedMismatch;
550 
551       if (Sema::TemplateDeductionResult Result
552             = DeduceTemplateArguments(Context, TemplateParams,
553                                       MemPtrParam->getPointeeType(),
554                                       MemPtrArg->getPointeeType(),
555                                       Info, Deduced,
556                                       TDF & TDF_IgnoreQualifiers))
557         return Result;
558 
559       return DeduceTemplateArguments(Context, TemplateParams,
560                                      QualType(MemPtrParam->getClass(), 0),
561                                      QualType(MemPtrArg->getClass(), 0),
562                                      Info, Deduced, 0);
563     }
564 
565     //     (clang extension)
566     //
567     //     type(^)(T)
568     //     T(^)()
569     //     T(^)(T)
570     case Type::BlockPointer: {
571       const BlockPointerType *BlockPtrParam = cast<BlockPointerType>(Param);
572       const BlockPointerType *BlockPtrArg = dyn_cast<BlockPointerType>(Arg);
573 
574       if (!BlockPtrArg)
575         return Sema::TDK_NonDeducedMismatch;
576 
577       return DeduceTemplateArguments(Context, TemplateParams,
578                                      BlockPtrParam->getPointeeType(),
579                                      BlockPtrArg->getPointeeType(), Info,
580                                      Deduced, 0);
581     }
582 
583     case Type::TypeOfExpr:
584     case Type::TypeOf:
585     case Type::Typename:
586       // No template argument deduction for these types
587       return Sema::TDK_Success;
588 
589     default:
590       break;
591   }
592 
593   // FIXME: Many more cases to go (to go).
594   return Sema::TDK_Success;
595 }
596 
597 static Sema::TemplateDeductionResult
598 DeduceTemplateArguments(ASTContext &Context,
599                         TemplateParameterList *TemplateParams,
600                         const TemplateArgument &Param,
601                         const TemplateArgument &Arg,
602                         Sema::TemplateDeductionInfo &Info,
603                         llvm::SmallVectorImpl<TemplateArgument> &Deduced) {
604   switch (Param.getKind()) {
605   case TemplateArgument::Null:
606     assert(false && "Null template argument in parameter list");
607     break;
608 
609   case TemplateArgument::Type:
610     assert(Arg.getKind() == TemplateArgument::Type && "Type/value mismatch");
611     return DeduceTemplateArguments(Context, TemplateParams, Param.getAsType(),
612                                    Arg.getAsType(), Info, Deduced, 0);
613 
614   case TemplateArgument::Declaration:
615     // FIXME: Implement this check
616     assert(false && "Unimplemented template argument deduction case");
617     Info.FirstArg = Param;
618     Info.SecondArg = Arg;
619     return Sema::TDK_NonDeducedMismatch;
620 
621   case TemplateArgument::Integral:
622     if (Arg.getKind() == TemplateArgument::Integral) {
623       // FIXME: Zero extension + sign checking here?
624       if (*Param.getAsIntegral() == *Arg.getAsIntegral())
625         return Sema::TDK_Success;
626 
627       Info.FirstArg = Param;
628       Info.SecondArg = Arg;
629       return Sema::TDK_NonDeducedMismatch;
630     }
631 
632     if (Arg.getKind() == TemplateArgument::Expression) {
633       Info.FirstArg = Param;
634       Info.SecondArg = Arg;
635       return Sema::TDK_NonDeducedMismatch;
636     }
637 
638     assert(false && "Type/value mismatch");
639     Info.FirstArg = Param;
640     Info.SecondArg = Arg;
641     return Sema::TDK_NonDeducedMismatch;
642 
643   case TemplateArgument::Expression: {
644     if (NonTypeTemplateParmDecl *NTTP
645           = getDeducedParameterFromExpr(Param.getAsExpr())) {
646       if (Arg.getKind() == TemplateArgument::Integral)
647         // FIXME: Sign problems here
648         return DeduceNonTypeTemplateArgument(Context, NTTP,
649                                              *Arg.getAsIntegral(),
650                                              Info, Deduced);
651       if (Arg.getKind() == TemplateArgument::Expression)
652         return DeduceNonTypeTemplateArgument(Context, NTTP, Arg.getAsExpr(),
653                                              Info, Deduced);
654 
655       assert(false && "Type/value mismatch");
656       Info.FirstArg = Param;
657       Info.SecondArg = Arg;
658       return Sema::TDK_NonDeducedMismatch;
659     }
660 
661     // Can't deduce anything, but that's okay.
662     return Sema::TDK_Success;
663   }
664   case TemplateArgument::Pack:
665     assert(0 && "FIXME: Implement!");
666     break;
667   }
668 
669   return Sema::TDK_Success;
670 }
671 
672 static Sema::TemplateDeductionResult
673 DeduceTemplateArguments(ASTContext &Context,
674                         TemplateParameterList *TemplateParams,
675                         const TemplateArgumentList &ParamList,
676                         const TemplateArgumentList &ArgList,
677                         Sema::TemplateDeductionInfo &Info,
678                         llvm::SmallVectorImpl<TemplateArgument> &Deduced) {
679   assert(ParamList.size() == ArgList.size());
680   for (unsigned I = 0, N = ParamList.size(); I != N; ++I) {
681     if (Sema::TemplateDeductionResult Result
682           = DeduceTemplateArguments(Context, TemplateParams,
683                                     ParamList[I], ArgList[I],
684                                     Info, Deduced))
685       return Result;
686   }
687   return Sema::TDK_Success;
688 }
689 
690 /// \brief Determine whether two template arguments are the same.
691 static bool isSameTemplateArg(ASTContext &Context,
692                               const TemplateArgument &X,
693                               const TemplateArgument &Y) {
694   if (X.getKind() != Y.getKind())
695     return false;
696 
697   switch (X.getKind()) {
698     case TemplateArgument::Null:
699       assert(false && "Comparing NULL template argument");
700       break;
701 
702     case TemplateArgument::Type:
703       return Context.getCanonicalType(X.getAsType()) ==
704              Context.getCanonicalType(Y.getAsType());
705 
706     case TemplateArgument::Declaration:
707       return Context.getCanonicalDecl(X.getAsDecl()) ==
708              Context.getCanonicalDecl(Y.getAsDecl());
709 
710     case TemplateArgument::Integral:
711       return *X.getAsIntegral() == *Y.getAsIntegral();
712 
713     case TemplateArgument::Expression:
714       // FIXME: We assume that all expressions are distinct, but we should
715       // really check their canonical forms.
716       return false;
717 
718     case TemplateArgument::Pack:
719       if (X.pack_size() != Y.pack_size())
720         return false;
721 
722       for (TemplateArgument::pack_iterator XP = X.pack_begin(),
723                                         XPEnd = X.pack_end(),
724                                            YP = Y.pack_begin();
725            XP != XPEnd; ++XP, ++YP)
726         if (!isSameTemplateArg(Context, *XP, *YP))
727           return false;
728 
729       return true;
730   }
731 
732   return false;
733 }
734 
735 /// \brief Helper function to build a TemplateParameter when we don't
736 /// know its type statically.
737 static TemplateParameter makeTemplateParameter(Decl *D) {
738   if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(D))
739     return TemplateParameter(TTP);
740   else if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D))
741     return TemplateParameter(NTTP);
742 
743   return TemplateParameter(cast<TemplateTemplateParmDecl>(D));
744 }
745 
746 /// \brief Perform template argument deduction to determine whether
747 /// the given template arguments match the given class template
748 /// partial specialization per C++ [temp.class.spec.match].
749 Sema::TemplateDeductionResult
750 Sema::DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial,
751                               const TemplateArgumentList &TemplateArgs,
752                               TemplateDeductionInfo &Info) {
753   // C++ [temp.class.spec.match]p2:
754   //   A partial specialization matches a given actual template
755   //   argument list if the template arguments of the partial
756   //   specialization can be deduced from the actual template argument
757   //   list (14.8.2).
758   SFINAETrap Trap(*this);
759   llvm::SmallVector<TemplateArgument, 4> Deduced;
760   Deduced.resize(Partial->getTemplateParameters()->size());
761   if (TemplateDeductionResult Result
762         = ::DeduceTemplateArguments(Context,
763                                     Partial->getTemplateParameters(),
764                                     Partial->getTemplateArgs(),
765                                     TemplateArgs, Info, Deduced))
766     return Result;
767 
768   InstantiatingTemplate Inst(*this, Partial->getLocation(), Partial,
769                              Deduced.data(), Deduced.size());
770   if (Inst)
771     return TDK_InstantiationDepth;
772 
773   // C++ [temp.deduct.type]p2:
774   //   [...] or if any template argument remains neither deduced nor
775   //   explicitly specified, template argument deduction fails.
776   TemplateArgumentListBuilder Builder(Partial->getTemplateParameters(),
777                                       Deduced.size());
778   for (unsigned I = 0, N = Deduced.size(); I != N; ++I) {
779     if (Deduced[I].isNull()) {
780       Decl *Param
781         = const_cast<Decl *>(Partial->getTemplateParameters()->getParam(I));
782       if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
783         Info.Param = TTP;
784       else if (NonTypeTemplateParmDecl *NTTP
785                  = dyn_cast<NonTypeTemplateParmDecl>(Param))
786         Info.Param = NTTP;
787       else
788         Info.Param = cast<TemplateTemplateParmDecl>(Param);
789       return TDK_Incomplete;
790     }
791 
792     Builder.Append(Deduced[I]);
793   }
794 
795   // Form the template argument list from the deduced template arguments.
796   TemplateArgumentList *DeducedArgumentList
797     = new (Context) TemplateArgumentList(Context, Builder, /*TakeArgs=*/true);
798   Info.reset(DeducedArgumentList);
799 
800   // Substitute the deduced template arguments into the template
801   // arguments of the class template partial specialization, and
802   // verify that the instantiated template arguments are both valid
803   // and are equivalent to the template arguments originally provided
804   // to the class template.
805   ClassTemplateDecl *ClassTemplate = Partial->getSpecializedTemplate();
806   const TemplateArgumentList &PartialTemplateArgs = Partial->getTemplateArgs();
807   for (unsigned I = 0, N = PartialTemplateArgs.flat_size(); I != N; ++I) {
808     Decl *Param = const_cast<Decl *>(
809                     ClassTemplate->getTemplateParameters()->getParam(I));
810     TemplateArgument InstArg = Instantiate(PartialTemplateArgs[I],
811                                            *DeducedArgumentList);
812     if (InstArg.isNull()) {
813       Info.Param = makeTemplateParameter(Param);
814       Info.FirstArg = PartialTemplateArgs[I];
815       return TDK_SubstitutionFailure;
816     }
817 
818     if (InstArg.getKind() == TemplateArgument::Expression) {
819       // When the argument is an expression, check the expression result
820       // against the actual template parameter to get down to the canonical
821       // template argument.
822       Expr *InstExpr = InstArg.getAsExpr();
823       if (NonTypeTemplateParmDecl *NTTP
824             = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
825         if (CheckTemplateArgument(NTTP, NTTP->getType(), InstExpr, InstArg)) {
826           Info.Param = makeTemplateParameter(Param);
827           Info.FirstArg = PartialTemplateArgs[I];
828           return TDK_SubstitutionFailure;
829         }
830       } else if (TemplateTemplateParmDecl *TTP
831                    = dyn_cast<TemplateTemplateParmDecl>(Param)) {
832         // FIXME: template template arguments should really resolve to decls
833         DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(InstExpr);
834         if (!DRE || CheckTemplateArgument(TTP, DRE)) {
835           Info.Param = makeTemplateParameter(Param);
836           Info.FirstArg = PartialTemplateArgs[I];
837           return TDK_SubstitutionFailure;
838         }
839       }
840     }
841 
842     if (!isSameTemplateArg(Context, TemplateArgs[I], InstArg)) {
843       Info.Param = makeTemplateParameter(Param);
844       Info.FirstArg = TemplateArgs[I];
845       Info.SecondArg = InstArg;
846       return TDK_NonDeducedMismatch;
847     }
848   }
849 
850   if (Trap.hasErrorOccurred())
851     return TDK_SubstitutionFailure;
852 
853   return TDK_Success;
854 }
855 
856 /// \brief Determine whether the given type T is a simple-template-id type.
857 static bool isSimpleTemplateIdType(QualType T) {
858   if (const TemplateSpecializationType *Spec
859         = T->getAsTemplateSpecializationType())
860     return Spec->getTemplateName().getAsTemplateDecl() != 0;
861 
862   return false;
863 }
864 
865 /// \brief Perform template argument deduction from a function call
866 /// (C++ [temp.deduct.call]).
867 ///
868 /// \param FunctionTemplate the function template for which we are performing
869 /// template argument deduction.
870 ///
871 /// \param HasExplicitTemplateArgs whether any template arguments were
872 /// explicitly specified.
873 ///
874 /// \param ExplicitTemplateArguments when @p HasExplicitTemplateArgs is true,
875 /// the explicitly-specified template arguments.
876 ///
877 /// \param NumExplicitTemplateArguments when @p HasExplicitTemplateArgs is true,
878 /// the number of explicitly-specified template arguments in
879 /// @p ExplicitTemplateArguments. This value may be zero.
880 ///
881 /// \param Args the function call arguments
882 ///
883 /// \param NumArgs the number of arguments in Args
884 ///
885 /// \param Specialization if template argument deduction was successful,
886 /// this will be set to the function template specialization produced by
887 /// template argument deduction.
888 ///
889 /// \param Info the argument will be updated to provide additional information
890 /// about template argument deduction.
891 ///
892 /// \returns the result of template argument deduction.
893 Sema::TemplateDeductionResult
894 Sema::DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,
895                               bool HasExplicitTemplateArgs,
896                               const TemplateArgument *ExplicitTemplateArgs,
897                               unsigned NumExplicitTemplateArgs,
898                               Expr **Args, unsigned NumArgs,
899                               FunctionDecl *&Specialization,
900                               TemplateDeductionInfo &Info) {
901   FunctionDecl *Function = FunctionTemplate->getTemplatedDecl();
902 
903   // C++ [temp.deduct.call]p1:
904   //   Template argument deduction is done by comparing each function template
905   //   parameter type (call it P) with the type of the corresponding argument
906   //   of the call (call it A) as described below.
907   unsigned CheckArgs = NumArgs;
908   if (NumArgs < Function->getMinRequiredArguments())
909     return TDK_TooFewArguments;
910   else if (NumArgs > Function->getNumParams()) {
911     const FunctionProtoType *Proto
912       = Function->getType()->getAsFunctionProtoType();
913     if (!Proto->isVariadic())
914       return TDK_TooManyArguments;
915 
916     CheckArgs = Function->getNumParams();
917   }
918 
919   // Template argument deduction for function templates in a SFINAE context.
920   // Trap any errors that might occur.
921   SFINAETrap Trap(*this);
922 
923   // The types of the parameters from which we will perform template argument
924   // deduction.
925   TemplateParameterList *TemplateParams
926     = FunctionTemplate->getTemplateParameters();
927   llvm::SmallVector<TemplateArgument, 4> Deduced;
928   llvm::SmallVector<QualType, 4> ParamTypes;
929   if (NumExplicitTemplateArgs) {
930     // C++ [temp.arg.explicit]p3:
931     //   Template arguments that are present shall be specified in the
932     //   declaration order of their corresponding template-parameters. The
933     //   template argument list shall not specify more template-arguments than
934     //   there are corresponding template-parameters.
935     TemplateArgumentListBuilder Builder(TemplateParams,
936                                         NumExplicitTemplateArgs);
937 
938     // Enter a new template instantiation context where we check the
939     // explicitly-specified template arguments against this function template,
940     // and then substitute them into the function parameter types.
941     InstantiatingTemplate Inst(*this, FunctionTemplate->getLocation(),
942                                FunctionTemplate, Deduced.data(), Deduced.size());
943     if (Inst)
944       return TDK_InstantiationDepth;
945 
946     if (CheckTemplateArgumentList(FunctionTemplate,
947                                   SourceLocation(), SourceLocation(),
948                                   ExplicitTemplateArgs,
949                                   NumExplicitTemplateArgs,
950                                   SourceLocation(),
951                                   true,
952                                   Builder) || Trap.hasErrorOccurred())
953       return TDK_InvalidExplicitArguments;
954 
955     // Form the template argument list from the explicitly-specified
956     // template arguments.
957     TemplateArgumentList *ExplicitArgumentList
958       = new (Context) TemplateArgumentList(Context, Builder, /*TakeArgs=*/true);
959     Info.reset(ExplicitArgumentList);
960 
961     // Instantiate the types of each of the function parameters given the
962     // explicitly-specified template arguments.
963     for (FunctionDecl::param_iterator P = Function->param_begin(),
964                                    PEnd = Function->param_end();
965          P != PEnd;
966          ++P) {
967       QualType ParamType = InstantiateType((*P)->getType(),
968                                            *ExplicitArgumentList,
969                                            (*P)->getLocation(),
970                                            (*P)->getDeclName());
971       if (ParamType.isNull() || Trap.hasErrorOccurred())
972         return TDK_SubstitutionFailure;
973 
974       ParamTypes.push_back(ParamType);
975     }
976 
977     // C++ [temp.arg.explicit]p2:
978     //   Trailing template arguments that can be deduced (14.8.2) may be
979     //   omitted from the list of explicit template- arguments. If all of the
980     //   template arguments can be deduced, they may all be omitted; in this
981     //   case, the empty template argument list <> itself may also be omitted.
982     //
983     // Take all of the explicitly-specified arguments and put them into the
984     // set of deduced template arguments.
985     Deduced.reserve(TemplateParams->size());
986     for (unsigned I = 0, N = ExplicitArgumentList->size(); I != N; ++I)
987       Deduced.push_back(ExplicitArgumentList->get(I));
988   } else {
989     // Just fill in the parameter types from the function declaration.
990     for (unsigned I = 0; I != CheckArgs; ++I)
991       ParamTypes.push_back(Function->getParamDecl(I)->getType());
992   }
993 
994   // Deduce template arguments from the function parameters.
995   Deduced.resize(TemplateParams->size());
996   for (unsigned I = 0; I != CheckArgs; ++I) {
997     QualType ParamType = ParamTypes[I];
998     QualType ArgType = Args[I]->getType();
999 
1000     // C++ [temp.deduct.call]p2:
1001     //   If P is not a reference type:
1002     QualType CanonParamType = Context.getCanonicalType(ParamType);
1003     bool ParamWasReference = isa<ReferenceType>(CanonParamType);
1004     if (!ParamWasReference) {
1005       //   - If A is an array type, the pointer type produced by the
1006       //     array-to-pointer standard conversion (4.2) is used in place of
1007       //     A for type deduction; otherwise,
1008       if (ArgType->isArrayType())
1009         ArgType = Context.getArrayDecayedType(ArgType);
1010       //   - If A is a function type, the pointer type produced by the
1011       //     function-to-pointer standard conversion (4.3) is used in place
1012       //     of A for type deduction; otherwise,
1013       else if (ArgType->isFunctionType())
1014         ArgType = Context.getPointerType(ArgType);
1015       else {
1016         // - If A is a cv-qualified type, the top level cv-qualifiers of A’s
1017         //   type are ignored for type deduction.
1018         QualType CanonArgType = Context.getCanonicalType(ArgType);
1019         if (CanonArgType.getCVRQualifiers())
1020           ArgType = CanonArgType.getUnqualifiedType();
1021       }
1022     }
1023 
1024     // C++0x [temp.deduct.call]p3:
1025     //   If P is a cv-qualified type, the top level cv-qualifiers of P’s type
1026     //   are ignored for type deduction.
1027     if (CanonParamType.getCVRQualifiers())
1028       ParamType = CanonParamType.getUnqualifiedType();
1029     if (const ReferenceType *ParamRefType = ParamType->getAsReferenceType()) {
1030       //   [...] If P is a reference type, the type referred to by P is used
1031       //   for type deduction.
1032       ParamType = ParamRefType->getPointeeType();
1033 
1034       //   [...] If P is of the form T&&, where T is a template parameter, and
1035       //   the argument is an lvalue, the type A& is used in place of A for
1036       //   type deduction.
1037       if (isa<RValueReferenceType>(ParamRefType) &&
1038           ParamRefType->getAsTemplateTypeParmType() &&
1039           Args[I]->isLvalue(Context) == Expr::LV_Valid)
1040         ArgType = Context.getLValueReferenceType(ArgType);
1041     }
1042 
1043     // C++0x [temp.deduct.call]p4:
1044     //   In general, the deduction process attempts to find template argument
1045     //   values that will make the deduced A identical to A (after the type A
1046     //   is transformed as described above). [...]
1047     unsigned TDF = 0;
1048 
1049     //     - If the original P is a reference type, the deduced A (i.e., the
1050     //       type referred to by the reference) can be more cv-qualified than
1051     //       the transformed A.
1052     if (ParamWasReference)
1053       TDF |= TDF_ParamWithReferenceType;
1054     //     - The transformed A can be another pointer or pointer to member
1055     //       type that can be converted to the deduced A via a qualification
1056     //       conversion (4.4).
1057     if (ArgType->isPointerType() || ArgType->isMemberPointerType())
1058       TDF |= TDF_IgnoreQualifiers;
1059     //     - If P is a class and P has the form simple-template-id, then the
1060     //       transformed A can be a derived class of the deduced A. Likewise,
1061     //       if P is a pointer to a class of the form simple-template-id, the
1062     //       transformed A can be a pointer to a derived class pointed to by
1063     //       the deduced A.
1064     if (isSimpleTemplateIdType(ParamType) ||
1065         (isa<PointerType>(ParamType) &&
1066          isSimpleTemplateIdType(
1067                               ParamType->getAsPointerType()->getPointeeType())))
1068       TDF |= TDF_DerivedClass;
1069 
1070     if (TemplateDeductionResult Result
1071         = ::DeduceTemplateArguments(Context, TemplateParams,
1072                                     ParamType, ArgType, Info, Deduced,
1073                                     TDF))
1074       return Result;
1075 
1076     // FIXME: C++ [temp.deduct.call] paragraphs 6-9 deal with function
1077     // pointer parameters.
1078   }
1079 
1080   // C++ [temp.deduct.type]p2:
1081   //   [...] or if any template argument remains neither deduced nor
1082   //   explicitly specified, template argument deduction fails.
1083   TemplateArgumentListBuilder Builder(TemplateParams, Deduced.size());
1084   for (unsigned I = 0, N = Deduced.size(); I != N; ++I) {
1085     if (Deduced[I].isNull()) {
1086       Decl *Param
1087       = const_cast<Decl *>(TemplateParams->getParam(I));
1088       if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
1089         Info.Param = TTP;
1090       else if (NonTypeTemplateParmDecl *NTTP
1091                = dyn_cast<NonTypeTemplateParmDecl>(Param))
1092         Info.Param = NTTP;
1093       else
1094         Info.Param = cast<TemplateTemplateParmDecl>(Param);
1095       return TDK_Incomplete;
1096     }
1097 
1098     Builder.Append(Deduced[I]);
1099   }
1100 
1101   // Form the template argument list from the deduced template arguments.
1102   TemplateArgumentList *DeducedArgumentList
1103     = new (Context) TemplateArgumentList(Context, Builder, /*TakeArgs=*/true);
1104   Info.reset(DeducedArgumentList);
1105 
1106   // Enter a new template instantiation context while we instantiate the
1107   // actual function declaration.
1108   InstantiatingTemplate Inst(*this, FunctionTemplate->getLocation(),
1109                              FunctionTemplate, Deduced.data(), Deduced.size());
1110   if (Inst)
1111     return TDK_InstantiationDepth;
1112 
1113   // Substitute the deduced template arguments into the function template
1114   // declaration to produce the function template specialization.
1115   Specialization = cast_or_null<FunctionDecl>(
1116                          InstantiateDecl(FunctionTemplate->getTemplatedDecl(),
1117                                          FunctionTemplate->getDeclContext(),
1118                                          *DeducedArgumentList));
1119   if (!Specialization)
1120     return TDK_SubstitutionFailure;
1121 
1122   // If the template argument list is owned by the function template
1123   // specialization, release it.
1124   if (Specialization->getTemplateSpecializationArgs() == DeducedArgumentList)
1125     Info.take();
1126 
1127   // There may have been an error that did not prevent us from constructing a
1128   // declaration. Mark the declaration invalid and return with a substitution
1129   // failure.
1130   if (Trap.hasErrorOccurred()) {
1131     Specialization->setInvalidDecl(true);
1132     return TDK_SubstitutionFailure;
1133   }
1134 
1135   return TDK_Success;
1136 }
1137 
1138 static void
1139 MarkDeducedTemplateParameters(Sema &SemaRef,
1140                               const TemplateArgument &TemplateArg,
1141                               llvm::SmallVectorImpl<bool> &Deduced);
1142 
1143 /// \brief Mark the template arguments that are deduced by the given
1144 /// expression.
1145 static void
1146 MarkDeducedTemplateParameters(const Expr *E,
1147                               llvm::SmallVectorImpl<bool> &Deduced) {
1148   const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E);
1149   if (!E)
1150     return;
1151 
1152   const NonTypeTemplateParmDecl *NTTP
1153     = dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl());
1154   if (!NTTP)
1155     return;
1156 
1157   Deduced[NTTP->getIndex()] = true;
1158 }
1159 
1160 /// \brief Mark the template parameters that are deduced by the given
1161 /// type.
1162 static void
1163 MarkDeducedTemplateParameters(Sema &SemaRef, QualType T,
1164                               llvm::SmallVectorImpl<bool> &Deduced) {
1165   // Non-dependent types have nothing deducible
1166   if (!T->isDependentType())
1167     return;
1168 
1169   T = SemaRef.Context.getCanonicalType(T);
1170   switch (T->getTypeClass()) {
1171   case Type::ExtQual:
1172     MarkDeducedTemplateParameters(SemaRef,
1173                               QualType(cast<ExtQualType>(T)->getBaseType(), 0),
1174                                   Deduced);
1175     break;
1176 
1177   case Type::Pointer:
1178     MarkDeducedTemplateParameters(SemaRef,
1179                                   cast<PointerType>(T)->getPointeeType(),
1180                                   Deduced);
1181     break;
1182 
1183   case Type::BlockPointer:
1184     MarkDeducedTemplateParameters(SemaRef,
1185                                   cast<BlockPointerType>(T)->getPointeeType(),
1186                                   Deduced);
1187     break;
1188 
1189   case Type::LValueReference:
1190   case Type::RValueReference:
1191     MarkDeducedTemplateParameters(SemaRef,
1192                                   cast<ReferenceType>(T)->getPointeeType(),
1193                                   Deduced);
1194     break;
1195 
1196   case Type::MemberPointer: {
1197     const MemberPointerType *MemPtr = cast<MemberPointerType>(T.getTypePtr());
1198     MarkDeducedTemplateParameters(SemaRef, MemPtr->getPointeeType(), Deduced);
1199     MarkDeducedTemplateParameters(SemaRef, QualType(MemPtr->getClass(), 0),
1200                                   Deduced);
1201     break;
1202   }
1203 
1204   case Type::DependentSizedArray:
1205     MarkDeducedTemplateParameters(cast<DependentSizedArrayType>(T)->getSizeExpr(),
1206                                   Deduced);
1207     // Fall through to check the element type
1208 
1209   case Type::ConstantArray:
1210   case Type::IncompleteArray:
1211     MarkDeducedTemplateParameters(SemaRef,
1212                                   cast<ArrayType>(T)->getElementType(),
1213                                   Deduced);
1214     break;
1215 
1216   case Type::Vector:
1217   case Type::ExtVector:
1218     MarkDeducedTemplateParameters(SemaRef,
1219                                   cast<VectorType>(T)->getElementType(),
1220                                   Deduced);
1221     break;
1222 
1223   case Type::DependentSizedExtVector: {
1224     const DependentSizedExtVectorType *VecType
1225       = cast<DependentSizedExtVectorType>(T);
1226     MarkDeducedTemplateParameters(SemaRef, VecType->getElementType(), Deduced);
1227     MarkDeducedTemplateParameters(VecType->getSizeExpr(), Deduced);
1228     break;
1229   }
1230 
1231   case Type::FunctionProto: {
1232     const FunctionProtoType *Proto = cast<FunctionProtoType>(T);
1233     MarkDeducedTemplateParameters(SemaRef, Proto->getResultType(), Deduced);
1234     for (unsigned I = 0, N = Proto->getNumArgs(); I != N; ++I)
1235       MarkDeducedTemplateParameters(SemaRef, Proto->getArgType(I), Deduced);
1236     break;
1237   }
1238 
1239   case Type::TemplateTypeParm:
1240     Deduced[cast<TemplateTypeParmType>(T)->getIndex()] = true;
1241     break;
1242 
1243   case Type::TemplateSpecialization: {
1244     const TemplateSpecializationType *Spec
1245       = cast<TemplateSpecializationType>(T);
1246     if (TemplateDecl *Template = Spec->getTemplateName().getAsTemplateDecl())
1247       if (TemplateTemplateParmDecl *TTP
1248             = dyn_cast<TemplateTemplateParmDecl>(Template))
1249         Deduced[TTP->getIndex()] = true;
1250 
1251       for (unsigned I = 0, N = Spec->getNumArgs(); I != N; ++I)
1252         MarkDeducedTemplateParameters(SemaRef, Spec->getArg(I), Deduced);
1253 
1254     break;
1255   }
1256 
1257   // None of these types have any deducible parts.
1258   case Type::Builtin:
1259   case Type::FixedWidthInt:
1260   case Type::Complex:
1261   case Type::VariableArray:
1262   case Type::FunctionNoProto:
1263   case Type::Record:
1264   case Type::Enum:
1265   case Type::Typename:
1266   case Type::ObjCInterface:
1267   case Type::ObjCQualifiedInterface:
1268   case Type::ObjCObjectPointer:
1269 #define TYPE(Class, Base)
1270 #define ABSTRACT_TYPE(Class, Base)
1271 #define DEPENDENT_TYPE(Class, Base)
1272 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
1273 #include "clang/AST/TypeNodes.def"
1274     break;
1275   }
1276 }
1277 
1278 /// \brief Mark the template parameters that are deduced by this
1279 /// template argument.
1280 static void
1281 MarkDeducedTemplateParameters(Sema &SemaRef,
1282                               const TemplateArgument &TemplateArg,
1283                               llvm::SmallVectorImpl<bool> &Deduced) {
1284   switch (TemplateArg.getKind()) {
1285   case TemplateArgument::Null:
1286   case TemplateArgument::Integral:
1287     break;
1288 
1289   case TemplateArgument::Type:
1290     MarkDeducedTemplateParameters(SemaRef, TemplateArg.getAsType(), Deduced);
1291     break;
1292 
1293   case TemplateArgument::Declaration:
1294     if (TemplateTemplateParmDecl *TTP
1295         = dyn_cast<TemplateTemplateParmDecl>(TemplateArg.getAsDecl()))
1296       Deduced[TTP->getIndex()] = true;
1297     break;
1298 
1299   case TemplateArgument::Expression:
1300     MarkDeducedTemplateParameters(TemplateArg.getAsExpr(), Deduced);
1301     break;
1302   case TemplateArgument::Pack:
1303     assert(0 && "FIXME: Implement!");
1304     break;
1305   }
1306 }
1307 
1308 /// \brief Mark the template parameters can be deduced by the given
1309 /// template argument list.
1310 ///
1311 /// \param TemplateArgs the template argument list from which template
1312 /// parameters will be deduced.
1313 ///
1314 /// \param Deduced a bit vector whose elements will be set to \c true
1315 /// to indicate when the corresponding template parameter will be
1316 /// deduced.
1317 void
1318 Sema::MarkDeducedTemplateParameters(const TemplateArgumentList &TemplateArgs,
1319                                     llvm::SmallVectorImpl<bool> &Deduced) {
1320   for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
1321     ::MarkDeducedTemplateParameters(*this, TemplateArgs[I], Deduced);
1322 }
1323