1 //===------- SemaTemplateDeduction.cpp - Template Argument Deduction ------===/
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //===----------------------------------------------------------------------===/
9 // This file implements C++ template argument deduction.
11 //===----------------------------------------------------------------------===/
13 #include "clang/Sema/Sema.h"
14 #include "clang/Sema/DeclSpec.h"
15 #include "clang/Sema/Template.h"
16 #include "clang/Sema/TemplateDeduction.h"
17 #include "clang/AST/ASTContext.h"
18 #include "clang/AST/DeclObjC.h"
19 #include "clang/AST/DeclTemplate.h"
20 #include "clang/AST/StmtVisitor.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprCXX.h"
28 /// \brief Various flags that control template argument deduction.
30 /// These flags can be bitwise-OR'd together.
31 enum TemplateDeductionFlags
{
32 /// \brief No template argument deduction flags, which indicates the
33 /// strictest results for template argument deduction (as used for, e.g.,
34 /// matching class template partial specializations).
36 /// \brief Within template argument deduction from a function call, we are
37 /// matching with a parameter type for which the original parameter was
39 TDF_ParamWithReferenceType
= 0x1,
40 /// \brief Within template argument deduction from a function call, we
41 /// are matching in a case where we ignore cv-qualifiers.
42 TDF_IgnoreQualifiers
= 0x02,
43 /// \brief Within template argument deduction from a function call,
44 /// we are matching in a case where we can perform template argument
45 /// deduction from a template-id of a derived class of the argument type.
46 TDF_DerivedClass
= 0x04,
47 /// \brief Allow non-dependent types to differ, e.g., when performing
48 /// template argument deduction from a function call where conversions
50 TDF_SkipNonDependent
= 0x08
54 using namespace clang
;
56 /// \brief Compare two APSInts, extending and switching the sign as
57 /// necessary to compare their values regardless of underlying type.
58 static bool hasSameExtendedValue(llvm::APSInt X
, llvm::APSInt Y
) {
59 if (Y
.getBitWidth() > X
.getBitWidth())
60 X
.extend(Y
.getBitWidth());
61 else if (Y
.getBitWidth() < X
.getBitWidth())
62 Y
.extend(X
.getBitWidth());
64 // If there is a signedness mismatch, correct it.
65 if (X
.isSigned() != Y
.isSigned()) {
66 // If the signed value is negative, then the values cannot be the same.
67 if ((Y
.isSigned() && Y
.isNegative()) || (X
.isSigned() && X
.isNegative()))
77 static Sema::TemplateDeductionResult
78 DeduceTemplateArguments(Sema
&S
,
79 TemplateParameterList
*TemplateParams
,
80 const TemplateArgument
&Param
,
81 const TemplateArgument
&Arg
,
82 TemplateDeductionInfo
&Info
,
83 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
);
85 /// \brief If the given expression is of a form that permits the deduction
86 /// of a non-type template parameter, return the declaration of that
87 /// non-type template parameter.
88 static NonTypeTemplateParmDecl
*getDeducedParameterFromExpr(Expr
*E
) {
89 if (ImplicitCastExpr
*IC
= dyn_cast
<ImplicitCastExpr
>(E
))
92 if (DeclRefExpr
*DRE
= dyn_cast
<DeclRefExpr
>(E
))
93 return dyn_cast
<NonTypeTemplateParmDecl
>(DRE
->getDecl());
98 /// \brief Deduce the value of the given non-type template parameter
99 /// from the given constant.
100 static Sema::TemplateDeductionResult
101 DeduceNonTypeTemplateArgument(Sema
&S
,
102 NonTypeTemplateParmDecl
*NTTP
,
103 llvm::APSInt Value
, QualType ValueType
,
104 bool DeducedFromArrayBound
,
105 TemplateDeductionInfo
&Info
,
106 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
) {
107 assert(NTTP
->getDepth() == 0 &&
108 "Cannot deduce non-type template argument with depth > 0");
110 if (Deduced
[NTTP
->getIndex()].isNull()) {
111 Deduced
[NTTP
->getIndex()] = DeducedTemplateArgument(Value
, ValueType
,
112 DeducedFromArrayBound
);
113 return Sema::TDK_Success
;
116 if (Deduced
[NTTP
->getIndex()].getKind() != TemplateArgument::Integral
) {
118 Info
.FirstArg
= Deduced
[NTTP
->getIndex()];
119 Info
.SecondArg
= TemplateArgument(Value
, ValueType
);
120 return Sema::TDK_Inconsistent
;
123 // Extent the smaller of the two values.
124 llvm::APSInt PrevValue
= *Deduced
[NTTP
->getIndex()].getAsIntegral();
125 if (!hasSameExtendedValue(PrevValue
, Value
)) {
127 Info
.FirstArg
= Deduced
[NTTP
->getIndex()];
128 Info
.SecondArg
= TemplateArgument(Value
, ValueType
);
129 return Sema::TDK_Inconsistent
;
132 if (!DeducedFromArrayBound
)
133 Deduced
[NTTP
->getIndex()].setDeducedFromArrayBound(false);
135 return Sema::TDK_Success
;
138 /// \brief Deduce the value of the given non-type template parameter
139 /// from the given type- or value-dependent expression.
141 /// \returns true if deduction succeeded, false otherwise.
142 static Sema::TemplateDeductionResult
143 DeduceNonTypeTemplateArgument(Sema
&S
,
144 NonTypeTemplateParmDecl
*NTTP
,
146 TemplateDeductionInfo
&Info
,
147 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
) {
148 assert(NTTP
->getDepth() == 0 &&
149 "Cannot deduce non-type template argument with depth > 0");
150 assert((Value
->isTypeDependent() || Value
->isValueDependent()) &&
151 "Expression template argument must be type- or value-dependent.");
153 if (Deduced
[NTTP
->getIndex()].isNull()) {
154 Deduced
[NTTP
->getIndex()] = TemplateArgument(Value
);
155 return Sema::TDK_Success
;
158 if (Deduced
[NTTP
->getIndex()].getKind() == TemplateArgument::Integral
) {
159 // Okay, we deduced a constant in one case and a dependent expression
160 // in another case. FIXME: Later, we will check that instantiating the
161 // dependent expression gives us the constant value.
162 return Sema::TDK_Success
;
165 if (Deduced
[NTTP
->getIndex()].getKind() == TemplateArgument::Expression
) {
166 // Compare the expressions for equality
167 llvm::FoldingSetNodeID ID1
, ID2
;
168 Deduced
[NTTP
->getIndex()].getAsExpr()->Profile(ID1
, S
.Context
, true);
169 Value
->Profile(ID2
, S
.Context
, true);
171 return Sema::TDK_Success
;
173 // FIXME: Fill in argument mismatch information
174 return Sema::TDK_NonDeducedMismatch
;
177 return Sema::TDK_Success
;
180 /// \brief Deduce the value of the given non-type template parameter
181 /// from the given declaration.
183 /// \returns true if deduction succeeded, false otherwise.
184 static Sema::TemplateDeductionResult
185 DeduceNonTypeTemplateArgument(Sema
&S
,
186 NonTypeTemplateParmDecl
*NTTP
,
188 TemplateDeductionInfo
&Info
,
189 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
) {
190 assert(NTTP
->getDepth() == 0 &&
191 "Cannot deduce non-type template argument with depth > 0");
193 if (Deduced
[NTTP
->getIndex()].isNull()) {
194 Deduced
[NTTP
->getIndex()] = TemplateArgument(D
->getCanonicalDecl());
195 return Sema::TDK_Success
;
198 if (Deduced
[NTTP
->getIndex()].getKind() == TemplateArgument::Expression
) {
199 // Okay, we deduced a declaration in one case and a dependent expression
201 return Sema::TDK_Success
;
204 if (Deduced
[NTTP
->getIndex()].getKind() == TemplateArgument::Declaration
) {
205 // Compare the declarations for equality
206 if (Deduced
[NTTP
->getIndex()].getAsDecl()->getCanonicalDecl() ==
207 D
->getCanonicalDecl())
208 return Sema::TDK_Success
;
210 // FIXME: Fill in argument mismatch information
211 return Sema::TDK_NonDeducedMismatch
;
214 return Sema::TDK_Success
;
217 static Sema::TemplateDeductionResult
218 DeduceTemplateArguments(Sema
&S
,
219 TemplateParameterList
*TemplateParams
,
222 TemplateDeductionInfo
&Info
,
223 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
) {
224 TemplateDecl
*ParamDecl
= Param
.getAsTemplateDecl();
226 // The parameter type is dependent and is not a template template parameter,
227 // so there is nothing that we can deduce.
228 return Sema::TDK_Success
;
231 if (TemplateTemplateParmDecl
*TempParam
232 = dyn_cast
<TemplateTemplateParmDecl
>(ParamDecl
)) {
233 // Bind the template template parameter to the given template name.
234 TemplateArgument
&ExistingArg
= Deduced
[TempParam
->getIndex()];
235 if (ExistingArg
.isNull()) {
236 // This is the first deduction for this template template parameter.
237 ExistingArg
= TemplateArgument(S
.Context
.getCanonicalTemplateName(Arg
));
238 return Sema::TDK_Success
;
241 // Verify that the previous binding matches this deduction.
242 assert(ExistingArg
.getKind() == TemplateArgument::Template
);
243 if (S
.Context
.hasSameTemplateName(ExistingArg
.getAsTemplate(), Arg
))
244 return Sema::TDK_Success
;
246 // Inconsistent deduction.
247 Info
.Param
= TempParam
;
248 Info
.FirstArg
= ExistingArg
;
249 Info
.SecondArg
= TemplateArgument(Arg
);
250 return Sema::TDK_Inconsistent
;
253 // Verify that the two template names are equivalent.
254 if (S
.Context
.hasSameTemplateName(Param
, Arg
))
255 return Sema::TDK_Success
;
257 // Mismatch of non-dependent template parameter to argument.
258 Info
.FirstArg
= TemplateArgument(Param
);
259 Info
.SecondArg
= TemplateArgument(Arg
);
260 return Sema::TDK_NonDeducedMismatch
;
263 /// \brief Deduce the template arguments by comparing the template parameter
264 /// type (which is a template-id) with the template argument type.
266 /// \param S the Sema
268 /// \param TemplateParams the template parameters that we are deducing
270 /// \param Param the parameter type
272 /// \param Arg the argument type
274 /// \param Info information about the template argument deduction itself
276 /// \param Deduced the deduced template arguments
278 /// \returns the result of template argument deduction so far. Note that a
279 /// "success" result means that template argument deduction has not yet failed,
280 /// but it may still fail, later, for other reasons.
281 static Sema::TemplateDeductionResult
282 DeduceTemplateArguments(Sema
&S
,
283 TemplateParameterList
*TemplateParams
,
284 const TemplateSpecializationType
*Param
,
286 TemplateDeductionInfo
&Info
,
287 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
) {
288 assert(Arg
.isCanonical() && "Argument type must be canonical");
290 // Check whether the template argument is a dependent template-id.
291 if (const TemplateSpecializationType
*SpecArg
292 = dyn_cast
<TemplateSpecializationType
>(Arg
)) {
293 // Perform template argument deduction for the template name.
294 if (Sema::TemplateDeductionResult Result
295 = DeduceTemplateArguments(S
, TemplateParams
,
296 Param
->getTemplateName(),
297 SpecArg
->getTemplateName(),
302 // Perform template argument deduction on each template
304 unsigned NumArgs
= std::min(SpecArg
->getNumArgs(), Param
->getNumArgs());
305 for (unsigned I
= 0; I
!= NumArgs
; ++I
)
306 if (Sema::TemplateDeductionResult Result
307 = DeduceTemplateArguments(S
, TemplateParams
,
313 return Sema::TDK_Success
;
316 // If the argument type is a class template specialization, we
317 // perform template argument deduction using its template
319 const RecordType
*RecordArg
= dyn_cast
<RecordType
>(Arg
);
321 return Sema::TDK_NonDeducedMismatch
;
323 ClassTemplateSpecializationDecl
*SpecArg
324 = dyn_cast
<ClassTemplateSpecializationDecl
>(RecordArg
->getDecl());
326 return Sema::TDK_NonDeducedMismatch
;
328 // Perform template argument deduction for the template name.
329 if (Sema::TemplateDeductionResult Result
330 = DeduceTemplateArguments(S
,
332 Param
->getTemplateName(),
333 TemplateName(SpecArg
->getSpecializedTemplate()),
337 unsigned NumArgs
= Param
->getNumArgs();
338 const TemplateArgumentList
&ArgArgs
= SpecArg
->getTemplateArgs();
339 if (NumArgs
!= ArgArgs
.size())
340 return Sema::TDK_NonDeducedMismatch
;
342 for (unsigned I
= 0; I
!= NumArgs
; ++I
)
343 if (Sema::TemplateDeductionResult Result
344 = DeduceTemplateArguments(S
, TemplateParams
,
350 return Sema::TDK_Success
;
353 /// \brief Determines whether the given type is an opaque type that
354 /// might be more qualified when instantiated.
355 static bool IsPossiblyOpaquelyQualifiedType(QualType T
) {
356 switch (T
->getTypeClass()) {
357 case Type::TypeOfExpr
:
359 case Type::DependentName
:
361 case Type::UnresolvedUsing
:
364 case Type::ConstantArray
:
365 case Type::IncompleteArray
:
366 case Type::VariableArray
:
367 case Type::DependentSizedArray
:
368 return IsPossiblyOpaquelyQualifiedType(
369 cast
<ArrayType
>(T
)->getElementType());
376 /// \brief Deduce the template arguments by comparing the parameter type and
377 /// the argument type (C++ [temp.deduct.type]).
379 /// \param S the semantic analysis object within which we are deducing
381 /// \param TemplateParams the template parameters that we are deducing
383 /// \param ParamIn the parameter type
385 /// \param ArgIn the argument type
387 /// \param Info information about the template argument deduction itself
389 /// \param Deduced the deduced template arguments
391 /// \param TDF bitwise OR of the TemplateDeductionFlags bits that describe
392 /// how template argument deduction is performed.
394 /// \returns the result of template argument deduction so far. Note that a
395 /// "success" result means that template argument deduction has not yet failed,
396 /// but it may still fail, later, for other reasons.
397 static Sema::TemplateDeductionResult
398 DeduceTemplateArguments(Sema
&S
,
399 TemplateParameterList
*TemplateParams
,
400 QualType ParamIn
, QualType ArgIn
,
401 TemplateDeductionInfo
&Info
,
402 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
,
404 // We only want to look at the canonical types, since typedefs and
405 // sugar are not part of template argument deduction.
406 QualType Param
= S
.Context
.getCanonicalType(ParamIn
);
407 QualType Arg
= S
.Context
.getCanonicalType(ArgIn
);
409 // C++0x [temp.deduct.call]p4 bullet 1:
410 // - If the original P is a reference type, the deduced A (i.e., the type
411 // referred to by the reference) can be more cv-qualified than the
413 if (TDF
& TDF_ParamWithReferenceType
) {
415 QualType UnqualParam
= S
.Context
.getUnqualifiedArrayType(Param
, Quals
);
416 Quals
.setCVRQualifiers(Quals
.getCVRQualifiers() &
417 Arg
.getCVRQualifiersThroughArrayTypes());
418 Param
= S
.Context
.getQualifiedType(UnqualParam
, Quals
);
421 // If the parameter type is not dependent, there is nothing to deduce.
422 if (!Param
->isDependentType()) {
423 if (!(TDF
& TDF_SkipNonDependent
) && Param
!= Arg
) {
425 return Sema::TDK_NonDeducedMismatch
;
428 return Sema::TDK_Success
;
431 // C++ [temp.deduct.type]p9:
432 // A template type argument T, a template template argument TT or a
433 // template non-type argument i can be deduced if P and A have one of
434 // the following forms:
438 if (const TemplateTypeParmType
*TemplateTypeParm
439 = Param
->getAs
<TemplateTypeParmType
>()) {
440 unsigned Index
= TemplateTypeParm
->getIndex();
441 bool RecanonicalizeArg
= false;
443 // If the argument type is an array type, move the qualifiers up to the
444 // top level, so they can be matched with the qualifiers on the parameter.
445 // FIXME: address spaces, ObjC GC qualifiers
446 if (isa
<ArrayType
>(Arg
)) {
448 Arg
= S
.Context
.getUnqualifiedArrayType(Arg
, Quals
);
450 Arg
= S
.Context
.getQualifiedType(Arg
, Quals
);
451 RecanonicalizeArg
= true;
455 // The argument type can not be less qualified than the parameter
457 if (Param
.isMoreQualifiedThan(Arg
) && !(TDF
& TDF_IgnoreQualifiers
)) {
458 Info
.Param
= cast
<TemplateTypeParmDecl
>(TemplateParams
->getParam(Index
));
459 Info
.FirstArg
= TemplateArgument(Param
);
460 Info
.SecondArg
= TemplateArgument(Arg
);
461 return Sema::TDK_Underqualified
;
464 assert(TemplateTypeParm
->getDepth() == 0 && "Can't deduce with depth > 0");
465 assert(Arg
!= S
.Context
.OverloadTy
&& "Unresolved overloaded function");
466 QualType DeducedType
= Arg
;
467 DeducedType
.removeCVRQualifiers(Param
.getCVRQualifiers());
468 if (RecanonicalizeArg
)
469 DeducedType
= S
.Context
.getCanonicalType(DeducedType
);
471 if (Deduced
[Index
].isNull())
472 Deduced
[Index
] = TemplateArgument(DeducedType
);
474 // C++ [temp.deduct.type]p2:
475 // [...] If type deduction cannot be done for any P/A pair, or if for
476 // any pair the deduction leads to more than one possible set of
477 // deduced values, or if different pairs yield different deduced
478 // values, or if any template argument remains neither deduced nor
479 // explicitly specified, template argument deduction fails.
480 if (Deduced
[Index
].getAsType() != DeducedType
) {
482 = cast
<TemplateTypeParmDecl
>(TemplateParams
->getParam(Index
));
483 Info
.FirstArg
= Deduced
[Index
];
484 Info
.SecondArg
= TemplateArgument(Arg
);
485 return Sema::TDK_Inconsistent
;
488 return Sema::TDK_Success
;
491 // Set up the template argument deduction information for a failure.
492 Info
.FirstArg
= TemplateArgument(ParamIn
);
493 Info
.SecondArg
= TemplateArgument(ArgIn
);
495 // Check the cv-qualifiers on the parameter and argument types.
496 if (!(TDF
& TDF_IgnoreQualifiers
)) {
497 if (TDF
& TDF_ParamWithReferenceType
) {
498 if (Param
.isMoreQualifiedThan(Arg
))
499 return Sema::TDK_NonDeducedMismatch
;
500 } else if (!IsPossiblyOpaquelyQualifiedType(Param
)) {
501 if (Param
.getCVRQualifiers() != Arg
.getCVRQualifiers())
502 return Sema::TDK_NonDeducedMismatch
;
506 switch (Param
->getTypeClass()) {
507 // No deduction possible for these types
509 return Sema::TDK_NonDeducedMismatch
;
512 case Type::Pointer
: {
513 QualType PointeeType
;
514 if (const PointerType
*PointerArg
= Arg
->getAs
<PointerType
>()) {
515 PointeeType
= PointerArg
->getPointeeType();
516 } else if (const ObjCObjectPointerType
*PointerArg
517 = Arg
->getAs
<ObjCObjectPointerType
>()) {
518 PointeeType
= PointerArg
->getPointeeType();
520 return Sema::TDK_NonDeducedMismatch
;
523 unsigned SubTDF
= TDF
& (TDF_IgnoreQualifiers
| TDF_DerivedClass
);
524 return DeduceTemplateArguments(S
, TemplateParams
,
525 cast
<PointerType
>(Param
)->getPointeeType(),
527 Info
, Deduced
, SubTDF
);
531 case Type::LValueReference
: {
532 const LValueReferenceType
*ReferenceArg
= Arg
->getAs
<LValueReferenceType
>();
534 return Sema::TDK_NonDeducedMismatch
;
536 return DeduceTemplateArguments(S
, TemplateParams
,
537 cast
<LValueReferenceType
>(Param
)->getPointeeType(),
538 ReferenceArg
->getPointeeType(),
543 case Type::RValueReference
: {
544 const RValueReferenceType
*ReferenceArg
= Arg
->getAs
<RValueReferenceType
>();
546 return Sema::TDK_NonDeducedMismatch
;
548 return DeduceTemplateArguments(S
, TemplateParams
,
549 cast
<RValueReferenceType
>(Param
)->getPointeeType(),
550 ReferenceArg
->getPointeeType(),
554 // T [] (implied, but not stated explicitly)
555 case Type::IncompleteArray
: {
556 const IncompleteArrayType
*IncompleteArrayArg
=
557 S
.Context
.getAsIncompleteArrayType(Arg
);
558 if (!IncompleteArrayArg
)
559 return Sema::TDK_NonDeducedMismatch
;
561 unsigned SubTDF
= TDF
& TDF_IgnoreQualifiers
;
562 return DeduceTemplateArguments(S
, TemplateParams
,
563 S
.Context
.getAsIncompleteArrayType(Param
)->getElementType(),
564 IncompleteArrayArg
->getElementType(),
565 Info
, Deduced
, SubTDF
);
568 // T [integer-constant]
569 case Type::ConstantArray
: {
570 const ConstantArrayType
*ConstantArrayArg
=
571 S
.Context
.getAsConstantArrayType(Arg
);
572 if (!ConstantArrayArg
)
573 return Sema::TDK_NonDeducedMismatch
;
575 const ConstantArrayType
*ConstantArrayParm
=
576 S
.Context
.getAsConstantArrayType(Param
);
577 if (ConstantArrayArg
->getSize() != ConstantArrayParm
->getSize())
578 return Sema::TDK_NonDeducedMismatch
;
580 unsigned SubTDF
= TDF
& TDF_IgnoreQualifiers
;
581 return DeduceTemplateArguments(S
, TemplateParams
,
582 ConstantArrayParm
->getElementType(),
583 ConstantArrayArg
->getElementType(),
584 Info
, Deduced
, SubTDF
);
588 case Type::DependentSizedArray
: {
589 const ArrayType
*ArrayArg
= S
.Context
.getAsArrayType(Arg
);
591 return Sema::TDK_NonDeducedMismatch
;
593 unsigned SubTDF
= TDF
& TDF_IgnoreQualifiers
;
595 // Check the element type of the arrays
596 const DependentSizedArrayType
*DependentArrayParm
597 = S
.Context
.getAsDependentSizedArrayType(Param
);
598 if (Sema::TemplateDeductionResult Result
599 = DeduceTemplateArguments(S
, TemplateParams
,
600 DependentArrayParm
->getElementType(),
601 ArrayArg
->getElementType(),
602 Info
, Deduced
, SubTDF
))
605 // Determine the array bound is something we can deduce.
606 NonTypeTemplateParmDecl
*NTTP
607 = getDeducedParameterFromExpr(DependentArrayParm
->getSizeExpr());
609 return Sema::TDK_Success
;
611 // We can perform template argument deduction for the given non-type
612 // template parameter.
613 assert(NTTP
->getDepth() == 0 &&
614 "Cannot deduce non-type template argument at depth > 0");
615 if (const ConstantArrayType
*ConstantArrayArg
616 = dyn_cast
<ConstantArrayType
>(ArrayArg
)) {
617 llvm::APSInt
Size(ConstantArrayArg
->getSize());
618 return DeduceNonTypeTemplateArgument(S
, NTTP
, Size
,
619 S
.Context
.getSizeType(),
623 if (const DependentSizedArrayType
*DependentArrayArg
624 = dyn_cast
<DependentSizedArrayType
>(ArrayArg
))
625 return DeduceNonTypeTemplateArgument(S
, NTTP
,
626 DependentArrayArg
->getSizeExpr(),
629 // Incomplete type does not match a dependently-sized array type
630 return Sema::TDK_NonDeducedMismatch
;
636 case Type::FunctionProto
: {
637 const FunctionProtoType
*FunctionProtoArg
=
638 dyn_cast
<FunctionProtoType
>(Arg
);
639 if (!FunctionProtoArg
)
640 return Sema::TDK_NonDeducedMismatch
;
642 const FunctionProtoType
*FunctionProtoParam
=
643 cast
<FunctionProtoType
>(Param
);
645 if (FunctionProtoParam
->getTypeQuals() !=
646 FunctionProtoArg
->getTypeQuals())
647 return Sema::TDK_NonDeducedMismatch
;
649 if (FunctionProtoParam
->getNumArgs() != FunctionProtoArg
->getNumArgs())
650 return Sema::TDK_NonDeducedMismatch
;
652 if (FunctionProtoParam
->isVariadic() != FunctionProtoArg
->isVariadic())
653 return Sema::TDK_NonDeducedMismatch
;
655 // Check return types.
656 if (Sema::TemplateDeductionResult Result
657 = DeduceTemplateArguments(S
, TemplateParams
,
658 FunctionProtoParam
->getResultType(),
659 FunctionProtoArg
->getResultType(),
663 for (unsigned I
= 0, N
= FunctionProtoParam
->getNumArgs(); I
!= N
; ++I
) {
664 // Check argument types.
665 if (Sema::TemplateDeductionResult Result
666 = DeduceTemplateArguments(S
, TemplateParams
,
667 FunctionProtoParam
->getArgType(I
),
668 FunctionProtoArg
->getArgType(I
),
673 return Sema::TDK_Success
;
676 case Type::InjectedClassName
: {
677 // Treat a template's injected-class-name as if the template
678 // specialization type had been used.
679 Param
= cast
<InjectedClassNameType
>(Param
)
680 ->getInjectedSpecializationType();
681 assert(isa
<TemplateSpecializationType
>(Param
) &&
682 "injected class name is not a template specialization type");
686 // template-name<T> (where template-name refers to a class template)
691 case Type::TemplateSpecialization
: {
692 const TemplateSpecializationType
*SpecParam
693 = cast
<TemplateSpecializationType
>(Param
);
695 // Try to deduce template arguments from the template-id.
696 Sema::TemplateDeductionResult Result
697 = DeduceTemplateArguments(S
, TemplateParams
, SpecParam
, Arg
,
700 if (Result
&& (TDF
& TDF_DerivedClass
)) {
701 // C++ [temp.deduct.call]p3b3:
702 // If P is a class, and P has the form template-id, then A can be a
703 // derived class of the deduced A. Likewise, if P is a pointer to a
704 // class of the form template-id, A can be a pointer to a derived
705 // class pointed to by the deduced A.
708 // These alternatives are considered only if type deduction would
710 if (const RecordType
*RecordT
= Arg
->getAs
<RecordType
>()) {
711 // We cannot inspect base classes as part of deduction when the type
712 // is incomplete, so either instantiate any templates necessary to
713 // complete the type, or skip over it if it cannot be completed.
714 if (S
.RequireCompleteType(Info
.getLocation(), Arg
, 0))
717 // Use data recursion to crawl through the list of base classes.
718 // Visited contains the set of nodes we have already visited, while
719 // ToVisit is our stack of records that we still need to visit.
720 llvm::SmallPtrSet
<const RecordType
*, 8> Visited
;
721 llvm::SmallVector
<const RecordType
*, 8> ToVisit
;
722 ToVisit
.push_back(RecordT
);
723 bool Successful
= false;
724 llvm::SmallVectorImpl
<DeducedTemplateArgument
> DeducedOrig(0);
725 DeducedOrig
= Deduced
;
726 while (!ToVisit
.empty()) {
727 // Retrieve the next class in the inheritance hierarchy.
728 const RecordType
*NextT
= ToVisit
.back();
731 // If we have already seen this type, skip it.
732 if (!Visited
.insert(NextT
))
735 // If this is a base class, try to perform template argument
736 // deduction from it.
737 if (NextT
!= RecordT
) {
738 Sema::TemplateDeductionResult BaseResult
739 = DeduceTemplateArguments(S
, TemplateParams
, SpecParam
,
740 QualType(NextT
, 0), Info
, Deduced
);
742 // If template argument deduction for this base was successful,
743 // note that we had some success. Otherwise, ignore any deductions
744 // from this base class.
745 if (BaseResult
== Sema::TDK_Success
) {
747 DeducedOrig
= Deduced
;
750 Deduced
= DeducedOrig
;
753 // Visit base classes
754 CXXRecordDecl
*Next
= cast
<CXXRecordDecl
>(NextT
->getDecl());
755 for (CXXRecordDecl::base_class_iterator Base
= Next
->bases_begin(),
756 BaseEnd
= Next
->bases_end();
757 Base
!= BaseEnd
; ++Base
) {
758 assert(Base
->getType()->isRecordType() &&
759 "Base class that isn't a record?");
760 ToVisit
.push_back(Base
->getType()->getAs
<RecordType
>());
765 return Sema::TDK_Success
;
782 case Type::MemberPointer
: {
783 const MemberPointerType
*MemPtrParam
= cast
<MemberPointerType
>(Param
);
784 const MemberPointerType
*MemPtrArg
= dyn_cast
<MemberPointerType
>(Arg
);
786 return Sema::TDK_NonDeducedMismatch
;
788 if (Sema::TemplateDeductionResult Result
789 = DeduceTemplateArguments(S
, TemplateParams
,
790 MemPtrParam
->getPointeeType(),
791 MemPtrArg
->getPointeeType(),
793 TDF
& TDF_IgnoreQualifiers
))
796 return DeduceTemplateArguments(S
, TemplateParams
,
797 QualType(MemPtrParam
->getClass(), 0),
798 QualType(MemPtrArg
->getClass(), 0),
807 case Type::BlockPointer
: {
808 const BlockPointerType
*BlockPtrParam
= cast
<BlockPointerType
>(Param
);
809 const BlockPointerType
*BlockPtrArg
= dyn_cast
<BlockPointerType
>(Arg
);
812 return Sema::TDK_NonDeducedMismatch
;
814 return DeduceTemplateArguments(S
, TemplateParams
,
815 BlockPtrParam
->getPointeeType(),
816 BlockPtrArg
->getPointeeType(), Info
,
820 case Type::TypeOfExpr
:
822 case Type::DependentName
:
823 // No template argument deduction for these types
824 return Sema::TDK_Success
;
830 // FIXME: Many more cases to go (to go).
831 return Sema::TDK_Success
;
834 static Sema::TemplateDeductionResult
835 DeduceTemplateArguments(Sema
&S
,
836 TemplateParameterList
*TemplateParams
,
837 const TemplateArgument
&Param
,
838 const TemplateArgument
&Arg
,
839 TemplateDeductionInfo
&Info
,
840 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
) {
841 switch (Param
.getKind()) {
842 case TemplateArgument::Null
:
843 assert(false && "Null template argument in parameter list");
846 case TemplateArgument::Type
:
847 if (Arg
.getKind() == TemplateArgument::Type
)
848 return DeduceTemplateArguments(S
, TemplateParams
, Param
.getAsType(),
849 Arg
.getAsType(), Info
, Deduced
, 0);
850 Info
.FirstArg
= Param
;
851 Info
.SecondArg
= Arg
;
852 return Sema::TDK_NonDeducedMismatch
;
854 case TemplateArgument::Template
:
855 if (Arg
.getKind() == TemplateArgument::Template
)
856 return DeduceTemplateArguments(S
, TemplateParams
,
857 Param
.getAsTemplate(),
858 Arg
.getAsTemplate(), Info
, Deduced
);
859 Info
.FirstArg
= Param
;
860 Info
.SecondArg
= Arg
;
861 return Sema::TDK_NonDeducedMismatch
;
863 case TemplateArgument::Declaration
:
864 if (Arg
.getKind() == TemplateArgument::Declaration
&&
865 Param
.getAsDecl()->getCanonicalDecl() ==
866 Arg
.getAsDecl()->getCanonicalDecl())
867 return Sema::TDK_Success
;
869 Info
.FirstArg
= Param
;
870 Info
.SecondArg
= Arg
;
871 return Sema::TDK_NonDeducedMismatch
;
873 case TemplateArgument::Integral
:
874 if (Arg
.getKind() == TemplateArgument::Integral
) {
875 if (hasSameExtendedValue(*Param
.getAsIntegral(), *Arg
.getAsIntegral()))
876 return Sema::TDK_Success
;
878 Info
.FirstArg
= Param
;
879 Info
.SecondArg
= Arg
;
880 return Sema::TDK_NonDeducedMismatch
;
883 if (Arg
.getKind() == TemplateArgument::Expression
) {
884 Info
.FirstArg
= Param
;
885 Info
.SecondArg
= Arg
;
886 return Sema::TDK_NonDeducedMismatch
;
889 Info
.FirstArg
= Param
;
890 Info
.SecondArg
= Arg
;
891 return Sema::TDK_NonDeducedMismatch
;
893 case TemplateArgument::Expression
: {
894 if (NonTypeTemplateParmDecl
*NTTP
895 = getDeducedParameterFromExpr(Param
.getAsExpr())) {
896 if (Arg
.getKind() == TemplateArgument::Integral
)
897 return DeduceNonTypeTemplateArgument(S
, NTTP
,
898 *Arg
.getAsIntegral(),
899 Arg
.getIntegralType(),
900 /*ArrayBound=*/false,
902 if (Arg
.getKind() == TemplateArgument::Expression
)
903 return DeduceNonTypeTemplateArgument(S
, NTTP
, Arg
.getAsExpr(),
905 if (Arg
.getKind() == TemplateArgument::Declaration
)
906 return DeduceNonTypeTemplateArgument(S
, NTTP
, Arg
.getAsDecl(),
909 Info
.FirstArg
= Param
;
910 Info
.SecondArg
= Arg
;
911 return Sema::TDK_NonDeducedMismatch
;
914 // Can't deduce anything, but that's okay.
915 return Sema::TDK_Success
;
917 case TemplateArgument::Pack
:
918 assert(0 && "FIXME: Implement!");
922 return Sema::TDK_Success
;
925 static Sema::TemplateDeductionResult
926 DeduceTemplateArguments(Sema
&S
,
927 TemplateParameterList
*TemplateParams
,
928 const TemplateArgumentList
&ParamList
,
929 const TemplateArgumentList
&ArgList
,
930 TemplateDeductionInfo
&Info
,
931 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
) {
932 assert(ParamList
.size() == ArgList
.size());
933 for (unsigned I
= 0, N
= ParamList
.size(); I
!= N
; ++I
) {
934 if (Sema::TemplateDeductionResult Result
935 = DeduceTemplateArguments(S
, TemplateParams
,
936 ParamList
[I
], ArgList
[I
],
940 return Sema::TDK_Success
;
943 /// \brief Determine whether two template arguments are the same.
944 static bool isSameTemplateArg(ASTContext
&Context
,
945 const TemplateArgument
&X
,
946 const TemplateArgument
&Y
) {
947 if (X
.getKind() != Y
.getKind())
950 switch (X
.getKind()) {
951 case TemplateArgument::Null
:
952 assert(false && "Comparing NULL template argument");
955 case TemplateArgument::Type
:
956 return Context
.getCanonicalType(X
.getAsType()) ==
957 Context
.getCanonicalType(Y
.getAsType());
959 case TemplateArgument::Declaration
:
960 return X
.getAsDecl()->getCanonicalDecl() ==
961 Y
.getAsDecl()->getCanonicalDecl();
963 case TemplateArgument::Template
:
964 return Context
.getCanonicalTemplateName(X
.getAsTemplate())
965 .getAsVoidPointer() ==
966 Context
.getCanonicalTemplateName(Y
.getAsTemplate())
969 case TemplateArgument::Integral
:
970 return *X
.getAsIntegral() == *Y
.getAsIntegral();
972 case TemplateArgument::Expression
: {
973 llvm::FoldingSetNodeID XID
, YID
;
974 X
.getAsExpr()->Profile(XID
, Context
, true);
975 Y
.getAsExpr()->Profile(YID
, Context
, true);
979 case TemplateArgument::Pack
:
980 if (X
.pack_size() != Y
.pack_size())
983 for (TemplateArgument::pack_iterator XP
= X
.pack_begin(),
984 XPEnd
= X
.pack_end(),
986 XP
!= XPEnd
; ++XP
, ++YP
)
987 if (!isSameTemplateArg(Context
, *XP
, *YP
))
996 /// \brief Helper function to build a TemplateParameter when we don't
997 /// know its type statically.
998 static TemplateParameter
makeTemplateParameter(Decl
*D
) {
999 if (TemplateTypeParmDecl
*TTP
= dyn_cast
<TemplateTypeParmDecl
>(D
))
1000 return TemplateParameter(TTP
);
1001 else if (NonTypeTemplateParmDecl
*NTTP
= dyn_cast
<NonTypeTemplateParmDecl
>(D
))
1002 return TemplateParameter(NTTP
);
1004 return TemplateParameter(cast
<TemplateTemplateParmDecl
>(D
));
1007 /// Complete template argument deduction for a class template partial
1009 static Sema::TemplateDeductionResult
1010 FinishTemplateArgumentDeduction(Sema
&S
,
1011 ClassTemplatePartialSpecializationDecl
*Partial
,
1012 const TemplateArgumentList
&TemplateArgs
,
1013 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
,
1014 TemplateDeductionInfo
&Info
) {
1016 Sema::SFINAETrap
Trap(S
);
1018 Sema::ContextRAII
SavedContext(S
, Partial
);
1020 // C++ [temp.deduct.type]p2:
1021 // [...] or if any template argument remains neither deduced nor
1022 // explicitly specified, template argument deduction fails.
1023 llvm::SmallVector
<TemplateArgument
, 4> Builder
;
1024 for (unsigned I
= 0, N
= Deduced
.size(); I
!= N
; ++I
) {
1025 if (Deduced
[I
].isNull()) {
1027 = const_cast<NamedDecl
*>(
1028 Partial
->getTemplateParameters()->getParam(I
));
1029 Info
.Param
= makeTemplateParameter(Param
);
1030 return Sema::TDK_Incomplete
;
1033 Builder
.push_back(Deduced
[I
]);
1036 // Form the template argument list from the deduced template arguments.
1037 TemplateArgumentList
*DeducedArgumentList
1038 = TemplateArgumentList::CreateCopy(S
.Context
, Builder
.data(),
1041 Info
.reset(DeducedArgumentList
);
1043 // Substitute the deduced template arguments into the template
1044 // arguments of the class template partial specialization, and
1045 // verify that the instantiated template arguments are both valid
1046 // and are equivalent to the template arguments originally provided
1047 // to the class template.
1048 // FIXME: Do we have to correct the types of deduced non-type template
1049 // arguments (in particular, integral non-type template arguments?).
1050 LocalInstantiationScope
InstScope(S
);
1051 ClassTemplateDecl
*ClassTemplate
= Partial
->getSpecializedTemplate();
1052 const TemplateArgumentLoc
*PartialTemplateArgs
1053 = Partial
->getTemplateArgsAsWritten();
1054 unsigned N
= Partial
->getNumTemplateArgsAsWritten();
1056 // Note that we don't provide the langle and rangle locations.
1057 TemplateArgumentListInfo InstArgs
;
1059 for (unsigned I
= 0; I
!= N
; ++I
) {
1060 Decl
*Param
= const_cast<NamedDecl
*>(
1061 ClassTemplate
->getTemplateParameters()->getParam(I
));
1062 TemplateArgumentLoc InstArg
;
1063 if (S
.Subst(PartialTemplateArgs
[I
], InstArg
,
1064 MultiLevelTemplateArgumentList(*DeducedArgumentList
))) {
1065 Info
.Param
= makeTemplateParameter(Param
);
1066 Info
.FirstArg
= PartialTemplateArgs
[I
].getArgument();
1067 return Sema::TDK_SubstitutionFailure
;
1069 InstArgs
.addArgument(InstArg
);
1072 llvm::SmallVector
<TemplateArgument
, 4> ConvertedInstArgs
;
1073 if (S
.CheckTemplateArgumentList(ClassTemplate
, Partial
->getLocation(),
1074 InstArgs
, false, ConvertedInstArgs
))
1075 return Sema::TDK_SubstitutionFailure
;
1077 for (unsigned I
= 0, E
= ConvertedInstArgs
.size(); I
!= E
; ++I
) {
1078 TemplateArgument InstArg
= ConvertedInstArgs
.data()[I
];
1080 Decl
*Param
= const_cast<NamedDecl
*>(
1081 ClassTemplate
->getTemplateParameters()->getParam(I
));
1083 if (InstArg
.getKind() == TemplateArgument::Expression
) {
1084 // When the argument is an expression, check the expression result
1085 // against the actual template parameter to get down to the canonical
1086 // template argument.
1087 Expr
*InstExpr
= InstArg
.getAsExpr();
1088 if (NonTypeTemplateParmDecl
*NTTP
1089 = dyn_cast
<NonTypeTemplateParmDecl
>(Param
)) {
1090 if (S
.CheckTemplateArgument(NTTP
, NTTP
->getType(), InstExpr
, InstArg
)) {
1091 Info
.Param
= makeTemplateParameter(Param
);
1092 Info
.FirstArg
= Partial
->getTemplateArgs()[I
];
1093 return Sema::TDK_SubstitutionFailure
;
1098 if (!isSameTemplateArg(S
.Context
, TemplateArgs
[I
], InstArg
)) {
1099 Info
.Param
= makeTemplateParameter(Param
);
1100 Info
.FirstArg
= TemplateArgs
[I
];
1101 Info
.SecondArg
= InstArg
;
1102 return Sema::TDK_NonDeducedMismatch
;
1106 if (Trap
.hasErrorOccurred())
1107 return Sema::TDK_SubstitutionFailure
;
1109 return Sema::TDK_Success
;
1112 /// \brief Perform template argument deduction to determine whether
1113 /// the given template arguments match the given class template
1114 /// partial specialization per C++ [temp.class.spec.match].
1115 Sema::TemplateDeductionResult
1116 Sema::DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl
*Partial
,
1117 const TemplateArgumentList
&TemplateArgs
,
1118 TemplateDeductionInfo
&Info
) {
1119 // C++ [temp.class.spec.match]p2:
1120 // A partial specialization matches a given actual template
1121 // argument list if the template arguments of the partial
1122 // specialization can be deduced from the actual template argument
1124 SFINAETrap
Trap(*this);
1125 llvm::SmallVector
<DeducedTemplateArgument
, 4> Deduced
;
1126 Deduced
.resize(Partial
->getTemplateParameters()->size());
1127 if (TemplateDeductionResult Result
1128 = ::DeduceTemplateArguments(*this,
1129 Partial
->getTemplateParameters(),
1130 Partial
->getTemplateArgs(),
1131 TemplateArgs
, Info
, Deduced
))
1134 InstantiatingTemplate
Inst(*this, Partial
->getLocation(), Partial
,
1135 Deduced
.data(), Deduced
.size(), Info
);
1137 return TDK_InstantiationDepth
;
1139 if (Trap
.hasErrorOccurred())
1140 return Sema::TDK_SubstitutionFailure
;
1142 return ::FinishTemplateArgumentDeduction(*this, Partial
, TemplateArgs
,
1146 /// \brief Determine whether the given type T is a simple-template-id type.
1147 static bool isSimpleTemplateIdType(QualType T
) {
1148 if (const TemplateSpecializationType
*Spec
1149 = T
->getAs
<TemplateSpecializationType
>())
1150 return Spec
->getTemplateName().getAsTemplateDecl() != 0;
1155 /// \brief Substitute the explicitly-provided template arguments into the
1156 /// given function template according to C++ [temp.arg.explicit].
1158 /// \param FunctionTemplate the function template into which the explicit
1159 /// template arguments will be substituted.
1161 /// \param ExplicitTemplateArguments the explicitly-specified template
1164 /// \param Deduced the deduced template arguments, which will be populated
1165 /// with the converted and checked explicit template arguments.
1167 /// \param ParamTypes will be populated with the instantiated function
1170 /// \param FunctionType if non-NULL, the result type of the function template
1171 /// will also be instantiated and the pointed-to value will be updated with
1172 /// the instantiated function type.
1174 /// \param Info if substitution fails for any reason, this object will be
1175 /// populated with more information about the failure.
1177 /// \returns TDK_Success if substitution was successful, or some failure
1179 Sema::TemplateDeductionResult
1180 Sema::SubstituteExplicitTemplateArguments(
1181 FunctionTemplateDecl
*FunctionTemplate
,
1182 const TemplateArgumentListInfo
&ExplicitTemplateArgs
,
1183 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
,
1184 llvm::SmallVectorImpl
<QualType
> &ParamTypes
,
1185 QualType
*FunctionType
,
1186 TemplateDeductionInfo
&Info
) {
1187 FunctionDecl
*Function
= FunctionTemplate
->getTemplatedDecl();
1188 TemplateParameterList
*TemplateParams
1189 = FunctionTemplate
->getTemplateParameters();
1191 if (ExplicitTemplateArgs
.size() == 0) {
1192 // No arguments to substitute; just copy over the parameter types and
1193 // fill in the function type.
1194 for (FunctionDecl::param_iterator P
= Function
->param_begin(),
1195 PEnd
= Function
->param_end();
1198 ParamTypes
.push_back((*P
)->getType());
1201 *FunctionType
= Function
->getType();
1205 // Substitution of the explicit template arguments into a function template
1206 /// is a SFINAE context. Trap any errors that might occur.
1207 SFINAETrap
Trap(*this);
1209 // C++ [temp.arg.explicit]p3:
1210 // Template arguments that are present shall be specified in the
1211 // declaration order of their corresponding template-parameters. The
1212 // template argument list shall not specify more template-arguments than
1213 // there are corresponding template-parameters.
1214 llvm::SmallVector
<TemplateArgument
, 4> Builder
;
1216 // Enter a new template instantiation context where we check the
1217 // explicitly-specified template arguments against this function template,
1218 // and then substitute them into the function parameter types.
1219 InstantiatingTemplate
Inst(*this, FunctionTemplate
->getLocation(),
1220 FunctionTemplate
, Deduced
.data(), Deduced
.size(),
1221 ActiveTemplateInstantiation::ExplicitTemplateArgumentSubstitution
,
1224 return TDK_InstantiationDepth
;
1226 if (CheckTemplateArgumentList(FunctionTemplate
,
1228 ExplicitTemplateArgs
,
1230 Builder
) || Trap
.hasErrorOccurred()) {
1231 unsigned Index
= Builder
.size();
1232 if (Index
>= TemplateParams
->size())
1233 Index
= TemplateParams
->size() - 1;
1234 Info
.Param
= makeTemplateParameter(TemplateParams
->getParam(Index
));
1235 return TDK_InvalidExplicitArguments
;
1238 // Form the template argument list from the explicitly-specified
1239 // template arguments.
1240 TemplateArgumentList
*ExplicitArgumentList
1241 = TemplateArgumentList::CreateCopy(Context
, Builder
.data(), Builder
.size());
1242 Info
.reset(ExplicitArgumentList
);
1244 // Template argument deduction and the final substitution should be
1245 // done in the context of the templated declaration. Explicit
1246 // argument substitution, on the other hand, needs to happen in the
1248 ContextRAII
SavedContext(*this, FunctionTemplate
->getTemplatedDecl());
1250 // Instantiate the types of each of the function parameters given the
1251 // explicitly-specified template arguments.
1252 for (FunctionDecl::param_iterator P
= Function
->param_begin(),
1253 PEnd
= Function
->param_end();
1257 = SubstType((*P
)->getType(),
1258 MultiLevelTemplateArgumentList(*ExplicitArgumentList
),
1259 (*P
)->getLocation(), (*P
)->getDeclName());
1260 if (ParamType
.isNull() || Trap
.hasErrorOccurred())
1261 return TDK_SubstitutionFailure
;
1263 ParamTypes
.push_back(ParamType
);
1266 // If the caller wants a full function type back, instantiate the return
1267 // type and form that function type.
1269 // FIXME: exception-specifications?
1270 const FunctionProtoType
*Proto
1271 = Function
->getType()->getAs
<FunctionProtoType
>();
1272 assert(Proto
&& "Function template does not have a prototype?");
1275 = SubstType(Proto
->getResultType(),
1276 MultiLevelTemplateArgumentList(*ExplicitArgumentList
),
1277 Function
->getTypeSpecStartLoc(),
1278 Function
->getDeclName());
1279 if (ResultType
.isNull() || Trap
.hasErrorOccurred())
1280 return TDK_SubstitutionFailure
;
1282 *FunctionType
= BuildFunctionType(ResultType
,
1283 ParamTypes
.data(), ParamTypes
.size(),
1284 Proto
->isVariadic(),
1285 Proto
->getTypeQuals(),
1286 Function
->getLocation(),
1287 Function
->getDeclName(),
1288 Proto
->getExtInfo());
1289 if (FunctionType
->isNull() || Trap
.hasErrorOccurred())
1290 return TDK_SubstitutionFailure
;
1293 // C++ [temp.arg.explicit]p2:
1294 // Trailing template arguments that can be deduced (14.8.2) may be
1295 // omitted from the list of explicit template-arguments. If all of the
1296 // template arguments can be deduced, they may all be omitted; in this
1297 // case, the empty template argument list <> itself may also be omitted.
1299 // Take all of the explicitly-specified arguments and put them into the
1300 // set of deduced template arguments.
1301 Deduced
.reserve(TemplateParams
->size());
1302 for (unsigned I
= 0, N
= ExplicitArgumentList
->size(); I
!= N
; ++I
)
1303 Deduced
.push_back(ExplicitArgumentList
->get(I
));
1308 /// \brief Allocate a TemplateArgumentLoc where all locations have
1309 /// been initialized to the given location.
1311 /// \param S The semantic analysis object.
1313 /// \param The template argument we are producing template argument
1314 /// location information for.
1316 /// \param NTTPType For a declaration template argument, the type of
1317 /// the non-type template parameter that corresponds to this template
1320 /// \param Loc The source location to use for the resulting template
1322 static TemplateArgumentLoc
1323 getTrivialTemplateArgumentLoc(Sema
&S
,
1324 const TemplateArgument
&Arg
,
1326 SourceLocation Loc
) {
1327 switch (Arg
.getKind()) {
1328 case TemplateArgument::Null
:
1329 llvm_unreachable("Can't get a NULL template argument here");
1332 case TemplateArgument::Type
:
1333 return TemplateArgumentLoc(Arg
,
1334 S
.Context
.getTrivialTypeSourceInfo(Arg
.getAsType(), Loc
));
1336 case TemplateArgument::Declaration
: {
1338 = S
.BuildExpressionFromDeclTemplateArgument(Arg
, NTTPType
, Loc
)
1340 return TemplateArgumentLoc(TemplateArgument(E
), E
);
1343 case TemplateArgument::Integral
: {
1345 = S
.BuildExpressionFromIntegralTemplateArgument(Arg
, Loc
).takeAs
<Expr
>();
1346 return TemplateArgumentLoc(TemplateArgument(E
), E
);
1349 case TemplateArgument::Template
:
1350 return TemplateArgumentLoc(Arg
, SourceRange(), Loc
);
1352 case TemplateArgument::Expression
:
1353 return TemplateArgumentLoc(Arg
, Arg
.getAsExpr());
1355 case TemplateArgument::Pack
:
1356 llvm_unreachable("Template parameter packs are not yet supported");
1359 return TemplateArgumentLoc();
1362 /// \brief Finish template argument deduction for a function template,
1363 /// checking the deduced template arguments for completeness and forming
1364 /// the function template specialization.
1365 Sema::TemplateDeductionResult
1366 Sema::FinishTemplateArgumentDeduction(FunctionTemplateDecl
*FunctionTemplate
,
1367 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
,
1368 unsigned NumExplicitlySpecified
,
1369 FunctionDecl
*&Specialization
,
1370 TemplateDeductionInfo
&Info
) {
1371 TemplateParameterList
*TemplateParams
1372 = FunctionTemplate
->getTemplateParameters();
1374 // Template argument deduction for function templates in a SFINAE context.
1375 // Trap any errors that might occur.
1376 SFINAETrap
Trap(*this);
1378 // Enter a new template instantiation context while we instantiate the
1379 // actual function declaration.
1380 InstantiatingTemplate
Inst(*this, FunctionTemplate
->getLocation(),
1381 FunctionTemplate
, Deduced
.data(), Deduced
.size(),
1382 ActiveTemplateInstantiation::DeducedTemplateArgumentSubstitution
,
1385 return TDK_InstantiationDepth
;
1387 ContextRAII
SavedContext(*this, FunctionTemplate
->getTemplatedDecl());
1389 // C++ [temp.deduct.type]p2:
1390 // [...] or if any template argument remains neither deduced nor
1391 // explicitly specified, template argument deduction fails.
1392 llvm::SmallVector
<TemplateArgument
, 4> Builder
;
1393 for (unsigned I
= 0, N
= Deduced
.size(); I
!= N
; ++I
) {
1394 NamedDecl
*Param
= FunctionTemplate
->getTemplateParameters()->getParam(I
);
1395 if (!Deduced
[I
].isNull()) {
1396 if (I
< NumExplicitlySpecified
) {
1397 // We have already fully type-checked and converted this
1398 // argument, because it was explicitly-specified. Just record the
1399 // presence of this argument.
1400 Builder
.push_back(Deduced
[I
]);
1404 // We have deduced this argument, so it still needs to be
1405 // checked and converted.
1407 // First, for a non-type template parameter type that is
1408 // initialized by a declaration, we need the type of the
1409 // corresponding non-type template parameter.
1411 if (NonTypeTemplateParmDecl
*NTTP
1412 = dyn_cast
<NonTypeTemplateParmDecl
>(Param
)) {
1413 if (Deduced
[I
].getKind() == TemplateArgument::Declaration
) {
1414 NTTPType
= NTTP
->getType();
1415 if (NTTPType
->isDependentType()) {
1416 TemplateArgumentList
TemplateArgs(TemplateArgumentList::OnStack
,
1417 Builder
.data(), Builder
.size());
1418 NTTPType
= SubstType(NTTPType
,
1419 MultiLevelTemplateArgumentList(TemplateArgs
),
1420 NTTP
->getLocation(),
1421 NTTP
->getDeclName());
1422 if (NTTPType
.isNull()) {
1423 Info
.Param
= makeTemplateParameter(Param
);
1424 // FIXME: These template arguments are temporary. Free them!
1425 Info
.reset(TemplateArgumentList::CreateCopy(Context
,
1428 return TDK_SubstitutionFailure
;
1434 // Convert the deduced template argument into a template
1435 // argument that we can check, almost as if the user had written
1436 // the template argument explicitly.
1437 TemplateArgumentLoc Arg
= getTrivialTemplateArgumentLoc(*this,
1440 Info
.getLocation());
1442 // Check the template argument, converting it as necessary.
1443 if (CheckTemplateArgument(Param
, Arg
,
1445 FunctionTemplate
->getLocation(),
1446 FunctionTemplate
->getSourceRange().getEnd(),
1448 Deduced
[I
].wasDeducedFromArrayBound()
1449 ? CTAK_DeducedFromArrayBound
1451 Info
.Param
= makeTemplateParameter(
1452 const_cast<NamedDecl
*>(TemplateParams
->getParam(I
)));
1453 // FIXME: These template arguments are temporary. Free them!
1454 Info
.reset(TemplateArgumentList::CreateCopy(Context
, Builder
.data(),
1456 return TDK_SubstitutionFailure
;
1462 // Substitute into the default template argument, if available.
1463 TemplateArgumentLoc DefArg
1464 = SubstDefaultTemplateArgumentIfAvailable(FunctionTemplate
,
1465 FunctionTemplate
->getLocation(),
1466 FunctionTemplate
->getSourceRange().getEnd(),
1470 // If there was no default argument, deduction is incomplete.
1471 if (DefArg
.getArgument().isNull()) {
1472 Info
.Param
= makeTemplateParameter(
1473 const_cast<NamedDecl
*>(TemplateParams
->getParam(I
)));
1474 return TDK_Incomplete
;
1477 // Check whether we can actually use the default argument.
1478 if (CheckTemplateArgument(Param
, DefArg
,
1480 FunctionTemplate
->getLocation(),
1481 FunctionTemplate
->getSourceRange().getEnd(),
1484 Info
.Param
= makeTemplateParameter(
1485 const_cast<NamedDecl
*>(TemplateParams
->getParam(I
)));
1486 // FIXME: These template arguments are temporary. Free them!
1487 Info
.reset(TemplateArgumentList::CreateCopy(Context
, Builder
.data(),
1489 return TDK_SubstitutionFailure
;
1492 // If we get here, we successfully used the default template argument.
1495 // Form the template argument list from the deduced template arguments.
1496 TemplateArgumentList
*DeducedArgumentList
1497 = TemplateArgumentList::CreateCopy(Context
, Builder
.data(), Builder
.size());
1498 Info
.reset(DeducedArgumentList
);
1500 // Substitute the deduced template arguments into the function template
1501 // declaration to produce the function template specialization.
1502 DeclContext
*Owner
= FunctionTemplate
->getDeclContext();
1503 if (FunctionTemplate
->getFriendObjectKind())
1504 Owner
= FunctionTemplate
->getLexicalDeclContext();
1505 Specialization
= cast_or_null
<FunctionDecl
>(
1506 SubstDecl(FunctionTemplate
->getTemplatedDecl(), Owner
,
1507 MultiLevelTemplateArgumentList(*DeducedArgumentList
)));
1508 if (!Specialization
)
1509 return TDK_SubstitutionFailure
;
1511 assert(Specialization
->getPrimaryTemplate()->getCanonicalDecl() ==
1512 FunctionTemplate
->getCanonicalDecl());
1514 // If the template argument list is owned by the function template
1515 // specialization, release it.
1516 if (Specialization
->getTemplateSpecializationArgs() == DeducedArgumentList
&&
1517 !Trap
.hasErrorOccurred())
1520 // There may have been an error that did not prevent us from constructing a
1521 // declaration. Mark the declaration invalid and return with a substitution
1523 if (Trap
.hasErrorOccurred()) {
1524 Specialization
->setInvalidDecl(true);
1525 return TDK_SubstitutionFailure
;
1528 // If we suppressed any diagnostics while performing template argument
1529 // deduction, and if we haven't already instantiated this declaration,
1530 // keep track of these diagnostics. They'll be emitted if this specialization
1531 // is actually used.
1532 if (Info
.diag_begin() != Info
.diag_end()) {
1533 llvm::DenseMap
<Decl
*, llvm::SmallVector
<PartialDiagnosticAt
, 1> >::iterator
1534 Pos
= SuppressedDiagnostics
.find(Specialization
->getCanonicalDecl());
1535 if (Pos
== SuppressedDiagnostics
.end())
1536 SuppressedDiagnostics
[Specialization
->getCanonicalDecl()]
1537 .append(Info
.diag_begin(), Info
.diag_end());
1543 /// Gets the type of a function for template-argument-deducton
1544 /// purposes when it's considered as part of an overload set.
1545 static QualType
GetTypeOfFunction(ASTContext
&Context
,
1546 const OverloadExpr::FindResult
&R
,
1548 if (CXXMethodDecl
*Method
= dyn_cast
<CXXMethodDecl
>(Fn
))
1549 if (Method
->isInstance()) {
1550 // An instance method that's referenced in a form that doesn't
1551 // look like a member pointer is just invalid.
1552 if (!R
.HasFormOfMemberPointer
) return QualType();
1554 return Context
.getMemberPointerType(Fn
->getType(),
1555 Context
.getTypeDeclType(Method
->getParent()).getTypePtr());
1558 if (!R
.IsAddressOfOperand
) return Fn
->getType();
1559 return Context
.getPointerType(Fn
->getType());
1562 /// Apply the deduction rules for overload sets.
1564 /// \return the null type if this argument should be treated as an
1565 /// undeduced context
1567 ResolveOverloadForDeduction(Sema
&S
, TemplateParameterList
*TemplateParams
,
1568 Expr
*Arg
, QualType ParamType
,
1569 bool ParamWasReference
) {
1571 OverloadExpr::FindResult R
= OverloadExpr::find(Arg
);
1573 OverloadExpr
*Ovl
= R
.Expression
;
1575 // C++0x [temp.deduct.call]p4
1577 if (ParamWasReference
)
1578 TDF
|= TDF_ParamWithReferenceType
;
1579 if (R
.IsAddressOfOperand
)
1580 TDF
|= TDF_IgnoreQualifiers
;
1582 // If there were explicit template arguments, we can only find
1583 // something via C++ [temp.arg.explicit]p3, i.e. if the arguments
1584 // unambiguously name a full specialization.
1585 if (Ovl
->hasExplicitTemplateArgs()) {
1586 // But we can still look for an explicit specialization.
1587 if (FunctionDecl
*ExplicitSpec
1588 = S
.ResolveSingleFunctionTemplateSpecialization(Ovl
))
1589 return GetTypeOfFunction(S
.Context
, R
, ExplicitSpec
);
1593 // C++0x [temp.deduct.call]p6:
1594 // When P is a function type, pointer to function type, or pointer
1595 // to member function type:
1597 if (!ParamType
->isFunctionType() &&
1598 !ParamType
->isFunctionPointerType() &&
1599 !ParamType
->isMemberFunctionPointerType())
1603 for (UnresolvedSetIterator I
= Ovl
->decls_begin(),
1604 E
= Ovl
->decls_end(); I
!= E
; ++I
) {
1605 NamedDecl
*D
= (*I
)->getUnderlyingDecl();
1607 // - If the argument is an overload set containing one or more
1608 // function templates, the parameter is treated as a
1609 // non-deduced context.
1610 if (isa
<FunctionTemplateDecl
>(D
))
1613 FunctionDecl
*Fn
= cast
<FunctionDecl
>(D
);
1614 QualType ArgType
= GetTypeOfFunction(S
.Context
, R
, Fn
);
1615 if (ArgType
.isNull()) continue;
1617 // Function-to-pointer conversion.
1618 if (!ParamWasReference
&& ParamType
->isPointerType() &&
1619 ArgType
->isFunctionType())
1620 ArgType
= S
.Context
.getPointerType(ArgType
);
1622 // - If the argument is an overload set (not containing function
1623 // templates), trial argument deduction is attempted using each
1624 // of the members of the set. If deduction succeeds for only one
1625 // of the overload set members, that member is used as the
1626 // argument value for the deduction. If deduction succeeds for
1627 // more than one member of the overload set the parameter is
1628 // treated as a non-deduced context.
1630 // We do all of this in a fresh context per C++0x [temp.deduct.type]p2:
1631 // Type deduction is done independently for each P/A pair, and
1632 // the deduced template argument values are then combined.
1633 // So we do not reject deductions which were made elsewhere.
1634 llvm::SmallVector
<DeducedTemplateArgument
, 8>
1635 Deduced(TemplateParams
->size());
1636 TemplateDeductionInfo
Info(S
.Context
, Ovl
->getNameLoc());
1637 Sema::TemplateDeductionResult Result
1638 = DeduceTemplateArguments(S
, TemplateParams
,
1640 Info
, Deduced
, TDF
);
1641 if (Result
) continue;
1642 if (!Match
.isNull()) return QualType();
1649 /// \brief Perform template argument deduction from a function call
1650 /// (C++ [temp.deduct.call]).
1652 /// \param FunctionTemplate the function template for which we are performing
1653 /// template argument deduction.
1655 /// \param ExplicitTemplateArguments the explicit template arguments provided
1658 /// \param Args the function call arguments
1660 /// \param NumArgs the number of arguments in Args
1662 /// \param Name the name of the function being called. This is only significant
1663 /// when the function template is a conversion function template, in which
1664 /// case this routine will also perform template argument deduction based on
1665 /// the function to which
1667 /// \param Specialization if template argument deduction was successful,
1668 /// this will be set to the function template specialization produced by
1669 /// template argument deduction.
1671 /// \param Info the argument will be updated to provide additional information
1672 /// about template argument deduction.
1674 /// \returns the result of template argument deduction.
1675 Sema::TemplateDeductionResult
1676 Sema::DeduceTemplateArguments(FunctionTemplateDecl
*FunctionTemplate
,
1677 const TemplateArgumentListInfo
*ExplicitTemplateArgs
,
1678 Expr
**Args
, unsigned NumArgs
,
1679 FunctionDecl
*&Specialization
,
1680 TemplateDeductionInfo
&Info
) {
1681 FunctionDecl
*Function
= FunctionTemplate
->getTemplatedDecl();
1683 // C++ [temp.deduct.call]p1:
1684 // Template argument deduction is done by comparing each function template
1685 // parameter type (call it P) with the type of the corresponding argument
1686 // of the call (call it A) as described below.
1687 unsigned CheckArgs
= NumArgs
;
1688 if (NumArgs
< Function
->getMinRequiredArguments())
1689 return TDK_TooFewArguments
;
1690 else if (NumArgs
> Function
->getNumParams()) {
1691 const FunctionProtoType
*Proto
1692 = Function
->getType()->getAs
<FunctionProtoType
>();
1693 if (!Proto
->isVariadic())
1694 return TDK_TooManyArguments
;
1696 CheckArgs
= Function
->getNumParams();
1699 // The types of the parameters from which we will perform template argument
1701 LocalInstantiationScope
InstScope(*this);
1702 TemplateParameterList
*TemplateParams
1703 = FunctionTemplate
->getTemplateParameters();
1704 llvm::SmallVector
<DeducedTemplateArgument
, 4> Deduced
;
1705 llvm::SmallVector
<QualType
, 4> ParamTypes
;
1706 unsigned NumExplicitlySpecified
= 0;
1707 if (ExplicitTemplateArgs
) {
1708 TemplateDeductionResult Result
=
1709 SubstituteExplicitTemplateArguments(FunctionTemplate
,
1710 *ExplicitTemplateArgs
,
1718 NumExplicitlySpecified
= Deduced
.size();
1720 // Just fill in the parameter types from the function declaration.
1721 for (unsigned I
= 0; I
!= CheckArgs
; ++I
)
1722 ParamTypes
.push_back(Function
->getParamDecl(I
)->getType());
1725 // Deduce template arguments from the function parameters.
1726 Deduced
.resize(TemplateParams
->size());
1727 for (unsigned I
= 0; I
!= CheckArgs
; ++I
) {
1728 QualType ParamType
= ParamTypes
[I
];
1729 QualType ArgType
= Args
[I
]->getType();
1731 // C++0x [temp.deduct.call]p3:
1732 // If P is a cv-qualified type, the top level cv-qualifiers of P’s type
1733 // are ignored for type deduction.
1734 if (ParamType
.getCVRQualifiers())
1735 ParamType
= ParamType
.getLocalUnqualifiedType();
1736 const ReferenceType
*ParamRefType
= ParamType
->getAs
<ReferenceType
>();
1738 // [...] If P is a reference type, the type referred to by P is used
1739 // for type deduction.
1740 ParamType
= ParamRefType
->getPointeeType();
1743 // Overload sets usually make this parameter an undeduced
1744 // context, but there are sometimes special circumstances.
1745 if (ArgType
== Context
.OverloadTy
) {
1746 ArgType
= ResolveOverloadForDeduction(*this, TemplateParams
,
1749 if (ArgType
.isNull())
1754 // C++0x [temp.deduct.call]p3:
1755 // [...] If P is of the form T&&, where T is a template parameter, and
1756 // the argument is an lvalue, the type A& is used in place of A for
1758 if (ParamRefType
->isRValueReferenceType() &&
1759 ParamRefType
->getAs
<TemplateTypeParmType
>() &&
1760 Args
[I
]->isLvalue(Context
) == Expr::LV_Valid
)
1761 ArgType
= Context
.getLValueReferenceType(ArgType
);
1763 // C++ [temp.deduct.call]p2:
1764 // If P is not a reference type:
1765 // - If A is an array type, the pointer type produced by the
1766 // array-to-pointer standard conversion (4.2) is used in place of
1767 // A for type deduction; otherwise,
1768 if (ArgType
->isArrayType())
1769 ArgType
= Context
.getArrayDecayedType(ArgType
);
1770 // - If A is a function type, the pointer type produced by the
1771 // function-to-pointer standard conversion (4.3) is used in place
1772 // of A for type deduction; otherwise,
1773 else if (ArgType
->isFunctionType())
1774 ArgType
= Context
.getPointerType(ArgType
);
1776 // - If A is a cv-qualified type, the top level cv-qualifiers of A’s
1777 // type are ignored for type deduction.
1778 QualType CanonArgType
= Context
.getCanonicalType(ArgType
);
1779 if (ArgType
.getCVRQualifiers())
1780 ArgType
= ArgType
.getUnqualifiedType();
1784 // C++0x [temp.deduct.call]p4:
1785 // In general, the deduction process attempts to find template argument
1786 // values that will make the deduced A identical to A (after the type A
1787 // is transformed as described above). [...]
1788 unsigned TDF
= TDF_SkipNonDependent
;
1790 // - If the original P is a reference type, the deduced A (i.e., the
1791 // type referred to by the reference) can be more cv-qualified than
1792 // the transformed A.
1794 TDF
|= TDF_ParamWithReferenceType
;
1795 // - The transformed A can be another pointer or pointer to member
1796 // type that can be converted to the deduced A via a qualification
1797 // conversion (4.4).
1798 if (ArgType
->isPointerType() || ArgType
->isMemberPointerType() ||
1799 ArgType
->isObjCObjectPointerType())
1800 TDF
|= TDF_IgnoreQualifiers
;
1801 // - If P is a class and P has the form simple-template-id, then the
1802 // transformed A can be a derived class of the deduced A. Likewise,
1803 // if P is a pointer to a class of the form simple-template-id, the
1804 // transformed A can be a pointer to a derived class pointed to by
1806 if (isSimpleTemplateIdType(ParamType
) ||
1807 (isa
<PointerType
>(ParamType
) &&
1808 isSimpleTemplateIdType(
1809 ParamType
->getAs
<PointerType
>()->getPointeeType())))
1810 TDF
|= TDF_DerivedClass
;
1812 if (TemplateDeductionResult Result
1813 = ::DeduceTemplateArguments(*this, TemplateParams
,
1814 ParamType
, ArgType
, Info
, Deduced
,
1818 // FIXME: we need to check that the deduced A is the same as A,
1819 // modulo the various allowed differences.
1822 return FinishTemplateArgumentDeduction(FunctionTemplate
, Deduced
,
1823 NumExplicitlySpecified
,
1824 Specialization
, Info
);
1827 /// \brief Deduce template arguments when taking the address of a function
1828 /// template (C++ [temp.deduct.funcaddr]) or matching a specialization to
1831 /// \param FunctionTemplate the function template for which we are performing
1832 /// template argument deduction.
1834 /// \param ExplicitTemplateArguments the explicitly-specified template
1837 /// \param ArgFunctionType the function type that will be used as the
1838 /// "argument" type (A) when performing template argument deduction from the
1839 /// function template's function type. This type may be NULL, if there is no
1840 /// argument type to compare against, in C++0x [temp.arg.explicit]p3.
1842 /// \param Specialization if template argument deduction was successful,
1843 /// this will be set to the function template specialization produced by
1844 /// template argument deduction.
1846 /// \param Info the argument will be updated to provide additional information
1847 /// about template argument deduction.
1849 /// \returns the result of template argument deduction.
1850 Sema::TemplateDeductionResult
1851 Sema::DeduceTemplateArguments(FunctionTemplateDecl
*FunctionTemplate
,
1852 const TemplateArgumentListInfo
*ExplicitTemplateArgs
,
1853 QualType ArgFunctionType
,
1854 FunctionDecl
*&Specialization
,
1855 TemplateDeductionInfo
&Info
) {
1856 FunctionDecl
*Function
= FunctionTemplate
->getTemplatedDecl();
1857 TemplateParameterList
*TemplateParams
1858 = FunctionTemplate
->getTemplateParameters();
1859 QualType FunctionType
= Function
->getType();
1861 // Substitute any explicit template arguments.
1862 LocalInstantiationScope
InstScope(*this);
1863 llvm::SmallVector
<DeducedTemplateArgument
, 4> Deduced
;
1864 unsigned NumExplicitlySpecified
= 0;
1865 llvm::SmallVector
<QualType
, 4> ParamTypes
;
1866 if (ExplicitTemplateArgs
) {
1867 if (TemplateDeductionResult Result
1868 = SubstituteExplicitTemplateArguments(FunctionTemplate
,
1869 *ExplicitTemplateArgs
,
1870 Deduced
, ParamTypes
,
1871 &FunctionType
, Info
))
1874 NumExplicitlySpecified
= Deduced
.size();
1877 // Template argument deduction for function templates in a SFINAE context.
1878 // Trap any errors that might occur.
1879 SFINAETrap
Trap(*this);
1881 Deduced
.resize(TemplateParams
->size());
1883 if (!ArgFunctionType
.isNull()) {
1884 // Deduce template arguments from the function type.
1885 if (TemplateDeductionResult Result
1886 = ::DeduceTemplateArguments(*this, TemplateParams
,
1887 FunctionType
, ArgFunctionType
, Info
,
1892 if (TemplateDeductionResult Result
1893 = FinishTemplateArgumentDeduction(FunctionTemplate
, Deduced
,
1894 NumExplicitlySpecified
,
1895 Specialization
, Info
))
1898 // If the requested function type does not match the actual type of the
1899 // specialization, template argument deduction fails.
1900 if (!ArgFunctionType
.isNull() &&
1901 !Context
.hasSameType(ArgFunctionType
, Specialization
->getType()))
1902 return TDK_NonDeducedMismatch
;
1907 /// \brief Deduce template arguments for a templated conversion
1908 /// function (C++ [temp.deduct.conv]) and, if successful, produce a
1909 /// conversion function template specialization.
1910 Sema::TemplateDeductionResult
1911 Sema::DeduceTemplateArguments(FunctionTemplateDecl
*FunctionTemplate
,
1913 CXXConversionDecl
*&Specialization
,
1914 TemplateDeductionInfo
&Info
) {
1915 CXXConversionDecl
*Conv
1916 = cast
<CXXConversionDecl
>(FunctionTemplate
->getTemplatedDecl());
1917 QualType FromType
= Conv
->getConversionType();
1919 // Canonicalize the types for deduction.
1920 QualType P
= Context
.getCanonicalType(FromType
);
1921 QualType A
= Context
.getCanonicalType(ToType
);
1923 // C++0x [temp.deduct.conv]p3:
1924 // If P is a reference type, the type referred to by P is used for
1926 if (const ReferenceType
*PRef
= P
->getAs
<ReferenceType
>())
1927 P
= PRef
->getPointeeType();
1929 // C++0x [temp.deduct.conv]p3:
1930 // If A is a reference type, the type referred to by A is used
1931 // for type deduction.
1932 if (const ReferenceType
*ARef
= A
->getAs
<ReferenceType
>())
1933 A
= ARef
->getPointeeType();
1934 // C++ [temp.deduct.conv]p2:
1936 // If A is not a reference type:
1938 assert(!A
->isReferenceType() && "Reference types were handled above");
1940 // - If P is an array type, the pointer type produced by the
1941 // array-to-pointer standard conversion (4.2) is used in place
1942 // of P for type deduction; otherwise,
1943 if (P
->isArrayType())
1944 P
= Context
.getArrayDecayedType(P
);
1945 // - If P is a function type, the pointer type produced by the
1946 // function-to-pointer standard conversion (4.3) is used in
1947 // place of P for type deduction; otherwise,
1948 else if (P
->isFunctionType())
1949 P
= Context
.getPointerType(P
);
1950 // - If P is a cv-qualified type, the top level cv-qualifiers of
1951 // P’s type are ignored for type deduction.
1953 P
= P
.getUnqualifiedType();
1955 // C++0x [temp.deduct.conv]p3:
1956 // If A is a cv-qualified type, the top level cv-qualifiers of A’s
1957 // type are ignored for type deduction.
1958 A
= A
.getUnqualifiedType();
1961 // Template argument deduction for function templates in a SFINAE context.
1962 // Trap any errors that might occur.
1963 SFINAETrap
Trap(*this);
1965 // C++ [temp.deduct.conv]p1:
1966 // Template argument deduction is done by comparing the return
1967 // type of the template conversion function (call it P) with the
1968 // type that is required as the result of the conversion (call it
1969 // A) as described in 14.8.2.4.
1970 TemplateParameterList
*TemplateParams
1971 = FunctionTemplate
->getTemplateParameters();
1972 llvm::SmallVector
<DeducedTemplateArgument
, 4> Deduced
;
1973 Deduced
.resize(TemplateParams
->size());
1975 // C++0x [temp.deduct.conv]p4:
1976 // In general, the deduction process attempts to find template
1977 // argument values that will make the deduced A identical to
1978 // A. However, there are two cases that allow a difference:
1980 // - If the original A is a reference type, A can be more
1981 // cv-qualified than the deduced A (i.e., the type referred to
1982 // by the reference)
1983 if (ToType
->isReferenceType())
1984 TDF
|= TDF_ParamWithReferenceType
;
1985 // - The deduced A can be another pointer or pointer to member
1986 // type that can be converted to A via a qualification
1989 // (C++0x [temp.deduct.conv]p6 clarifies that this only happens when
1990 // both P and A are pointers or member pointers. In this case, we
1991 // just ignore cv-qualifiers completely).
1992 if ((P
->isPointerType() && A
->isPointerType()) ||
1993 (P
->isMemberPointerType() && P
->isMemberPointerType()))
1994 TDF
|= TDF_IgnoreQualifiers
;
1995 if (TemplateDeductionResult Result
1996 = ::DeduceTemplateArguments(*this, TemplateParams
,
1997 P
, A
, Info
, Deduced
, TDF
))
2000 // FIXME: we need to check that the deduced A is the same as A,
2001 // modulo the various allowed differences.
2003 // Finish template argument deduction.
2004 LocalInstantiationScope
InstScope(*this);
2005 FunctionDecl
*Spec
= 0;
2006 TemplateDeductionResult Result
2007 = FinishTemplateArgumentDeduction(FunctionTemplate
, Deduced
, 0, Spec
,
2009 Specialization
= cast_or_null
<CXXConversionDecl
>(Spec
);
2013 /// \brief Deduce template arguments for a function template when there is
2014 /// nothing to deduce against (C++0x [temp.arg.explicit]p3).
2016 /// \param FunctionTemplate the function template for which we are performing
2017 /// template argument deduction.
2019 /// \param ExplicitTemplateArguments the explicitly-specified template
2022 /// \param Specialization if template argument deduction was successful,
2023 /// this will be set to the function template specialization produced by
2024 /// template argument deduction.
2026 /// \param Info the argument will be updated to provide additional information
2027 /// about template argument deduction.
2029 /// \returns the result of template argument deduction.
2030 Sema::TemplateDeductionResult
2031 Sema::DeduceTemplateArguments(FunctionTemplateDecl
*FunctionTemplate
,
2032 const TemplateArgumentListInfo
*ExplicitTemplateArgs
,
2033 FunctionDecl
*&Specialization
,
2034 TemplateDeductionInfo
&Info
) {
2035 return DeduceTemplateArguments(FunctionTemplate
, ExplicitTemplateArgs
,
2036 QualType(), Specialization
, Info
);
2039 /// \brief Stores the result of comparing the qualifiers of two types.
2040 enum DeductionQualifierComparison
{
2041 NeitherMoreQualified
= 0,
2046 /// \brief Deduce the template arguments during partial ordering by comparing
2047 /// the parameter type and the argument type (C++0x [temp.deduct.partial]).
2049 /// \param S the semantic analysis object within which we are deducing
2051 /// \param TemplateParams the template parameters that we are deducing
2053 /// \param ParamIn the parameter type
2055 /// \param ArgIn the argument type
2057 /// \param Info information about the template argument deduction itself
2059 /// \param Deduced the deduced template arguments
2061 /// \returns the result of template argument deduction so far. Note that a
2062 /// "success" result means that template argument deduction has not yet failed,
2063 /// but it may still fail, later, for other reasons.
2064 static Sema::TemplateDeductionResult
2065 DeduceTemplateArgumentsDuringPartialOrdering(Sema
&S
,
2066 TemplateParameterList
*TemplateParams
,
2067 QualType ParamIn
, QualType ArgIn
,
2068 TemplateDeductionInfo
&Info
,
2069 llvm::SmallVectorImpl
<DeducedTemplateArgument
> &Deduced
,
2070 llvm::SmallVectorImpl
<DeductionQualifierComparison
> *QualifierComparisons
) {
2071 CanQualType Param
= S
.Context
.getCanonicalType(ParamIn
);
2072 CanQualType Arg
= S
.Context
.getCanonicalType(ArgIn
);
2074 // C++0x [temp.deduct.partial]p5:
2075 // Before the partial ordering is done, certain transformations are
2076 // performed on the types used for partial ordering:
2077 // - If P is a reference type, P is replaced by the type referred to.
2078 CanQual
<ReferenceType
> ParamRef
= Param
->getAs
<ReferenceType
>();
2079 if (!ParamRef
.isNull())
2080 Param
= ParamRef
->getPointeeType();
2082 // - If A is a reference type, A is replaced by the type referred to.
2083 CanQual
<ReferenceType
> ArgRef
= Arg
->getAs
<ReferenceType
>();
2084 if (!ArgRef
.isNull())
2085 Arg
= ArgRef
->getPointeeType();
2087 if (QualifierComparisons
&& !ParamRef
.isNull() && !ArgRef
.isNull()) {
2088 // C++0x [temp.deduct.partial]p6:
2089 // If both P and A were reference types (before being replaced with the
2090 // type referred to above), determine which of the two types (if any) is
2091 // more cv-qualified than the other; otherwise the types are considered to
2092 // be equally cv-qualified for partial ordering purposes. The result of this
2093 // determination will be used below.
2095 // We save this information for later, using it only when deduction
2096 // succeeds in both directions.
2097 DeductionQualifierComparison QualifierResult
= NeitherMoreQualified
;
2098 if (Param
.isMoreQualifiedThan(Arg
))
2099 QualifierResult
= ParamMoreQualified
;
2100 else if (Arg
.isMoreQualifiedThan(Param
))
2101 QualifierResult
= ArgMoreQualified
;
2102 QualifierComparisons
->push_back(QualifierResult
);
2105 // C++0x [temp.deduct.partial]p7:
2106 // Remove any top-level cv-qualifiers:
2107 // - If P is a cv-qualified type, P is replaced by the cv-unqualified
2109 Param
= Param
.getUnqualifiedType();
2110 // - If A is a cv-qualified type, A is replaced by the cv-unqualified
2112 Arg
= Arg
.getUnqualifiedType();
2114 // C++0x [temp.deduct.partial]p8:
2115 // Using the resulting types P and A the deduction is then done as
2116 // described in 14.9.2.5. If deduction succeeds for a given type, the type
2117 // from the argument template is considered to be at least as specialized
2118 // as the type from the parameter template.
2119 return DeduceTemplateArguments(S
, TemplateParams
, Param
, Arg
, Info
,
2124 MarkUsedTemplateParameters(Sema
&SemaRef
, QualType T
,
2127 llvm::SmallVectorImpl
<bool> &Deduced
);
2129 /// \brief If this is a non-static member function,
2130 static void MaybeAddImplicitObjectParameterType(ASTContext
&Context
,
2131 CXXMethodDecl
*Method
,
2132 llvm::SmallVectorImpl
<QualType
> &ArgTypes
) {
2133 if (Method
->isStatic())
2136 // C++ [over.match.funcs]p4:
2138 // For non-static member functions, the type of the implicit
2139 // object parameter is
2140 // — "lvalue reference to cv X" for functions declared without a
2141 // ref-qualifier or with the & ref-qualifier
2142 // - "rvalue reference to cv X" for functions declared with the
2145 // FIXME: We don't have ref-qualifiers yet, so we don't do that part.
2146 QualType ArgTy
= Context
.getTypeDeclType(Method
->getParent());
2147 ArgTy
= Context
.getQualifiedType(ArgTy
,
2148 Qualifiers::fromCVRMask(Method
->getTypeQualifiers()));
2149 ArgTy
= Context
.getLValueReferenceType(ArgTy
);
2150 ArgTypes
.push_back(ArgTy
);
2153 /// \brief Determine whether the function template \p FT1 is at least as
2154 /// specialized as \p FT2.
2155 static bool isAtLeastAsSpecializedAs(Sema
&S
,
2157 FunctionTemplateDecl
*FT1
,
2158 FunctionTemplateDecl
*FT2
,
2159 TemplatePartialOrderingContext TPOC
,
2160 llvm::SmallVectorImpl
<DeductionQualifierComparison
> *QualifierComparisons
) {
2161 FunctionDecl
*FD1
= FT1
->getTemplatedDecl();
2162 FunctionDecl
*FD2
= FT2
->getTemplatedDecl();
2163 const FunctionProtoType
*Proto1
= FD1
->getType()->getAs
<FunctionProtoType
>();
2164 const FunctionProtoType
*Proto2
= FD2
->getType()->getAs
<FunctionProtoType
>();
2166 assert(Proto1
&& Proto2
&& "Function templates must have prototypes");
2167 TemplateParameterList
*TemplateParams
= FT2
->getTemplateParameters();
2168 llvm::SmallVector
<DeducedTemplateArgument
, 4> Deduced
;
2169 Deduced
.resize(TemplateParams
->size());
2171 // C++0x [temp.deduct.partial]p3:
2172 // The types used to determine the ordering depend on the context in which
2173 // the partial ordering is done:
2174 TemplateDeductionInfo
Info(S
.Context
, Loc
);
2175 CXXMethodDecl
*Method1
= 0;
2176 CXXMethodDecl
*Method2
= 0;
2177 bool IsNonStatic2
= false;
2178 bool IsNonStatic1
= false;
2182 // - In the context of a function call, the function parameter types are
2184 Method1
= dyn_cast
<CXXMethodDecl
>(FD1
);
2185 Method2
= dyn_cast
<CXXMethodDecl
>(FD2
);
2186 IsNonStatic1
= Method1
&& !Method1
->isStatic();
2187 IsNonStatic2
= Method2
&& !Method2
->isStatic();
2189 // C++0x [temp.func.order]p3:
2190 // [...] If only one of the function templates is a non-static
2191 // member, that function template is considered to have a new
2192 // first parameter inserted in its function parameter list. The
2193 // new parameter is of type "reference to cv A," where cv are
2194 // the cv-qualifiers of the function template (if any) and A is
2195 // the class of which the function template is a member.
2197 // C++98/03 doesn't have this provision, so instead we drop the
2198 // first argument of the free function or static member, which
2199 // seems to match existing practice.
2200 llvm::SmallVector
<QualType
, 4> Args1
;
2201 unsigned Skip1
= !S
.getLangOptions().CPlusPlus0x
&&
2202 IsNonStatic2
&& !IsNonStatic1
;
2203 if (S
.getLangOptions().CPlusPlus0x
&& IsNonStatic1
&& !IsNonStatic2
)
2204 MaybeAddImplicitObjectParameterType(S
.Context
, Method1
, Args1
);
2205 Args1
.insert(Args1
.end(),
2206 Proto1
->arg_type_begin() + Skip1
, Proto1
->arg_type_end());
2208 llvm::SmallVector
<QualType
, 4> Args2
;
2209 Skip2
= !S
.getLangOptions().CPlusPlus0x
&&
2210 IsNonStatic1
&& !IsNonStatic2
;
2211 if (S
.getLangOptions().CPlusPlus0x
&& IsNonStatic2
&& !IsNonStatic1
)
2212 MaybeAddImplicitObjectParameterType(S
.Context
, Method2
, Args2
);
2213 Args2
.insert(Args2
.end(),
2214 Proto2
->arg_type_begin() + Skip2
, Proto2
->arg_type_end());
2216 unsigned NumParams
= std::min(Args1
.size(), Args2
.size());
2217 for (unsigned I
= 0; I
!= NumParams
; ++I
)
2218 if (DeduceTemplateArgumentsDuringPartialOrdering(S
,
2224 QualifierComparisons
))
2230 case TPOC_Conversion
:
2231 // - In the context of a call to a conversion operator, the return types
2232 // of the conversion function templates are used.
2233 if (DeduceTemplateArgumentsDuringPartialOrdering(S
,
2235 Proto2
->getResultType(),
2236 Proto1
->getResultType(),
2239 QualifierComparisons
))
2244 // - In other contexts (14.6.6.2) the function template’s function type
2246 if (DeduceTemplateArgumentsDuringPartialOrdering(S
,
2252 QualifierComparisons
))
2257 // C++0x [temp.deduct.partial]p11:
2258 // In most cases, all template parameters must have values in order for
2259 // deduction to succeed, but for partial ordering purposes a template
2260 // parameter may remain without a value provided it is not used in the
2261 // types being used for partial ordering. [ Note: a template parameter used
2262 // in a non-deduced context is considered used. -end note]
2263 unsigned ArgIdx
= 0, NumArgs
= Deduced
.size();
2264 for (; ArgIdx
!= NumArgs
; ++ArgIdx
)
2265 if (Deduced
[ArgIdx
].isNull())
2268 if (ArgIdx
== NumArgs
) {
2269 // All template arguments were deduced. FT1 is at least as specialized
2274 // Figure out which template parameters were used.
2275 llvm::SmallVector
<bool, 4> UsedParameters
;
2276 UsedParameters
.resize(TemplateParams
->size());
2279 unsigned NumParams
= std::min(Proto1
->getNumArgs(), Proto2
->getNumArgs());
2280 if (S
.getLangOptions().CPlusPlus0x
&& IsNonStatic2
&& !IsNonStatic1
)
2281 ::MarkUsedTemplateParameters(S
, Method2
->getThisType(S
.Context
), false,
2282 TemplateParams
->getDepth(), UsedParameters
);
2283 for (unsigned I
= Skip2
; I
< NumParams
; ++I
)
2284 ::MarkUsedTemplateParameters(S
, Proto2
->getArgType(I
), false,
2285 TemplateParams
->getDepth(),
2290 case TPOC_Conversion
:
2291 ::MarkUsedTemplateParameters(S
, Proto2
->getResultType(), false,
2292 TemplateParams
->getDepth(),
2297 ::MarkUsedTemplateParameters(S
, FD2
->getType(), false,
2298 TemplateParams
->getDepth(),
2303 for (; ArgIdx
!= NumArgs
; ++ArgIdx
)
2304 // If this argument had no value deduced but was used in one of the types
2305 // used for partial ordering, then deduction fails.
2306 if (Deduced
[ArgIdx
].isNull() && UsedParameters
[ArgIdx
])
2313 /// \brief Returns the more specialized function template according
2314 /// to the rules of function template partial ordering (C++ [temp.func.order]).
2316 /// \param FT1 the first function template
2318 /// \param FT2 the second function template
2320 /// \param TPOC the context in which we are performing partial ordering of
2321 /// function templates.
2323 /// \returns the more specialized function template. If neither
2324 /// template is more specialized, returns NULL.
2325 FunctionTemplateDecl
*
2326 Sema::getMoreSpecializedTemplate(FunctionTemplateDecl
*FT1
,
2327 FunctionTemplateDecl
*FT2
,
2329 TemplatePartialOrderingContext TPOC
) {
2330 llvm::SmallVector
<DeductionQualifierComparison
, 4> QualifierComparisons
;
2331 bool Better1
= isAtLeastAsSpecializedAs(*this, Loc
, FT1
, FT2
, TPOC
, 0);
2332 bool Better2
= isAtLeastAsSpecializedAs(*this, Loc
, FT2
, FT1
, TPOC
,
2333 &QualifierComparisons
);
2335 if (Better1
!= Better2
) // We have a clear winner
2336 return Better1
? FT1
: FT2
;
2338 if (!Better1
&& !Better2
) // Neither is better than the other
2342 // C++0x [temp.deduct.partial]p10:
2343 // If for each type being considered a given template is at least as
2344 // specialized for all types and more specialized for some set of types and
2345 // the other template is not more specialized for any types or is not at
2346 // least as specialized for any types, then the given template is more
2347 // specialized than the other template. Otherwise, neither template is more
2348 // specialized than the other.
2351 for (unsigned I
= 0, N
= QualifierComparisons
.size(); I
!= N
; ++I
) {
2352 // C++0x [temp.deduct.partial]p9:
2353 // If, for a given type, deduction succeeds in both directions (i.e., the
2354 // types are identical after the transformations above) and if the type
2355 // from the argument template is more cv-qualified than the type from the
2356 // parameter template (as described above) that type is considered to be
2357 // more specialized than the other. If neither type is more cv-qualified
2358 // than the other then neither type is more specialized than the other.
2359 switch (QualifierComparisons
[I
]) {
2360 case NeitherMoreQualified
:
2363 case ParamMoreQualified
:
2369 case ArgMoreQualified
:
2377 assert(!(Better1
&& Better2
) && "Should have broken out in the loop above");
2386 /// \brief Determine if the two templates are equivalent.
2387 static bool isSameTemplate(TemplateDecl
*T1
, TemplateDecl
*T2
) {
2394 return T1
->getCanonicalDecl() == T2
->getCanonicalDecl();
2397 /// \brief Retrieve the most specialized of the given function template
2398 /// specializations.
2400 /// \param SpecBegin the start iterator of the function template
2401 /// specializations that we will be comparing.
2403 /// \param SpecEnd the end iterator of the function template
2404 /// specializations, paired with \p SpecBegin.
2406 /// \param TPOC the partial ordering context to use to compare the function
2407 /// template specializations.
2409 /// \param Loc the location where the ambiguity or no-specializations
2410 /// diagnostic should occur.
2412 /// \param NoneDiag partial diagnostic used to diagnose cases where there are
2413 /// no matching candidates.
2415 /// \param AmbigDiag partial diagnostic used to diagnose an ambiguity, if one
2418 /// \param CandidateDiag partial diagnostic used for each function template
2419 /// specialization that is a candidate in the ambiguous ordering. One parameter
2420 /// in this diagnostic should be unbound, which will correspond to the string
2421 /// describing the template arguments for the function template specialization.
2423 /// \param Index if non-NULL and the result of this function is non-nULL,
2424 /// receives the index corresponding to the resulting function template
2427 /// \returns the most specialized function template specialization, if
2428 /// found. Otherwise, returns SpecEnd.
2430 /// \todo FIXME: Consider passing in the "also-ran" candidates that failed
2431 /// template argument deduction.
2432 UnresolvedSetIterator
2433 Sema::getMostSpecialized(UnresolvedSetIterator SpecBegin
,
2434 UnresolvedSetIterator SpecEnd
,
2435 TemplatePartialOrderingContext TPOC
,
2437 const PartialDiagnostic
&NoneDiag
,
2438 const PartialDiagnostic
&AmbigDiag
,
2439 const PartialDiagnostic
&CandidateDiag
) {
2440 if (SpecBegin
== SpecEnd
) {
2441 Diag(Loc
, NoneDiag
);
2445 if (SpecBegin
+ 1 == SpecEnd
)
2448 // Find the function template that is better than all of the templates it
2449 // has been compared to.
2450 UnresolvedSetIterator Best
= SpecBegin
;
2451 FunctionTemplateDecl
*BestTemplate
2452 = cast
<FunctionDecl
>(*Best
)->getPrimaryTemplate();
2453 assert(BestTemplate
&& "Not a function template specialization?");
2454 for (UnresolvedSetIterator I
= SpecBegin
+ 1; I
!= SpecEnd
; ++I
) {
2455 FunctionTemplateDecl
*Challenger
2456 = cast
<FunctionDecl
>(*I
)->getPrimaryTemplate();
2457 assert(Challenger
&& "Not a function template specialization?");
2458 if (isSameTemplate(getMoreSpecializedTemplate(BestTemplate
, Challenger
,
2462 BestTemplate
= Challenger
;
2466 // Make sure that the "best" function template is more specialized than all
2468 bool Ambiguous
= false;
2469 for (UnresolvedSetIterator I
= SpecBegin
; I
!= SpecEnd
; ++I
) {
2470 FunctionTemplateDecl
*Challenger
2471 = cast
<FunctionDecl
>(*I
)->getPrimaryTemplate();
2473 !isSameTemplate(getMoreSpecializedTemplate(BestTemplate
, Challenger
,
2482 // We found an answer. Return it.
2486 // Diagnose the ambiguity.
2487 Diag(Loc
, AmbigDiag
);
2489 // FIXME: Can we order the candidates in some sane way?
2490 for (UnresolvedSetIterator I
= SpecBegin
; I
!= SpecEnd
; ++I
)
2491 Diag((*I
)->getLocation(), CandidateDiag
)
2492 << getTemplateArgumentBindingsText(
2493 cast
<FunctionDecl
>(*I
)->getPrimaryTemplate()->getTemplateParameters(),
2494 *cast
<FunctionDecl
>(*I
)->getTemplateSpecializationArgs());
2499 /// \brief Returns the more specialized class template partial specialization
2500 /// according to the rules of partial ordering of class template partial
2501 /// specializations (C++ [temp.class.order]).
2503 /// \param PS1 the first class template partial specialization
2505 /// \param PS2 the second class template partial specialization
2507 /// \returns the more specialized class template partial specialization. If
2508 /// neither partial specialization is more specialized, returns NULL.
2509 ClassTemplatePartialSpecializationDecl
*
2510 Sema::getMoreSpecializedPartialSpecialization(
2511 ClassTemplatePartialSpecializationDecl
*PS1
,
2512 ClassTemplatePartialSpecializationDecl
*PS2
,
2513 SourceLocation Loc
) {
2514 // C++ [temp.class.order]p1:
2515 // For two class template partial specializations, the first is at least as
2516 // specialized as the second if, given the following rewrite to two
2517 // function templates, the first function template is at least as
2518 // specialized as the second according to the ordering rules for function
2519 // templates (14.6.6.2):
2520 // - the first function template has the same template parameters as the
2521 // first partial specialization and has a single function parameter
2522 // whose type is a class template specialization with the template
2523 // arguments of the first partial specialization, and
2524 // - the second function template has the same template parameters as the
2525 // second partial specialization and has a single function parameter
2526 // whose type is a class template specialization with the template
2527 // arguments of the second partial specialization.
2529 // Rather than synthesize function templates, we merely perform the
2530 // equivalent partial ordering by performing deduction directly on
2531 // the template arguments of the class template partial
2532 // specializations. This computation is slightly simpler than the
2533 // general problem of function template partial ordering, because
2534 // class template partial specializations are more constrained. We
2535 // know that every template parameter is deducible from the class
2536 // template partial specialization's template arguments, for
2538 llvm::SmallVector
<DeducedTemplateArgument
, 4> Deduced
;
2539 TemplateDeductionInfo
Info(Context
, Loc
);
2541 QualType PT1
= PS1
->getInjectedSpecializationType();
2542 QualType PT2
= PS2
->getInjectedSpecializationType();
2544 // Determine whether PS1 is at least as specialized as PS2
2545 Deduced
.resize(PS2
->getTemplateParameters()->size());
2546 bool Better1
= !DeduceTemplateArgumentsDuringPartialOrdering(*this,
2547 PS2
->getTemplateParameters(),
2554 InstantiatingTemplate
Inst(*this, PS2
->getLocation(), PS2
,
2555 Deduced
.data(), Deduced
.size(), Info
);
2556 Better1
= !::FinishTemplateArgumentDeduction(*this, PS2
,
2557 PS1
->getTemplateArgs(),
2561 // Determine whether PS2 is at least as specialized as PS1
2563 Deduced
.resize(PS1
->getTemplateParameters()->size());
2564 bool Better2
= !DeduceTemplateArgumentsDuringPartialOrdering(*this,
2565 PS1
->getTemplateParameters(),
2572 InstantiatingTemplate
Inst(*this, PS1
->getLocation(), PS1
,
2573 Deduced
.data(), Deduced
.size(), Info
);
2574 Better2
= !::FinishTemplateArgumentDeduction(*this, PS1
,
2575 PS2
->getTemplateArgs(),
2579 if (Better1
== Better2
)
2582 return Better1
? PS1
: PS2
;
2586 MarkUsedTemplateParameters(Sema
&SemaRef
,
2587 const TemplateArgument
&TemplateArg
,
2590 llvm::SmallVectorImpl
<bool> &Used
);
2592 /// \brief Mark the template parameters that are used by the given
2595 MarkUsedTemplateParameters(Sema
&SemaRef
,
2599 llvm::SmallVectorImpl
<bool> &Used
) {
2600 // FIXME: if !OnlyDeduced, we have to walk the whole subexpression to
2601 // find other occurrences of template parameters.
2602 const DeclRefExpr
*DRE
= dyn_cast
<DeclRefExpr
>(E
);
2606 const NonTypeTemplateParmDecl
*NTTP
2607 = dyn_cast
<NonTypeTemplateParmDecl
>(DRE
->getDecl());
2611 if (NTTP
->getDepth() == Depth
)
2612 Used
[NTTP
->getIndex()] = true;
2615 /// \brief Mark the template parameters that are used by the given
2616 /// nested name specifier.
2618 MarkUsedTemplateParameters(Sema
&SemaRef
,
2619 NestedNameSpecifier
*NNS
,
2622 llvm::SmallVectorImpl
<bool> &Used
) {
2626 MarkUsedTemplateParameters(SemaRef
, NNS
->getPrefix(), OnlyDeduced
, Depth
,
2628 MarkUsedTemplateParameters(SemaRef
, QualType(NNS
->getAsType(), 0),
2629 OnlyDeduced
, Depth
, Used
);
2632 /// \brief Mark the template parameters that are used by the given
2635 MarkUsedTemplateParameters(Sema
&SemaRef
,
2639 llvm::SmallVectorImpl
<bool> &Used
) {
2640 if (TemplateDecl
*Template
= Name
.getAsTemplateDecl()) {
2641 if (TemplateTemplateParmDecl
*TTP
2642 = dyn_cast
<TemplateTemplateParmDecl
>(Template
)) {
2643 if (TTP
->getDepth() == Depth
)
2644 Used
[TTP
->getIndex()] = true;
2649 if (QualifiedTemplateName
*QTN
= Name
.getAsQualifiedTemplateName())
2650 MarkUsedTemplateParameters(SemaRef
, QTN
->getQualifier(), OnlyDeduced
,
2652 if (DependentTemplateName
*DTN
= Name
.getAsDependentTemplateName())
2653 MarkUsedTemplateParameters(SemaRef
, DTN
->getQualifier(), OnlyDeduced
,
2657 /// \brief Mark the template parameters that are used by the given
2660 MarkUsedTemplateParameters(Sema
&SemaRef
, QualType T
,
2663 llvm::SmallVectorImpl
<bool> &Used
) {
2667 // Non-dependent types have nothing deducible
2668 if (!T
->isDependentType())
2671 T
= SemaRef
.Context
.getCanonicalType(T
);
2672 switch (T
->getTypeClass()) {
2674 MarkUsedTemplateParameters(SemaRef
,
2675 cast
<PointerType
>(T
)->getPointeeType(),
2681 case Type::BlockPointer
:
2682 MarkUsedTemplateParameters(SemaRef
,
2683 cast
<BlockPointerType
>(T
)->getPointeeType(),
2689 case Type::LValueReference
:
2690 case Type::RValueReference
:
2691 MarkUsedTemplateParameters(SemaRef
,
2692 cast
<ReferenceType
>(T
)->getPointeeType(),
2698 case Type::MemberPointer
: {
2699 const MemberPointerType
*MemPtr
= cast
<MemberPointerType
>(T
.getTypePtr());
2700 MarkUsedTemplateParameters(SemaRef
, MemPtr
->getPointeeType(), OnlyDeduced
,
2702 MarkUsedTemplateParameters(SemaRef
, QualType(MemPtr
->getClass(), 0),
2703 OnlyDeduced
, Depth
, Used
);
2707 case Type::DependentSizedArray
:
2708 MarkUsedTemplateParameters(SemaRef
,
2709 cast
<DependentSizedArrayType
>(T
)->getSizeExpr(),
2710 OnlyDeduced
, Depth
, Used
);
2711 // Fall through to check the element type
2713 case Type::ConstantArray
:
2714 case Type::IncompleteArray
:
2715 MarkUsedTemplateParameters(SemaRef
,
2716 cast
<ArrayType
>(T
)->getElementType(),
2717 OnlyDeduced
, Depth
, Used
);
2721 case Type::ExtVector
:
2722 MarkUsedTemplateParameters(SemaRef
,
2723 cast
<VectorType
>(T
)->getElementType(),
2724 OnlyDeduced
, Depth
, Used
);
2727 case Type::DependentSizedExtVector
: {
2728 const DependentSizedExtVectorType
*VecType
2729 = cast
<DependentSizedExtVectorType
>(T
);
2730 MarkUsedTemplateParameters(SemaRef
, VecType
->getElementType(), OnlyDeduced
,
2732 MarkUsedTemplateParameters(SemaRef
, VecType
->getSizeExpr(), OnlyDeduced
,
2737 case Type::FunctionProto
: {
2738 const FunctionProtoType
*Proto
= cast
<FunctionProtoType
>(T
);
2739 MarkUsedTemplateParameters(SemaRef
, Proto
->getResultType(), OnlyDeduced
,
2741 for (unsigned I
= 0, N
= Proto
->getNumArgs(); I
!= N
; ++I
)
2742 MarkUsedTemplateParameters(SemaRef
, Proto
->getArgType(I
), OnlyDeduced
,
2747 case Type::TemplateTypeParm
: {
2748 const TemplateTypeParmType
*TTP
= cast
<TemplateTypeParmType
>(T
);
2749 if (TTP
->getDepth() == Depth
)
2750 Used
[TTP
->getIndex()] = true;
2754 case Type::InjectedClassName
:
2755 T
= cast
<InjectedClassNameType
>(T
)->getInjectedSpecializationType();
2758 case Type::TemplateSpecialization
: {
2759 const TemplateSpecializationType
*Spec
2760 = cast
<TemplateSpecializationType
>(T
);
2761 MarkUsedTemplateParameters(SemaRef
, Spec
->getTemplateName(), OnlyDeduced
,
2763 for (unsigned I
= 0, N
= Spec
->getNumArgs(); I
!= N
; ++I
)
2764 MarkUsedTemplateParameters(SemaRef
, Spec
->getArg(I
), OnlyDeduced
, Depth
,
2771 MarkUsedTemplateParameters(SemaRef
,
2772 cast
<ComplexType
>(T
)->getElementType(),
2773 OnlyDeduced
, Depth
, Used
);
2776 case Type::DependentName
:
2778 MarkUsedTemplateParameters(SemaRef
,
2779 cast
<DependentNameType
>(T
)->getQualifier(),
2780 OnlyDeduced
, Depth
, Used
);
2783 case Type::DependentTemplateSpecialization
: {
2784 const DependentTemplateSpecializationType
*Spec
2785 = cast
<DependentTemplateSpecializationType
>(T
);
2787 MarkUsedTemplateParameters(SemaRef
, Spec
->getQualifier(),
2788 OnlyDeduced
, Depth
, Used
);
2789 for (unsigned I
= 0, N
= Spec
->getNumArgs(); I
!= N
; ++I
)
2790 MarkUsedTemplateParameters(SemaRef
, Spec
->getArg(I
), OnlyDeduced
, Depth
,
2797 MarkUsedTemplateParameters(SemaRef
,
2798 cast
<TypeOfType
>(T
)->getUnderlyingType(),
2799 OnlyDeduced
, Depth
, Used
);
2802 case Type::TypeOfExpr
:
2804 MarkUsedTemplateParameters(SemaRef
,
2805 cast
<TypeOfExprType
>(T
)->getUnderlyingExpr(),
2806 OnlyDeduced
, Depth
, Used
);
2809 case Type::Decltype
:
2811 MarkUsedTemplateParameters(SemaRef
,
2812 cast
<DecltypeType
>(T
)->getUnderlyingExpr(),
2813 OnlyDeduced
, Depth
, Used
);
2816 // None of these types have any template parameters in them.
2818 case Type::VariableArray
:
2819 case Type::FunctionNoProto
:
2822 case Type::ObjCInterface
:
2823 case Type::ObjCObject
:
2824 case Type::ObjCObjectPointer
:
2825 case Type::UnresolvedUsing
:
2826 #define TYPE(Class, Base)
2827 #define ABSTRACT_TYPE(Class, Base)
2828 #define DEPENDENT_TYPE(Class, Base)
2829 #define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
2830 #include "clang/AST/TypeNodes.def"
2835 /// \brief Mark the template parameters that are used by this
2836 /// template argument.
2838 MarkUsedTemplateParameters(Sema
&SemaRef
,
2839 const TemplateArgument
&TemplateArg
,
2842 llvm::SmallVectorImpl
<bool> &Used
) {
2843 switch (TemplateArg
.getKind()) {
2844 case TemplateArgument::Null
:
2845 case TemplateArgument::Integral
:
2846 case TemplateArgument::Declaration
:
2849 case TemplateArgument::Type
:
2850 MarkUsedTemplateParameters(SemaRef
, TemplateArg
.getAsType(), OnlyDeduced
,
2854 case TemplateArgument::Template
:
2855 MarkUsedTemplateParameters(SemaRef
, TemplateArg
.getAsTemplate(),
2856 OnlyDeduced
, Depth
, Used
);
2859 case TemplateArgument::Expression
:
2860 MarkUsedTemplateParameters(SemaRef
, TemplateArg
.getAsExpr(), OnlyDeduced
,
2864 case TemplateArgument::Pack
:
2865 for (TemplateArgument::pack_iterator P
= TemplateArg
.pack_begin(),
2866 PEnd
= TemplateArg
.pack_end();
2868 MarkUsedTemplateParameters(SemaRef
, *P
, OnlyDeduced
, Depth
, Used
);
2873 /// \brief Mark the template parameters can be deduced by the given
2874 /// template argument list.
2876 /// \param TemplateArgs the template argument list from which template
2877 /// parameters will be deduced.
2879 /// \param Deduced a bit vector whose elements will be set to \c true
2880 /// to indicate when the corresponding template parameter will be
2883 Sema::MarkUsedTemplateParameters(const TemplateArgumentList
&TemplateArgs
,
2884 bool OnlyDeduced
, unsigned Depth
,
2885 llvm::SmallVectorImpl
<bool> &Used
) {
2886 for (unsigned I
= 0, N
= TemplateArgs
.size(); I
!= N
; ++I
)
2887 ::MarkUsedTemplateParameters(*this, TemplateArgs
[I
], OnlyDeduced
,
2891 /// \brief Marks all of the template parameters that will be deduced by a
2892 /// call to the given function template.
2894 Sema::MarkDeducedTemplateParameters(FunctionTemplateDecl
*FunctionTemplate
,
2895 llvm::SmallVectorImpl
<bool> &Deduced
) {
2896 TemplateParameterList
*TemplateParams
2897 = FunctionTemplate
->getTemplateParameters();
2899 Deduced
.resize(TemplateParams
->size());
2901 FunctionDecl
*Function
= FunctionTemplate
->getTemplatedDecl();
2902 for (unsigned I
= 0, N
= Function
->getNumParams(); I
!= N
; ++I
)
2903 ::MarkUsedTemplateParameters(*this, Function
->getParamDecl(I
)->getType(),
2904 true, TemplateParams
->getDepth(), Deduced
);