clang 24.0.0git
SemaTemplateDeduction.cpp
Go to the documentation of this file.
1//===- SemaTemplateDeduction.cpp - Template Argument Deduction ------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements C++ template argument deduction.
10//
11//===----------------------------------------------------------------------===//
12
13#include "TreeTransform.h"
14#include "TypeLocBuilder.h"
16#include "clang/AST/ASTLambda.h"
17#include "clang/AST/Decl.h"
19#include "clang/AST/DeclBase.h"
20#include "clang/AST/DeclCXX.h"
24#include "clang/AST/Expr.h"
25#include "clang/AST/ExprCXX.h"
29#include "clang/AST/Type.h"
30#include "clang/AST/TypeLoc.h"
35#include "clang/Basic/LLVM.h"
43#include "clang/Sema/Sema.h"
44#include "clang/Sema/Template.h"
46#include "llvm/ADT/APInt.h"
47#include "llvm/ADT/APSInt.h"
48#include "llvm/ADT/ArrayRef.h"
49#include "llvm/ADT/DenseMap.h"
50#include "llvm/ADT/FoldingSet.h"
51#include "llvm/ADT/SmallBitVector.h"
52#include "llvm/ADT/SmallPtrSet.h"
53#include "llvm/ADT/SmallVector.h"
54#include "llvm/Support/Casting.h"
55#include "llvm/Support/Compiler.h"
56#include "llvm/Support/ErrorHandling.h"
57#include "llvm/Support/SaveAndRestore.h"
58#include <algorithm>
59#include <cassert>
60#include <optional>
61#include <tuple>
62#include <type_traits>
63#include <utility>
64
65namespace clang {
66
67 /// Various flags that control template argument deduction.
68 ///
69 /// These flags can be bitwise-OR'd together.
71 /// No template argument deduction flags, which indicates the
72 /// strictest results for template argument deduction (as used for, e.g.,
73 /// matching class template partial specializations).
75
76 /// Within template argument deduction from a function call, we are
77 /// matching with a parameter type for which the original parameter was
78 /// a reference.
80
81 /// Within template argument deduction from a function call, we
82 /// are matching in a case where we ignore cv-qualifiers.
84
85 /// Within template argument deduction from a function call,
86 /// we are matching in a case where we can perform template argument
87 /// deduction from a template-id of a derived class of the argument type.
89
90 /// Allow non-dependent types to differ, e.g., when performing
91 /// template argument deduction from a function call where conversions
92 /// may apply.
94
95 /// Whether we are performing template argument deduction for
96 /// parameters and arguments in a top-level template argument
98
99 /// Within template argument deduction from overload resolution per
100 /// C++ [over.over] allow matching function types that are compatible in
101 /// terms of noreturn and default calling convention adjustments, or
102 /// similarly matching a declared template specialization against a
103 /// possible template, per C++ [temp.deduct.decl]. In either case, permit
104 /// deduction where the parameter is a function type that can be converted
105 /// to the argument type.
107
108 /// Within template argument deduction for a conversion function, we are
109 /// matching with an argument type for which the original argument was
110 /// a reference.
112 };
113}
114
115using namespace clang;
116using namespace sema;
117
118/// The kind of PartialOrdering we're performing template argument deduction
119/// for (C++11 [temp.deduct.partial]).
121
123 Sema &S, TemplateParameterList *TemplateParams, QualType Param,
126 PartialOrderingKind POK, bool DeducedFromArrayBound,
127 bool *HasDeducedAnyParam);
128
129/// What directions packs are allowed to match non-packs.
131
138 bool NumberOfArgumentsMustMatch, bool PartialOrdering,
139 PackFold PackFold, bool *HasDeducedAnyParam);
140
143 bool OnlyDeduced, unsigned Depth,
144 llvm::SmallBitVector &Used);
145
147 bool OnlyDeduced, unsigned Level,
148 llvm::SmallBitVector &Deduced);
149
150static const Expr *unwrapExpressionForDeduction(const Expr *E) {
151 // If we are within an alias template, the expression may have undergone
152 // any number of parameter substitutions already.
153 while (true) {
154 if (const auto *IC = dyn_cast<ImplicitCastExpr>(E))
155 E = IC->getSubExpr();
156 else if (const auto *CE = dyn_cast<ConstantExpr>(E))
157 E = CE->getSubExpr();
158 else if (const auto *Subst = dyn_cast<SubstNonTypeTemplateParmExpr>(E))
159 E = Subst->getReplacement();
160 else if (const auto *CCE = dyn_cast<CXXConstructExpr>(E)) {
161 // Look through implicit copy construction from an lvalue of the same type.
162 if (CCE->getParenOrBraceRange().isValid())
163 break;
164 // Note, there could be default arguments.
165 assert(CCE->getNumArgs() >= 1 && "implicit construct expr should have 1 arg");
166 E = CCE->getArg(0);
167 } else
168 break;
169 }
170 return E;
171}
172
174public:
175 NonTypeOrVarTemplateParmDecl(const NamedDecl *Template) : Template(Template) {
176 assert(
177 !Template || isa<NonTypeTemplateParmDecl>(Template) ||
179 (cast<TemplateTemplateParmDecl>(Template)->templateParameterKind() ==
181 cast<TemplateTemplateParmDecl>(Template)->templateParameterKind() ==
183 }
184
186 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))
187 return NTTP->getType();
191 }
192
193 unsigned getDepth() const {
194 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))
195 return NTTP->getDepth();
196 return getTemplate()->getDepth();
197 }
198
199 unsigned getIndex() const {
200 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))
201 return NTTP->getIndex();
202 return getTemplate()->getIndex();
203 }
204
206 return cast<TemplateTemplateParmDecl>(Template);
207 }
208
210 return cast<NonTypeTemplateParmDecl>(Template);
211 }
212
214 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))
215 return const_cast<NonTypeTemplateParmDecl *>(NTTP);
216 return const_cast<TemplateTemplateParmDecl *>(getTemplate());
217 }
218
220 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))
221 return NTTP->isExpandedParameterPack();
223 }
224
226 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))
227 return NTTP->getLocation();
228 return getTemplate()->getLocation();
229 }
230
231 operator bool() const { return Template; }
232
233private:
234 const NamedDecl *Template;
235};
236
237/// If the given expression is of a form that names a non-type template
238/// parameter, return the declaration of that parameter. A null \p Depth
239/// accepts a parameter at any depth.
242 // If we are within an alias template, the expression may have undergone
243 // any number of parameter substitutions already.
245 if (const auto *DRE = dyn_cast<DeclRefExpr>(E))
246 if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl()))
247 if (!Depth || NTTP->getDepth() == *Depth)
248 return NTTP;
249
250 // A pack-index-template-name is not deducible.
251 if (const auto *DTI = dyn_cast<DependentTemplateIdExpr>(E))
252 if (!DTI->getTemplateName().getAsPackIndexingTemplate() &&
253 (!Depth || DTI->getParameter()->getDepth() == *Depth))
254 return DTI->getParameter();
255
256 return nullptr;
257}
258
262 getNTTParameterFromExpr(Arg.getAsExpr(), std::nullopt))
263 return NTTP.getType();
265}
266
271
272/// Determine whether two declaration pointers refer to the same
273/// declaration.
274static bool isSameDeclaration(Decl *X, Decl *Y) {
275 if (NamedDecl *NX = dyn_cast<NamedDecl>(X))
276 X = NX->getUnderlyingDecl();
277 if (NamedDecl *NY = dyn_cast<NamedDecl>(Y))
278 Y = NY->getUnderlyingDecl();
279
280 return X->getCanonicalDecl() == Y->getCanonicalDecl();
281}
282
283/// Verify that the given, deduced template arguments are compatible.
284///
285/// \returns The deduced template argument, or a NULL template argument if
286/// the deduced template arguments were incompatible.
291 bool AggregateCandidateDeduction = false) {
292 // We have no deduction for one or both of the arguments; they're compatible.
293 if (X.isNull())
294 return Y;
295 if (Y.isNull())
296 return X;
297
298 // If we have two non-type template argument values deduced for the same
299 // parameter, they must both match the type of the parameter, and thus must
300 // match each other's type. As we're only keeping one of them, we must check
301 // for that now. The exception is that if either was deduced from an array
302 // bound, the type is permitted to differ.
303 if (!X.wasDeducedFromArrayBound() && !Y.wasDeducedFromArrayBound()) {
304 QualType XType = X.getNonTypeTemplateArgumentType();
305 if (!XType.isNull()) {
307 if (YType.isNull() || !Context.hasSameType(XType, YType))
309 }
310 }
311
312 switch (X.getKind()) {
314 llvm_unreachable("Non-deduced template arguments handled above");
315
317 // If two template type arguments have the same type, they're compatible.
318 QualType TX = X.getAsType(), TY = Y.getAsType();
319 if (Y.getKind() == TemplateArgument::Type && Context.hasSameType(TX, TY))
320 return DeducedTemplateArgument(Context.getCommonSugaredType(TX, TY),
321 X.wasDeducedFromArrayBound() ||
323
324 // If one of the two arguments was deduced from an array bound, the other
325 // supersedes it.
326 if (X.wasDeducedFromArrayBound() != Y.wasDeducedFromArrayBound())
327 return X.wasDeducedFromArrayBound() ? Y : X;
328
329 // The arguments are not compatible.
331 }
332
334 // If we deduced a constant in one case and either a dependent expression or
335 // declaration in another case, keep the integral constant.
336 // If both are integral constants with the same value, keep that value.
340 llvm::APSInt::isSameValue(X.getAsIntegral(), Y.getAsIntegral())))
341 return X.wasDeducedFromArrayBound() ? Y : X;
342
343 // All other combinations are incompatible.
345
347 // If we deduced a value and a dependent expression, keep the value.
350 X.structurallyEquals(Y)))
351 return X;
352
353 // All other combinations are incompatible.
355
358 Context.hasSameTemplateName(X.getAsTemplate(), Y.getAsTemplate()))
359 return X;
360
361 // All other combinations are incompatible.
363
366 Context.hasSameTemplateName(X.getAsTemplateOrTemplatePattern(),
368 return X;
369
370 // All other combinations are incompatible.
372
375 return checkDeducedTemplateArguments(Context, Y, X);
376
377 // Compare the expressions for equality
378 llvm::FoldingSetNodeID ID1, ID2;
379 X.getAsExpr()->Profile(ID1, Context, true);
380 Y.getAsExpr()->Profile(ID2, Context, true);
381 if (ID1 == ID2)
382 return X.wasDeducedFromArrayBound() ? Y : X;
383
384 // Differing dependent expressions are incompatible.
386 }
387
389 assert(!X.wasDeducedFromArrayBound());
390
391 // If we deduced a declaration and a dependent expression, keep the
392 // declaration.
394 return X;
395
396 // If we deduced a declaration and an integral constant, keep the
397 // integral constant and whichever type did not come from an array
398 // bound.
401 return TemplateArgument(Context, Y.getAsIntegral(),
402 X.getParamTypeForDecl());
403 return Y;
404 }
405
406 // If we deduced two declarations, make sure that they refer to the
407 // same declaration.
409 isSameDeclaration(X.getAsDecl(), Y.getAsDecl()))
410 return X;
411
412 // All other combinations are incompatible.
414
416 // If we deduced a null pointer and a dependent expression, keep the
417 // null pointer.
419 return TemplateArgument(Context.getCommonSugaredType(
420 X.getNullPtrType(), Y.getAsExpr()->getType()),
421 true);
422
423 // If we deduced a null pointer and an integral constant, keep the
424 // integral constant.
426 return Y;
427
428 // If we deduced two null pointers, they are the same.
430 return TemplateArgument(
431 Context.getCommonSugaredType(X.getNullPtrType(), Y.getNullPtrType()),
432 true);
433
434 // All other combinations are incompatible.
436
438 if (Y.getKind() != TemplateArgument::Pack ||
439 (!AggregateCandidateDeduction && X.pack_size() != Y.pack_size()))
441
444 XA = X.pack_begin(),
445 XAEnd = X.pack_end(), YA = Y.pack_begin(), YAEnd = Y.pack_end();
446 XA != XAEnd; ++XA) {
447 if (YA != YAEnd) {
449 Context, DeducedTemplateArgument(*XA, X.wasDeducedFromArrayBound()),
451 if (Merged.isNull() && !(XA->isNull() && YA->isNull()))
453 NewPack.push_back(Merged);
454 ++YA;
455 } else {
456 NewPack.push_back(*XA);
457 }
458 }
459
461 TemplateArgument::CreatePackCopy(Context, NewPack),
462 X.wasDeducedFromArrayBound() && Y.wasDeducedFromArrayBound());
463 }
464 }
465
466 llvm_unreachable("Invalid TemplateArgument Kind!");
467}
468
469/// Deduce the value of the given non-type template parameter
470/// as the given deduced template argument. All non-type template parameter
471/// deduction is funneled through here.
475 const DeducedTemplateArgument &NewDeduced,
476 QualType ValueType, TemplateDeductionInfo &Info,
477 bool PartialOrdering,
479 bool *HasDeducedAnyParam) {
480 assert(NTTP.getDepth() == Info.getDeducedDepth() &&
481 "deducing non-type template argument with wrong depth");
482
484 S.Context, Deduced[NTTP.getIndex()], NewDeduced);
485 if (Result.isNull()) {
486 Info.Param = NTTP.asTemplateParam();
487 Info.FirstArg = Deduced[NTTP.getIndex()];
488 Info.SecondArg = NewDeduced;
490 }
491 Deduced[NTTP.getIndex()] = Result;
492 if (!S.getLangOpts().CPlusPlus17 && !PartialOrdering)
494
495 if (NTTP.isExpandedParameterPack())
496 // FIXME: We may still need to deduce parts of the type here! But we
497 // don't have any way to find which slice of the type to use, and the
498 // type stored on the NTTP itself is nonsense. Perhaps the type of an
499 // expanded NTTP should be a pack expansion type?
501
502 // Get the type of the parameter for deduction. If it's a (dependent) array
503 // or function type, we will not have decayed it yet, so do that now.
504 QualType ParamType = S.Context.getAdjustedParameterType(NTTP.getType());
505 if (auto *Expansion = dyn_cast<PackExpansionType>(ParamType))
506 ParamType = Expansion->getPattern();
507
508 // FIXME: It's not clear how deduction of a parameter of reference type from
509 // an argument should be performed. For now, we just make the argument have
510 // the same kind of reference type as the parameter.
511 if (ParamType->isReferenceType()) {
512 ValueType = ValueType.getNonReferenceType();
513 ValueType = ParamType->isRValueReferenceType()
514 ? S.Context.getRValueReferenceType(ValueType)
515 : S.Context.getLValueReferenceType(ValueType);
516 }
517
519 S, TemplateParams, ParamType, ValueType, Info, Deduced,
523 /*ArrayBound=*/NewDeduced.wasDeducedFromArrayBound(), HasDeducedAnyParam);
524}
525
526/// Deduce the value of the given non-type template parameter
527/// from the given integral constant.
529 Sema &S, TemplateParameterList *TemplateParams,
530 NonTypeOrVarTemplateParmDecl NTTP, const llvm::APSInt &Value,
531 QualType ValueType, bool DeducedFromArrayBound, TemplateDeductionInfo &Info,
533 bool *HasDeducedAnyParam) {
535 S, TemplateParams, NTTP,
537 DeducedFromArrayBound),
538 ValueType, Info, PartialOrdering, Deduced, HasDeducedAnyParam);
539}
540
541/// Deduce the value of the given non-type template parameter
542/// from the given null pointer template argument type.
546 QualType NullPtrType, TemplateDeductionInfo &Info,
547 bool PartialOrdering,
549 bool *HasDeducedAnyParam) {
552 NTTP.getLocation()),
553 NullPtrType,
554 NullPtrType->isMemberPointerType() ? CK_NullToMemberPointer
555 : CK_NullToPointer)
556 .get();
558 S, TemplateParams, NTTP, TemplateArgument(Value, /*IsCanonical=*/false),
559 Value->getType(), Info, PartialOrdering, Deduced, HasDeducedAnyParam);
560}
561
562/// Deduce the value of the given non-type template parameter
563/// from the given type- or value-dependent expression.
564///
565/// \returns true if deduction succeeded, false otherwise.
571 bool *HasDeducedAnyParam) {
573 S, TemplateParams, NTTP, TemplateArgument(Value, /*IsCanonical=*/false),
574 Value->getType(), Info, PartialOrdering, Deduced, HasDeducedAnyParam);
575}
576
577/// Deduce the value of the given non-type template parameter
578/// from the given declaration.
579///
580/// \returns true if deduction succeeded, false otherwise.
585 bool PartialOrdering,
587 bool *HasDeducedAnyParam) {
590 S, TemplateParams, NTTP, DeducedTemplateArgument(New), T, Info,
591 PartialOrdering, Deduced, HasDeducedAnyParam);
592}
593
595 Sema &S, TemplateParameterList *TemplateParams, TemplateName Param,
599 bool *HasDeducedAnyParam) {
600 TemplateDecl *ParamDecl = Param.getAsTemplateDecl();
601 if (!ParamDecl) {
602 // The parameter type is dependent and is not a template template parameter,
603 // so there is nothing that we can deduce.
605 }
606
607 if (auto *TempParam = dyn_cast<TemplateTemplateParmDecl>(ParamDecl)) {
608 // If we're not deducing at this depth, there's nothing to deduce.
609 if (TempParam->getDepth() != Info.getDeducedDepth())
611
612 ArrayRef<NamedDecl *> Params =
613 ParamDecl->getTemplateParameters()->asArray();
614 unsigned StartPos = 0;
615 for (unsigned I = 0, E = std::min(Params.size(), DefaultArguments.size());
616 I < E; ++I) {
617 if (Params[I]->isParameterPack()) {
618 StartPos = DefaultArguments.size();
619 break;
620 }
621 StartPos = I + 1;
622 }
623
624 // Provisional resolution for CWG2398: If Arg names a template
625 // specialization, then we deduce a synthesized template name
626 // based on A, but using the TS's extra arguments, relative to P, as
627 // defaults.
628 DeducedTemplateArgument NewDeduced =
631 Arg, {StartPos, DefaultArguments.drop_front(StartPos)}))
632 : Arg;
633
635 S.Context, Deduced[TempParam->getIndex()], NewDeduced);
636 if (Result.isNull()) {
637 Info.Param = TempParam;
638 Info.FirstArg = Deduced[TempParam->getIndex()];
639 Info.SecondArg = NewDeduced;
641 }
642
643 Deduced[TempParam->getIndex()] = Result;
644 if (HasDeducedAnyParam)
645 *HasDeducedAnyParam = true;
647 }
648
649 // Verify that the two template names are equivalent.
651 Param, Arg, /*IgnoreDeduced=*/DefaultArguments.size() != 0))
653
654 // Mismatch of non-dependent template parameter to argument.
655 Info.FirstArg = TemplateArgument(Param);
656 Info.SecondArg = TemplateArgument(Arg);
658}
659
660/// Deduce the template arguments by comparing the template parameter
661/// type (which is a template-id) with the template argument type.
662///
663/// \param S the Sema
664///
665/// \param TemplateParams the template parameters that we are deducing
666///
667/// \param P the parameter type
668///
669/// \param A the argument type
670///
671/// \param Info information about the template argument deduction itself
672///
673/// \param Deduced the deduced template arguments
674///
675/// \returns the result of template argument deduction so far. Note that a
676/// "success" result means that template argument deduction has not yet failed,
677/// but it may still fail, later, for other reasons.
678
679static const TemplateSpecializationType *getLastTemplateSpecType(QualType QT) {
680 const TemplateSpecializationType *LastTST = nullptr;
681 for (const Type *T = QT.getTypePtr(); /**/; /**/) {
682 const TemplateSpecializationType *TST =
683 T->getAs<TemplateSpecializationType>();
684 if (!TST)
685 return LastTST;
686 if (!TST->isSugared())
687 return TST;
688 LastTST = TST;
689 T = TST->desugar().getTypePtr();
690 }
691}
692
695 const QualType P, QualType A,
698 bool *HasDeducedAnyParam) {
699 TemplateName TNP;
702 const TemplateSpecializationType *TP = ::getLastTemplateSpecType(P);
703 TNP = TP->getTemplateName();
704
705 // No deduction for specializations of dependent template names.
708
709 // FIXME: To preserve sugar, the TST needs to carry sugared resolved
710 // arguments.
711 PResolved =
712 TP->castAsCanonical<TemplateSpecializationType>()->template_arguments();
713 } else {
714 const auto *TT = P->castAs<InjectedClassNameType>();
715 TNP = TT->getTemplateName(S.Context);
716 PResolved = TT->getTemplateArgs(S.Context);
717 }
718
719 // If the parameter is an alias template, there is nothing to deduce.
720 if (const auto *TD = TNP.getAsTemplateDecl(); TD && TD->isTypeAlias())
722 // Pack-producing templates can only be matched after substitution.
725
726 // Check whether the template argument is a dependent template-id.
728 const TemplateSpecializationType *SA = ::getLastTemplateSpecType(A);
729 TemplateName TNA = SA->getTemplateName();
730
731 // If the argument is an alias template, there is nothing to deduce.
732 if (const auto *TD = TNA.getAsTemplateDecl(); TD && TD->isTypeAlias())
734
735 // FIXME: To preserve sugar, the TST needs to carry sugared resolved
736 // arguments.
738 SA->getCanonicalTypeInternal()
739 ->castAs<TemplateSpecializationType>()
740 ->template_arguments();
741
742 // Perform template argument deduction for the template name.
743 if (auto Result = DeduceTemplateArguments(S, TemplateParams, TNP, TNA, Info,
744 /*DefaultArguments=*/AResolved,
746 HasDeducedAnyParam);
748 return Result;
749
750 // Perform template argument deduction on each template
751 // argument. Ignore any missing/extra arguments, since they could be
752 // filled in by default arguments.
754 S, TemplateParams, PResolved, AResolved, Info, Deduced,
755 /*NumberOfArgumentsMustMatch=*/false, PartialOrdering,
756 PackFold::ParameterToArgument, HasDeducedAnyParam);
757 }
758
759 // If the argument type is a class template specialization, we
760 // perform template argument deduction using its template
761 // arguments.
762 const auto *TA = A->getAs<TagType>();
763 TemplateName TNA;
764 if (TA) {
765 // FIXME: Can't use the template arguments from this TST, as they are not
766 // resolved.
767 if (const auto *TST = A->getAsNonAliasTemplateSpecializationType())
768 TNA = TST->getTemplateName();
769 else
770 TNA = TA->getTemplateName(S.Context);
771 }
772 if (TNA.isNull()) {
773 Info.FirstArg = TemplateArgument(P);
774 Info.SecondArg = TemplateArgument(A);
776 }
777
778 ArrayRef<TemplateArgument> AResolved = TA->getTemplateArgs(S.Context);
779 // Perform template argument deduction for the template name.
780 if (auto Result =
781 DeduceTemplateArguments(S, TemplateParams, TNP, TNA, Info,
782 /*DefaultArguments=*/AResolved,
783 PartialOrdering, Deduced, HasDeducedAnyParam);
785 return Result;
786
787 // Perform template argument deduction for the template arguments.
789 S, TemplateParams, PResolved, AResolved, Info, Deduced,
790 /*NumberOfArgumentsMustMatch=*/true, PartialOrdering,
791 PackFold::ParameterToArgument, HasDeducedAnyParam);
792}
793
795 assert(T->isCanonicalUnqualified());
796
797 switch (T->getTypeClass()) {
798 case Type::TypeOfExpr:
799 case Type::TypeOf:
800 case Type::DependentName:
801 case Type::Decltype:
802 case Type::PackIndexing:
803 case Type::UnresolvedUsing:
804 case Type::TemplateTypeParm:
805 case Type::Auto:
806 return true;
807
808 case Type::ConstantArray:
809 case Type::IncompleteArray:
810 case Type::VariableArray:
811 case Type::DependentSizedArray:
813 cast<ArrayType>(T)->getElementType().getTypePtr());
814
815 default:
816 return false;
817 }
818}
819
820/// Determines whether the given type is an opaque type that
821/// might be more qualified when instantiated.
824 T->getCanonicalTypeInternal().getTypePtr());
825}
826
827/// Helper function to build a TemplateParameter when we don't
828/// know its type statically.
830 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(D))
831 return TemplateParameter(TTP);
832 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D))
833 return TemplateParameter(NTTP);
834
836}
837
838/// A pack that we're currently deducing.
840 // The index of the pack.
841 unsigned Index;
842
843 // The old value of the pack before we started deducing it.
845
846 // A deferred value of this pack from an inner deduction, that couldn't be
847 // deduced because this deduction hadn't happened yet.
849
850 // The new value of the pack.
852
853 // The outer deduction for this pack, if any.
854 DeducedPack *Outer = nullptr;
855
856 DeducedPack(unsigned Index) : Index(Index) {}
857};
858
859namespace {
860
861/// A scope in which we're performing pack deduction.
862class PackDeductionScope {
863public:
864 /// Prepare to deduce the packs named within Pattern.
865 /// \param FinishingDeduction Don't attempt to deduce the pack. Useful when
866 /// just checking a previous deduction of the pack.
867 PackDeductionScope(Sema &S, TemplateParameterList *TemplateParams,
870 bool DeducePackIfNotAlreadyDeduced = false,
871 bool FinishingDeduction = false)
872 : S(S), TemplateParams(TemplateParams), Deduced(Deduced), Info(Info),
873 DeducePackIfNotAlreadyDeduced(DeducePackIfNotAlreadyDeduced),
874 FinishingDeduction(FinishingDeduction) {
875 unsigned NumNamedPacks = addPacks(Pattern);
876 finishConstruction(NumNamedPacks);
877 }
878
879 /// Prepare to directly deduce arguments of the parameter with index \p Index.
880 PackDeductionScope(Sema &S, TemplateParameterList *TemplateParams,
881 SmallVectorImpl<DeducedTemplateArgument> &Deduced,
882 TemplateDeductionInfo &Info, unsigned Index)
883 : S(S), TemplateParams(TemplateParams), Deduced(Deduced), Info(Info) {
884 addPack(Index);
885 finishConstruction(1);
886 }
887
888private:
889 void addPack(unsigned Index) {
890 // Save the deduced template argument for the parameter pack expanded
891 // by this pack expansion, then clear out the deduction.
892 DeducedFromEarlierParameter = !Deduced[Index].isNull();
893 DeducedPack Pack(Index);
894 if (!FinishingDeduction) {
895 Pack.Saved = Deduced[Index];
896 Deduced[Index] = TemplateArgument();
897 }
898
899 // FIXME: What if we encounter multiple packs with different numbers of
900 // pre-expanded expansions? (This should already have been diagnosed
901 // during substitution.)
902 if (UnsignedOrNone ExpandedPackExpansions =
903 getExpandedPackSize(TemplateParams->getParam(Index)))
904 FixedNumExpansions = ExpandedPackExpansions;
905
906 Packs.push_back(Pack);
907 }
908
909 unsigned addPacks(TemplateArgument Pattern) {
910 // Compute the set of template parameter indices that correspond to
911 // parameter packs expanded by the pack expansion.
912 llvm::SmallBitVector SawIndices(TemplateParams->size());
913 llvm::SmallVector<TemplateArgument, 4> ExtraDeductions;
914
915 auto AddPack = [&](unsigned Index) {
916 if (SawIndices[Index])
917 return;
918 SawIndices[Index] = true;
919 addPack(Index);
920
921 // Deducing a parameter pack that is a pack expansion also constrains the
922 // packs appearing in that parameter to have the same deduced arity. Also,
923 // in C++17 onwards, deducing a non-type template parameter deduces its
924 // type, so we need to collect the pending deduced values for those packs.
925 if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(
926 TemplateParams->getParam(Index))) {
927 if (!NTTP->isExpandedParameterPack())
928 // FIXME: CWG2982 suggests a type-constraint forms a non-deduced
929 // context, however it is not yet resolved.
930 if (auto *Expansion = dyn_cast<PackExpansionType>(
931 S.Context.getUnconstrainedType(NTTP->getType())))
932 ExtraDeductions.push_back(Expansion->getPattern());
933 }
934 // FIXME: Also collect the unexpanded packs in any type and template
935 // parameter packs that are pack expansions.
936 };
937
938 auto Collect = [&](TemplateArgument Pattern) {
939 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
940 S.collectUnexpandedParameterPacks(Pattern, Unexpanded);
941 for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) {
942 unsigned Depth, Index;
943
944 // Function parameter packs cannot be deduced.
945 if (isa_and_present<ParmVarDecl>(
946 dyn_cast<NamedDecl *>(Unexpanded[I].first)))
947 continue;
948 if (auto DI = getDepthAndIndex(Unexpanded[I]))
949 std::tie(Depth, Index) = *DI;
950 else
951 continue;
952
953 if (Depth == Info.getDeducedDepth())
954 AddPack(Index);
955 }
956 };
957
958 // Look for unexpanded packs in the pattern.
959 Collect(Pattern);
960
961 unsigned NumNamedPacks = Packs.size();
962
963 // Also look for unexpanded packs that are indirectly deduced by deducing
964 // the sizes of the packs in this pattern.
965 while (!ExtraDeductions.empty())
966 Collect(ExtraDeductions.pop_back_val());
967
968 return NumNamedPacks;
969 }
970
971 void finishConstruction(unsigned NumNamedPacks) {
972 // Dig out the partially-substituted pack, if there is one.
973 const TemplateArgument *PartialPackArgs = nullptr;
974 unsigned NumPartialPackArgs = 0;
975 std::pair<unsigned, unsigned> PartialPackDepthIndex(-1u, -1u);
976 if (auto *Scope = S.CurrentInstantiationScope)
977 if (auto *Partial = Scope->getPartiallySubstitutedPack(
978 &PartialPackArgs, &NumPartialPackArgs))
979 PartialPackDepthIndex = getDepthAndIndex(Partial);
980
981 // This pack expansion will have been partially or fully expanded if
982 // it only names explicitly-specified parameter packs (including the
983 // partially-substituted one, if any).
984 bool IsExpanded = true;
985 for (unsigned I = 0; I != NumNamedPacks; ++I) {
986 if (Packs[I].Index >= Info.getNumExplicitArgs()) {
987 IsExpanded = false;
988 IsPartiallyExpanded = false;
989 break;
990 }
991 if (PartialPackDepthIndex ==
992 std::make_pair(Info.getDeducedDepth(), Packs[I].Index)) {
993 IsPartiallyExpanded = true;
994 }
995 }
996
997 // Skip over the pack elements that were expanded into separate arguments.
998 // If we partially expanded, this is the number of partial arguments.
999 // FIXME: `&& FixedNumExpansions` is a workaround for UB described in
1000 // https://github.com/llvm/llvm-project/issues/100095
1001 if (IsPartiallyExpanded)
1002 PackElements += NumPartialPackArgs;
1003 else if (IsExpanded && FixedNumExpansions)
1004 PackElements += *FixedNumExpansions;
1005
1006 for (auto &Pack : Packs) {
1007 if (Info.PendingDeducedPacks.size() > Pack.Index)
1008 Pack.Outer = Info.PendingDeducedPacks[Pack.Index];
1009 else
1010 Info.PendingDeducedPacks.resize(Pack.Index + 1);
1011 Info.PendingDeducedPacks[Pack.Index] = &Pack;
1012
1013 if (PartialPackDepthIndex ==
1014 std::make_pair(Info.getDeducedDepth(), Pack.Index)) {
1015 Pack.New.append(PartialPackArgs, PartialPackArgs + NumPartialPackArgs);
1016 }
1017 }
1018 }
1019
1020public:
1021 ~PackDeductionScope() {
1022 for (auto &Pack : Packs)
1023 Info.PendingDeducedPacks[Pack.Index] = Pack.Outer;
1024 }
1025
1026 // Return the size of the saved packs if all of them has the same size.
1027 UnsignedOrNone getSavedPackSizeIfAllEqual() const {
1028 unsigned PackSize = Packs[0].Saved.pack_size();
1029
1030 if (std::all_of(Packs.begin() + 1, Packs.end(), [&PackSize](const auto &P) {
1031 return P.Saved.pack_size() == PackSize;
1032 }))
1033 return PackSize;
1034 return std::nullopt;
1035 }
1036
1037 /// Determine whether this pack has already been deduced from a previous
1038 /// argument.
1039 bool isDeducedFromEarlierParameter() const {
1040 return DeducedFromEarlierParameter;
1041 }
1042
1043 /// Determine whether this pack has already been partially expanded into a
1044 /// sequence of (prior) function parameters / template arguments.
1045 bool isPartiallyExpanded() { return IsPartiallyExpanded; }
1046
1047 /// Determine whether this pack expansion scope has a known, fixed arity.
1048 /// This happens if it involves a pack from an outer template that has
1049 /// (notionally) already been expanded.
1050 bool hasFixedArity() { return static_cast<bool>(FixedNumExpansions); }
1051
1052 /// Determine whether the next element of the argument is still part of this
1053 /// pack. This is the case unless the pack is already expanded to a fixed
1054 /// length.
1055 bool hasNextElement() {
1056 return !FixedNumExpansions || *FixedNumExpansions > PackElements;
1057 }
1058
1059 /// Move to deducing the next element in each pack that is being deduced.
1060 void nextPackElement() {
1061 // Capture the deduced template arguments for each parameter pack expanded
1062 // by this pack expansion, add them to the list of arguments we've deduced
1063 // for that pack, then clear out the deduced argument.
1064 if (!FinishingDeduction) {
1065 for (auto &Pack : Packs) {
1066 DeducedTemplateArgument &DeducedArg = Deduced[Pack.Index];
1067 if (!Pack.New.empty() || !DeducedArg.isNull()) {
1068 while (Pack.New.size() < PackElements)
1069 Pack.New.push_back(DeducedTemplateArgument());
1070 if (Pack.New.size() == PackElements)
1071 Pack.New.push_back(DeducedArg);
1072 else
1073 Pack.New[PackElements] = DeducedArg;
1074 DeducedArg = Pack.New.size() > PackElements + 1
1075 ? Pack.New[PackElements + 1]
1076 : DeducedTemplateArgument();
1077 }
1078 }
1079 }
1080 ++PackElements;
1081 }
1082
1083 /// Finish template argument deduction for a set of argument packs,
1084 /// producing the argument packs and checking for consistency with prior
1085 /// deductions.
1086 TemplateDeductionResult finish() {
1087 if (FinishingDeduction)
1088 return TemplateDeductionResult::Success;
1089 // Build argument packs for each of the parameter packs expanded by this
1090 // pack expansion.
1091 for (auto &Pack : Packs) {
1092 // Put back the old value for this pack.
1093 if (!FinishingDeduction)
1094 Deduced[Pack.Index] = Pack.Saved;
1095
1096 // Always make sure the size of this pack is correct, even if we didn't
1097 // deduce any values for it.
1098 //
1099 // FIXME: This isn't required by the normative wording, but substitution
1100 // and post-substitution checking will always fail if the arity of any
1101 // pack is not equal to the number of elements we processed. (Either that
1102 // or something else has gone *very* wrong.) We're permitted to skip any
1103 // hard errors from those follow-on steps by the intent (but not the
1104 // wording) of C++ [temp.inst]p8:
1105 //
1106 // If the function selected by overload resolution can be determined
1107 // without instantiating a class template definition, it is unspecified
1108 // whether that instantiation actually takes place
1109 Pack.New.resize(PackElements);
1110
1111 // Build or find a new value for this pack.
1112 DeducedTemplateArgument NewPack;
1113 if (Pack.New.empty()) {
1114 // If we deduced an empty argument pack, create it now.
1115 NewPack = DeducedTemplateArgument(TemplateArgument::getEmptyPack());
1116 } else {
1117 TemplateArgument *ArgumentPack =
1118 new (S.Context) TemplateArgument[Pack.New.size()];
1119 std::copy(Pack.New.begin(), Pack.New.end(), ArgumentPack);
1120 NewPack = DeducedTemplateArgument(
1121 TemplateArgument(llvm::ArrayRef(ArgumentPack, Pack.New.size())),
1122 // FIXME: This is wrong, it's possible that some pack elements are
1123 // deduced from an array bound and others are not:
1124 // template<typename ...T, T ...V> void g(const T (&...p)[V]);
1125 // g({1, 2, 3}, {{}, {}});
1126 // ... should deduce T = {int, size_t (from array bound)}.
1127 Pack.New[0].wasDeducedFromArrayBound());
1128 }
1129
1130 // Pick where we're going to put the merged pack.
1131 DeducedTemplateArgument *Loc;
1132 if (Pack.Outer) {
1133 if (Pack.Outer->DeferredDeduction.isNull()) {
1134 // Defer checking this pack until we have a complete pack to compare
1135 // it against.
1136 Pack.Outer->DeferredDeduction = NewPack;
1137 continue;
1138 }
1139 Loc = &Pack.Outer->DeferredDeduction;
1140 } else {
1141 Loc = &Deduced[Pack.Index];
1142 }
1143
1144 // Check the new pack matches any previous value.
1145 DeducedTemplateArgument OldPack = *Loc;
1146 DeducedTemplateArgument Result = checkDeducedTemplateArguments(
1147 S.Context, OldPack, NewPack, DeducePackIfNotAlreadyDeduced);
1148
1149 Info.AggregateDeductionCandidateHasMismatchedArity =
1150 OldPack.getKind() == TemplateArgument::Pack &&
1151 NewPack.getKind() == TemplateArgument::Pack &&
1152 OldPack.pack_size() != NewPack.pack_size() && !Result.isNull();
1153
1154 // If we deferred a deduction of this pack, check that one now too.
1155 if (!Result.isNull() && !Pack.DeferredDeduction.isNull()) {
1156 OldPack = Result;
1157 NewPack = Pack.DeferredDeduction;
1158 Result = checkDeducedTemplateArguments(S.Context, OldPack, NewPack);
1159 }
1160
1161 NamedDecl *Param = TemplateParams->getParam(Pack.Index);
1162 if (Result.isNull()) {
1163 Info.Param = makeTemplateParameter(Param);
1164 Info.FirstArg = OldPack;
1165 Info.SecondArg = NewPack;
1166 return TemplateDeductionResult::Inconsistent;
1167 }
1168
1169 // If we have a pre-expanded pack and we didn't deduce enough elements
1170 // for it, fail deduction.
1171 if (UnsignedOrNone Expansions = getExpandedPackSize(Param)) {
1172 if (*Expansions != PackElements) {
1173 Info.Param = makeTemplateParameter(Param);
1174 Info.FirstArg = Result;
1175 return TemplateDeductionResult::IncompletePack;
1176 }
1177 }
1178
1179 *Loc = Result;
1180 }
1181
1182 return TemplateDeductionResult::Success;
1183 }
1184
1185private:
1186 Sema &S;
1187 TemplateParameterList *TemplateParams;
1188 SmallVectorImpl<DeducedTemplateArgument> &Deduced;
1189 TemplateDeductionInfo &Info;
1190 unsigned PackElements = 0;
1191 bool IsPartiallyExpanded = false;
1192 bool DeducePackIfNotAlreadyDeduced = false;
1193 bool DeducedFromEarlierParameter = false;
1194 bool FinishingDeduction = false;
1195 /// The number of expansions, if we have a fully-expanded pack in this scope.
1196 UnsignedOrNone FixedNumExpansions = std::nullopt;
1197
1198 SmallVector<DeducedPack, 2> Packs;
1199};
1200
1201} // namespace
1202
1203template <class T>
1205 Sema &S, TemplateParameterList *TemplateParams, ArrayRef<QualType> Params,
1208 bool FinishingDeduction, T &&DeductFunc) {
1209 // C++0x [temp.deduct.type]p10:
1210 // Similarly, if P has a form that contains (T), then each parameter type
1211 // Pi of the respective parameter-type- list of P is compared with the
1212 // corresponding parameter type Ai of the corresponding parameter-type-list
1213 // of A. [...]
1214 unsigned ArgIdx = 0, ParamIdx = 0;
1215 for (; ParamIdx != Params.size(); ++ParamIdx) {
1216 // Check argument types.
1217 const PackExpansionType *Expansion
1218 = dyn_cast<PackExpansionType>(Params[ParamIdx]);
1219 if (!Expansion) {
1220 // Simple case: compare the parameter and argument types at this point.
1221
1222 // Make sure we have an argument.
1223 if (ArgIdx >= Args.size())
1225
1226 if (isa<PackExpansionType>(Args[ArgIdx])) {
1227 // C++0x [temp.deduct.type]p22:
1228 // If the original function parameter associated with A is a function
1229 // parameter pack and the function parameter associated with P is not
1230 // a function parameter pack, then template argument deduction fails.
1232 }
1233
1235 DeductFunc(S, TemplateParams, ParamIdx, ArgIdx,
1236 Params[ParamIdx].getUnqualifiedType(),
1237 Args[ArgIdx].getUnqualifiedType(), Info, Deduced, POK);
1239 return Result;
1240
1241 ++ArgIdx;
1242 continue;
1243 }
1244
1245 // C++0x [temp.deduct.type]p10:
1246 // If the parameter-declaration corresponding to Pi is a function
1247 // parameter pack, then the type of its declarator- id is compared with
1248 // each remaining parameter type in the parameter-type-list of A. Each
1249 // comparison deduces template arguments for subsequent positions in the
1250 // template parameter packs expanded by the function parameter pack.
1251
1252 QualType Pattern = Expansion->getPattern();
1253 PackDeductionScope PackScope(S, TemplateParams, Deduced, Info, Pattern,
1254 /*DeducePackIfNotAlreadyDeduced=*/false,
1255 FinishingDeduction);
1256
1257 // A pack scope with fixed arity is not really a pack any more, so is not
1258 // a non-deduced context.
1259 if (ParamIdx + 1 == Params.size() || PackScope.hasFixedArity()) {
1260 for (; ArgIdx < Args.size() && PackScope.hasNextElement(); ++ArgIdx) {
1261 // Deduce template arguments from the pattern.
1262 if (TemplateDeductionResult Result = DeductFunc(
1263 S, TemplateParams, ParamIdx, ArgIdx,
1264 Pattern.getUnqualifiedType(), Args[ArgIdx].getUnqualifiedType(),
1265 Info, Deduced, POK);
1267 return Result;
1268 PackScope.nextPackElement();
1269 }
1270 } else {
1271 // C++0x [temp.deduct.type]p5:
1272 // The non-deduced contexts are:
1273 // - A function parameter pack that does not occur at the end of the
1274 // parameter-declaration-clause.
1275 //
1276 // FIXME: There is no wording to say what we should do in this case. We
1277 // choose to resolve this by applying the same rule that is applied for a
1278 // function call: that is, deduce all contained packs to their
1279 // explicitly-specified values (or to <> if there is no such value).
1280 //
1281 // This is seemingly-arbitrarily different from the case of a template-id
1282 // with a non-trailing pack-expansion in its arguments, which renders the
1283 // entire template-argument-list a non-deduced context.
1284
1285 // If the parameter type contains an explicitly-specified pack that we
1286 // could not expand, skip the number of parameters notionally created
1287 // by the expansion.
1288 UnsignedOrNone NumExpansions = Expansion->getNumExpansions();
1289 if (NumExpansions && !PackScope.isPartiallyExpanded()) {
1290 for (unsigned I = 0; I != *NumExpansions && ArgIdx < Args.size();
1291 ++I, ++ArgIdx)
1292 PackScope.nextPackElement();
1293 }
1294 }
1295
1296 // Build argument packs for each of the parameter packs expanded by this
1297 // pack expansion.
1298 if (auto Result = PackScope.finish();
1300 return Result;
1301 }
1302
1303 // DR692, DR1395
1304 // C++0x [temp.deduct.type]p10:
1305 // If the parameter-declaration corresponding to P_i ...
1306 // During partial ordering, if Ai was originally a function parameter pack:
1307 // - if P does not contain a function parameter type corresponding to Ai then
1308 // Ai is ignored;
1309 if (POK == PartialOrderingKind::Call && ArgIdx + 1 == Args.size() &&
1310 isa<PackExpansionType>(Args[ArgIdx]))
1312
1313 // Make sure we don't have any extra arguments.
1314 if (ArgIdx < Args.size())
1316
1318}
1319
1320/// Deduce the template arguments by comparing the list of parameter
1321/// types to the list of argument types, as in the parameter-type-lists of
1322/// function types (C++ [temp.deduct.type]p10).
1323///
1324/// \param S The semantic analysis object within which we are deducing
1325///
1326/// \param TemplateParams The template parameters that we are deducing
1327///
1328/// \param Params The list of parameter types
1329///
1330/// \param Args The list of argument types
1331///
1332/// \param Info information about the template argument deduction itself
1333///
1334/// \param Deduced the deduced template arguments
1335///
1336/// \param TDF bitwise OR of the TemplateDeductionFlags bits that describe
1337/// how template argument deduction is performed.
1338///
1339/// \param PartialOrdering If true, we are performing template argument
1340/// deduction for during partial ordering for a call
1341/// (C++0x [temp.deduct.partial]).
1342///
1343/// \param HasDeducedAnyParam If set, the object pointed at will indicate
1344/// whether any template parameter was deduced.
1345///
1346/// \param HasDeducedParam If set, the bit vector will be used to represent
1347/// which template parameters were deduced, in order.
1348///
1349/// \returns the result of template argument deduction so far. Note that a
1350/// "success" result means that template argument deduction has not yet failed,
1351/// but it may still fail, later, for other reasons.
1353 Sema &S, TemplateParameterList *TemplateParams, ArrayRef<QualType> Params,
1356 PartialOrderingKind POK, bool *HasDeducedAnyParam,
1357 llvm::SmallBitVector *HasDeducedParam) {
1358 return ::DeduceForEachType(
1359 S, TemplateParams, Params, Args, Info, Deduced, POK,
1360 /*FinishingDeduction=*/false,
1361 [&](Sema &S, TemplateParameterList *TemplateParams, int ParamIdx,
1362 int ArgIdx, QualType P, QualType A, TemplateDeductionInfo &Info,
1364 PartialOrderingKind POK) {
1365 bool HasDeducedAnyParamCopy = false;
1367 S, TemplateParams, P, A, Info, Deduced, TDF, POK,
1368 /*DeducedFromArrayBound=*/false, &HasDeducedAnyParamCopy);
1369 if (HasDeducedAnyParam && HasDeducedAnyParamCopy)
1370 *HasDeducedAnyParam = true;
1371 if (HasDeducedParam && HasDeducedAnyParamCopy)
1372 (*HasDeducedParam)[ParamIdx] = true;
1373 return TDR;
1374 });
1375}
1376
1377/// Determine whether the parameter has qualifiers that the argument
1378/// lacks. Put another way, determine whether there is no way to add
1379/// a deduced set of qualifiers to the ParamType that would result in
1380/// its qualifiers matching those of the ArgType.
1382 QualType ArgType) {
1383 Qualifiers ParamQs = ParamType.getQualifiers();
1384 Qualifiers ArgQs = ArgType.getQualifiers();
1385
1386 if (ParamQs == ArgQs)
1387 return false;
1388
1389 // Mismatched (but not missing) Objective-C GC attributes.
1390 if (ParamQs.getObjCGCAttr() != ArgQs.getObjCGCAttr() &&
1391 ParamQs.hasObjCGCAttr())
1392 return true;
1393
1394 // Mismatched (but not missing) address spaces.
1395 if (ParamQs.getAddressSpace() != ArgQs.getAddressSpace() &&
1396 ParamQs.hasAddressSpace())
1397 return true;
1398
1399 // Mismatched (but not missing) Objective-C lifetime qualifiers.
1400 if (ParamQs.getObjCLifetime() != ArgQs.getObjCLifetime() &&
1401 ParamQs.hasObjCLifetime())
1402 return true;
1403
1404 // CVR qualifiers inconsistent or a superset.
1405 return (ParamQs.getCVRQualifiers() & ~ArgQs.getCVRQualifiers()) != 0;
1406}
1407
1409 const FunctionType *PF = P->getAs<FunctionType>(),
1410 *AF = A->getAs<FunctionType>();
1411
1412 // Just compare if not functions.
1413 if (!PF || !AF)
1414 return Context.hasSameType(P, A);
1415
1416 // Noreturn and noexcept adjustment.
1417 if (QualType AdjustedParam; TryFunctionConversion(P, A, AdjustedParam))
1418 P = AdjustedParam;
1419
1420 // FIXME: Compatible calling conventions.
1421 return Context.hasSameFunctionTypeIgnoringExceptionSpec(P, A);
1422}
1423
1424/// Get the index of the first template parameter that was originally from the
1425/// innermost template-parameter-list. This is 0 except when we concatenate
1426/// the template parameter lists of a class template and a constructor template
1427/// when forming an implicit deduction guide.
1429 auto *Guide = dyn_cast<CXXDeductionGuideDecl>(FTD->getTemplatedDecl());
1430 if (!Guide || !Guide->isImplicit())
1431 return 0;
1432 return Guide->getDeducedTemplate()->getTemplateParameters()->size();
1433}
1434
1435/// Determine whether a type denotes a forwarding reference.
1436static bool isForwardingReference(QualType Param, unsigned FirstInnerIndex) {
1437 // C++1z [temp.deduct.call]p3:
1438 // A forwarding reference is an rvalue reference to a cv-unqualified
1439 // template parameter that does not represent a template parameter of a
1440 // class template.
1441 if (auto *ParamRef = Param->getAs<RValueReferenceType>()) {
1442 if (ParamRef->getPointeeType().getQualifiers())
1443 return false;
1444 auto *TypeParm =
1445 ParamRef->getPointeeType()->getAsCanonical<TemplateTypeParmType>();
1446 return TypeParm && TypeParm->getIndex() >= FirstInnerIndex;
1447 }
1448 return false;
1449}
1450
1451/// Attempt to deduce the template arguments by checking the base types
1452/// according to (C++20 [temp.deduct.call] p4b3.
1453///
1454/// \param S the semantic analysis object within which we are deducing.
1455///
1456/// \param RD the top level record object we are deducing against.
1457///
1458/// \param TemplateParams the template parameters that we are deducing.
1459///
1460/// \param P the template specialization parameter type.
1461///
1462/// \param Info information about the template argument deduction itself.
1463///
1464/// \param Deduced the deduced template arguments.
1465///
1466/// \returns the result of template argument deduction with the bases. "invalid"
1467/// means no matches, "success" found a single item, and the
1468/// "MiscellaneousDeductionFailure" result happens when the match is ambiguous.
1471 TemplateParameterList *TemplateParams, QualType P,
1474 bool *HasDeducedAnyParam) {
1475 // C++14 [temp.deduct.call] p4b3:
1476 // If P is a class and P has the form simple-template-id, then the
1477 // transformed A can be a derived class of the deduced A. Likewise if
1478 // P is a pointer to a class of the form simple-template-id, the
1479 // transformed A can be a pointer to a derived class pointed to by the
1480 // deduced A. However, if there is a class C that is a (direct or
1481 // indirect) base class of D and derived (directly or indirectly) from a
1482 // class B and that would be a valid deduced A, the deduced A cannot be
1483 // B or pointer to B, respectively.
1484 //
1485 // These alternatives are considered only if type deduction would
1486 // otherwise fail. If they yield more than one possible deduced A, the
1487 // type deduction fails.
1488
1489 // Use a breadth-first search through the bases to collect the set of
1490 // successful matches. Visited contains the set of nodes we have already
1491 // visited, while ToVisit is our stack of records that we still need to
1492 // visit. Matches contains a list of matches that have yet to be
1493 // disqualified.
1496 // We iterate over this later, so we have to use MapVector to ensure
1497 // determinism.
1498 struct MatchValue {
1500 bool HasDeducedAnyParam;
1501 };
1502 llvm::MapVector<const CXXRecordDecl *, MatchValue> Matches;
1503
1504 auto AddBases = [&Visited, &ToVisit](const CXXRecordDecl *RD) {
1505 for (const auto &Base : RD->bases()) {
1506 QualType T = Base.getType();
1507 assert(T->isRecordType() && "Base class that isn't a record?");
1508 if (Visited.insert(T->getAsCXXRecordDecl()).second)
1509 ToVisit.push_back(T);
1510 }
1511 };
1512
1513 // Set up the loop by adding all the bases.
1514 AddBases(RD);
1515
1516 // Search each path of bases until we either run into a successful match
1517 // (where all bases of it are invalid), or we run out of bases.
1518 while (!ToVisit.empty()) {
1519 QualType NextT = ToVisit.pop_back_val();
1520
1522 Deduced.end());
1524 bool HasDeducedAnyParamCopy = false;
1526 S, TemplateParams, P, NextT, BaseInfo, PartialOrdering, DeducedCopy,
1527 &HasDeducedAnyParamCopy);
1528
1529 // If this was a successful deduction, add it to the list of matches,
1530 // otherwise we need to continue searching its bases.
1531 const CXXRecordDecl *RD = NextT->getAsCXXRecordDecl();
1533 Matches.insert({RD, {DeducedCopy, HasDeducedAnyParamCopy}});
1534 else
1535 AddBases(RD);
1536 }
1537
1538 // At this point, 'Matches' contains a list of seemingly valid bases, however
1539 // in the event that we have more than 1 match, it is possible that the base
1540 // of one of the matches might be disqualified for being a base of another
1541 // valid match. We can count on cyclical instantiations being invalid to
1542 // simplify the disqualifications. That is, if A & B are both matches, and B
1543 // inherits from A (disqualifying A), we know that A cannot inherit from B.
1544 if (Matches.size() > 1) {
1545 Visited.clear();
1546 for (const auto &Match : Matches)
1547 AddBases(Match.first);
1548
1549 // We can give up once we have a single item (or have run out of things to
1550 // search) since cyclical inheritance isn't valid.
1551 while (Matches.size() > 1 && !ToVisit.empty()) {
1552 const CXXRecordDecl *RD = ToVisit.pop_back_val()->getAsCXXRecordDecl();
1553 Matches.erase(RD);
1554
1555 // Always add all bases, since the inheritance tree can contain
1556 // disqualifications for multiple matches.
1557 AddBases(RD);
1558 }
1559 }
1560
1561 if (Matches.empty())
1563 if (Matches.size() > 1)
1565
1566 std::swap(Matches.front().second.Deduced, Deduced);
1567 if (bool HasDeducedAnyParamCopy = Matches.front().second.HasDeducedAnyParam;
1568 HasDeducedAnyParamCopy && HasDeducedAnyParam)
1569 *HasDeducedAnyParam = HasDeducedAnyParamCopy;
1571}
1572
1573/// When propagating a partial ordering kind into a NonCall context,
1574/// this is used to downgrade a 'Call' into a 'NonCall', so that
1575/// the kind still reflects whether we are in a partial ordering context.
1580
1581/// Deduce the template arguments by comparing the parameter type and
1582/// the argument type (C++ [temp.deduct.type]).
1583///
1584/// \param S the semantic analysis object within which we are deducing
1585///
1586/// \param TemplateParams the template parameters that we are deducing
1587///
1588/// \param P the parameter type
1589///
1590/// \param A the argument type
1591///
1592/// \param Info information about the template argument deduction itself
1593///
1594/// \param Deduced the deduced template arguments
1595///
1596/// \param TDF bitwise OR of the TemplateDeductionFlags bits that describe
1597/// how template argument deduction is performed.
1598///
1599/// \param PartialOrdering Whether we're performing template argument deduction
1600/// in the context of partial ordering (C++0x [temp.deduct.partial]).
1601///
1602/// \returns the result of template argument deduction so far. Note that a
1603/// "success" result means that template argument deduction has not yet failed,
1604/// but it may still fail, later, for other reasons.
1606 Sema &S, TemplateParameterList *TemplateParams, QualType P, QualType A,
1609 PartialOrderingKind POK, bool DeducedFromArrayBound,
1610 bool *HasDeducedAnyParam) {
1611
1612 // If the argument type is a pack expansion, look at its pattern.
1613 // This isn't explicitly called out
1614 if (const auto *AExp = dyn_cast<PackExpansionType>(A))
1615 A = AExp->getPattern();
1617
1618 if (POK == PartialOrderingKind::Call) {
1619 // C++11 [temp.deduct.partial]p5:
1620 // Before the partial ordering is done, certain transformations are
1621 // performed on the types used for partial ordering:
1622 // - If P is a reference type, P is replaced by the type referred to.
1623 const ReferenceType *PRef = P->getAs<ReferenceType>();
1624 if (PRef)
1625 P = PRef->getPointeeType();
1626
1627 // - If A is a reference type, A is replaced by the type referred to.
1628 const ReferenceType *ARef = A->getAs<ReferenceType>();
1629 if (ARef)
1630 A = A->getPointeeType();
1631
1632 if (PRef && ARef && S.Context.hasSameUnqualifiedType(P, A)) {
1633 // C++11 [temp.deduct.partial]p9:
1634 // If, for a given type, deduction succeeds in both directions (i.e.,
1635 // the types are identical after the transformations above) and both
1636 // P and A were reference types [...]:
1637 // - if [one type] was an lvalue reference and [the other type] was
1638 // not, [the other type] is not considered to be at least as
1639 // specialized as [the first type]
1640 // - if [one type] is more cv-qualified than [the other type],
1641 // [the other type] is not considered to be at least as specialized
1642 // as [the first type]
1643 // Objective-C ARC adds:
1644 // - [one type] has non-trivial lifetime, [the other type] has
1645 // __unsafe_unretained lifetime, and the types are otherwise
1646 // identical
1647 //
1648 // A is "considered to be at least as specialized" as P iff deduction
1649 // succeeds, so we model this as a deduction failure. Note that
1650 // [the first type] is P and [the other type] is A here; the standard
1651 // gets this backwards.
1652 Qualifiers PQuals = P.getQualifiers(), AQuals = A.getQualifiers();
1653 if ((PRef->isLValueReferenceType() && !ARef->isLValueReferenceType()) ||
1654 PQuals.isStrictSupersetOf(AQuals) ||
1655 (PQuals.hasNonTrivialObjCLifetime() &&
1656 AQuals.getObjCLifetime() == Qualifiers::OCL_ExplicitNone &&
1657 PQuals.withoutObjCLifetime() == AQuals.withoutObjCLifetime())) {
1658 Info.FirstArg = TemplateArgument(P);
1659 Info.SecondArg = TemplateArgument(A);
1661 }
1662 }
1663 Qualifiers DiscardedQuals;
1664 // C++11 [temp.deduct.partial]p7:
1665 // Remove any top-level cv-qualifiers:
1666 // - If P is a cv-qualified type, P is replaced by the cv-unqualified
1667 // version of P.
1668 P = S.Context.getUnqualifiedArrayType(P, DiscardedQuals);
1669 // - If A is a cv-qualified type, A is replaced by the cv-unqualified
1670 // version of A.
1671 A = S.Context.getUnqualifiedArrayType(A, DiscardedQuals);
1672 } else {
1673 // C++0x [temp.deduct.call]p4 bullet 1:
1674 // - If the original P is a reference type, the deduced A (i.e., the type
1675 // referred to by the reference) can be more cv-qualified than the
1676 // transformed A.
1677 if (TDF & TDF_ParamWithReferenceType) {
1678 Qualifiers Quals;
1679 QualType UnqualP = S.Context.getUnqualifiedArrayType(P, Quals);
1681 P = S.Context.getQualifiedType(UnqualP, Quals);
1682 }
1683
1684 if ((TDF & TDF_TopLevelParameterTypeList) && !P->isFunctionType()) {
1685 // C++0x [temp.deduct.type]p10:
1686 // If P and A are function types that originated from deduction when
1687 // taking the address of a function template (14.8.2.2) or when deducing
1688 // template arguments from a function declaration (14.8.2.6) and Pi and
1689 // Ai are parameters of the top-level parameter-type-list of P and A,
1690 // respectively, Pi is adjusted if it is a forwarding reference and Ai
1691 // is an lvalue reference, in
1692 // which case the type of Pi is changed to be the template parameter
1693 // type (i.e., T&& is changed to simply T). [ Note: As a result, when
1694 // Pi is T&& and Ai is X&, the adjusted Pi will be T, causing T to be
1695 // deduced as X&. - end note ]
1697 if (isForwardingReference(P, /*FirstInnerIndex=*/0) &&
1699 P = P->getPointeeType();
1700 }
1701 }
1702
1703 // C++ [temp.deduct.type]p9:
1704 // A template type argument T, a template template argument TT or a
1705 // template non-type argument i can be deduced if P and A have one of
1706 // the following forms:
1707 //
1708 // T
1709 // cv-list T
1710 if (const auto *TTP = P->getAsCanonical<TemplateTypeParmType>()) {
1711 // Just skip any attempts to deduce from a placeholder type or a parameter
1712 // at a different depth.
1713 if (A->isPlaceholderType() || Info.getDeducedDepth() != TTP->getDepth())
1715
1716 unsigned Index = TTP->getIndex();
1717
1718 // If the argument type is an array type, move the qualifiers up to the
1719 // top level, so they can be matched with the qualifiers on the parameter.
1720 if (A->isArrayType()) {
1721 Qualifiers Quals;
1722 A = S.Context.getUnqualifiedArrayType(A, Quals);
1723 if (Quals)
1724 A = S.Context.getQualifiedType(A, Quals);
1725 }
1726
1727 // The argument type can not be less qualified than the parameter
1728 // type.
1729 if (!(TDF & TDF_IgnoreQualifiers) &&
1731 Info.Param = cast<TemplateTypeParmDecl>(TemplateParams->getParam(Index));
1732 Info.FirstArg = TemplateArgument(P);
1733 Info.SecondArg = TemplateArgument(A);
1735 }
1736
1737 // Do not match a function type with a cv-qualified type.
1738 // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1584
1739 if (A->isFunctionType() && P.hasQualifiers())
1741
1742 assert(TTP->getDepth() == Info.getDeducedDepth() &&
1743 "saw template type parameter with wrong depth");
1744 assert(A->getCanonicalTypeInternal() != S.Context.OverloadTy &&
1745 "Unresolved overloaded function");
1746 QualType DeducedType = A;
1747
1748 // Remove any qualifiers on the parameter from the deduced type.
1749 // We checked the qualifiers for consistency above.
1750 Qualifiers DeducedQs = DeducedType.getQualifiers();
1751 Qualifiers ParamQs = P.getQualifiers();
1752 DeducedQs.removeCVRQualifiers(ParamQs.getCVRQualifiers());
1753 if (ParamQs.hasObjCGCAttr())
1754 DeducedQs.removeObjCGCAttr();
1755 if (ParamQs.hasAddressSpace())
1756 DeducedQs.removeAddressSpace();
1757 if (ParamQs.hasObjCLifetime())
1758 DeducedQs.removeObjCLifetime();
1759
1760 // Objective-C ARC:
1761 // If template deduction would produce a lifetime qualifier on a type
1762 // that is not a lifetime type, template argument deduction fails.
1763 if (ParamQs.hasObjCLifetime() && !DeducedType->isObjCLifetimeType() &&
1764 !DeducedType->isDependentType()) {
1765 Info.Param = cast<TemplateTypeParmDecl>(TemplateParams->getParam(Index));
1766 Info.FirstArg = TemplateArgument(P);
1767 Info.SecondArg = TemplateArgument(A);
1769 }
1770
1771 // Objective-C ARC:
1772 // If template deduction would produce an argument type with lifetime type
1773 // but no lifetime qualifier, the __strong lifetime qualifier is inferred.
1774 if (S.getLangOpts().ObjCAutoRefCount && DeducedType->isObjCLifetimeType() &&
1775 !DeducedQs.hasObjCLifetime())
1777
1778 DeducedType =
1779 S.Context.getQualifiedType(DeducedType.getUnqualifiedType(), DeducedQs);
1780
1781 DeducedTemplateArgument NewDeduced(DeducedType, DeducedFromArrayBound);
1783 checkDeducedTemplateArguments(S.Context, Deduced[Index], NewDeduced);
1784 if (Result.isNull()) {
1785 // We can also get inconsistencies when matching NTTP type.
1786 switch (NamedDecl *Param = TemplateParams->getParam(Index);
1787 Param->getKind()) {
1788 case Decl::TemplateTypeParm:
1789 Info.Param = cast<TemplateTypeParmDecl>(Param);
1790 break;
1791 case Decl::NonTypeTemplateParm:
1793 break;
1794 case Decl::TemplateTemplateParm:
1796 break;
1797 default:
1798 llvm_unreachable("unexpected kind");
1799 }
1800 Info.FirstArg = Deduced[Index];
1801 Info.SecondArg = NewDeduced;
1803 }
1804
1805 Deduced[Index] = Result;
1806 if (HasDeducedAnyParam)
1807 *HasDeducedAnyParam = true;
1809 }
1810
1811 // Set up the template argument deduction information for a failure.
1812 Info.FirstArg = TemplateArgument(P);
1813 Info.SecondArg = TemplateArgument(A);
1814
1815 // If the parameter is an already-substituted template parameter
1816 // pack, do nothing: we don't know which of its arguments to look
1817 // at, so we have to wait until all of the parameter packs in this
1818 // expansion have arguments.
1819 if (P->getAs<SubstTemplateTypeParmPackType>())
1821
1822 // Check the cv-qualifiers on the parameter and argument types.
1823 if (!(TDF & TDF_IgnoreQualifiers)) {
1824 if (TDF & TDF_ParamWithReferenceType) {
1827 } else if (TDF & TDF_ArgWithReferenceType) {
1828 // C++ [temp.deduct.conv]p4:
1829 // If the original A is a reference type, A can be more cv-qualified
1830 // than the deduced A
1832 S.getASTContext()))
1834
1835 // Strip out all extra qualifiers from the argument to figure out the
1836 // type we're converting to, prior to the qualification conversion.
1837 Qualifiers Quals;
1838 A = S.Context.getUnqualifiedArrayType(A, Quals);
1840 } else if (!IsPossiblyOpaquelyQualifiedType(P)) {
1841 if (P.getCVRQualifiers() != A.getCVRQualifiers())
1843 }
1844 }
1845
1846 // If the parameter type is not dependent, there is nothing to deduce.
1847 if (!P->isDependentType()) {
1848 if (TDF & TDF_SkipNonDependent)
1851 : S.Context.hasSameType(P, A))
1856 if (!(TDF & TDF_IgnoreQualifiers))
1858 // Otherwise, when ignoring qualifiers, the types not having the same
1859 // unqualified type does not mean they do not match, so in this case we
1860 // must keep going and analyze with a non-dependent parameter type.
1861 }
1862
1863 switch (P.getCanonicalType()->getTypeClass()) {
1864 // Non-canonical types cannot appear here.
1865#define NON_CANONICAL_TYPE(Class, Base) \
1866 case Type::Class: llvm_unreachable("deducing non-canonical type: " #Class);
1867#define TYPE(Class, Base)
1868#include "clang/AST/TypeNodes.inc"
1869
1870 case Type::TemplateTypeParm:
1871 case Type::SubstTemplateTypeParmPack:
1872 case Type::SubstBuiltinTemplatePack:
1873 llvm_unreachable("Type nodes handled above");
1874
1875 case Type::Auto:
1876 // C++23 [temp.deduct.funcaddr]/3:
1877 // A placeholder type in the return type of a function template is a
1878 // non-deduced context.
1879 // There's no corresponding wording for [temp.deduct.decl], but we treat
1880 // it the same to match other compilers.
1881 if (P->isDependentType())
1883 [[fallthrough]];
1884 case Type::Builtin:
1885 case Type::VariableArray:
1886 case Type::Vector:
1887 case Type::FunctionNoProto:
1888 case Type::Record:
1889 case Type::Enum:
1890 case Type::ObjCObject:
1891 case Type::ObjCInterface:
1892 case Type::ObjCObjectPointer:
1893 case Type::BitInt:
1894 return (TDF & TDF_SkipNonDependent) ||
1895 ((TDF & TDF_IgnoreQualifiers)
1897 : S.Context.hasSameType(P, A))
1900
1901 // _Complex T [placeholder extension]
1902 case Type::Complex: {
1903 const auto *CP = P->castAs<ComplexType>(), *CA = A->getAs<ComplexType>();
1904 if (!CA)
1907 S, TemplateParams, CP->getElementType(), CA->getElementType(), Info,
1909 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
1910 }
1911
1912 // _Atomic T [extension]
1913 case Type::Atomic: {
1914 const auto *PA = P->castAs<AtomicType>(), *AA = A->getAs<AtomicType>();
1915 if (!AA)
1918 S, TemplateParams, PA->getValueType(), AA->getValueType(), Info,
1920 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
1921 }
1922
1923 // T *
1924 case Type::Pointer: {
1925 QualType PointeeType;
1926 if (const auto *PA = A->getAs<PointerType>()) {
1927 PointeeType = PA->getPointeeType();
1928 } else if (const auto *PA = A->getAs<ObjCObjectPointerType>()) {
1929 PointeeType = PA->getPointeeType();
1930 } else {
1932 }
1934 S, TemplateParams, P->castAs<PointerType>()->getPointeeType(),
1935 PointeeType, Info, Deduced,
1938 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
1939 }
1940
1941 // T &
1942 case Type::LValueReference: {
1943 const auto *RP = P->castAs<LValueReferenceType>(),
1944 *RA = A->getAs<LValueReferenceType>();
1945 if (!RA)
1947
1949 S, TemplateParams, RP->getPointeeType(), RA->getPointeeType(), Info,
1951 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
1952 }
1953
1954 // T && [C++0x]
1955 case Type::RValueReference: {
1956 const auto *RP = P->castAs<RValueReferenceType>(),
1957 *RA = A->getAs<RValueReferenceType>();
1958 if (!RA)
1960
1962 S, TemplateParams, RP->getPointeeType(), RA->getPointeeType(), Info,
1964 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
1965 }
1966
1967 // T [] (implied, but not stated explicitly)
1968 case Type::IncompleteArray: {
1969 const auto *IAA = S.Context.getAsIncompleteArrayType(A);
1970 if (!IAA)
1972
1973 const auto *IAP = S.Context.getAsIncompleteArrayType(P);
1974 assert(IAP && "Template parameter not of incomplete array type");
1975
1977 S, TemplateParams, IAP->getElementType(), IAA->getElementType(), Info,
1980 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
1981 }
1982
1983 // T [integer-constant]
1984 case Type::ConstantArray: {
1985 const auto *CAA = S.Context.getAsConstantArrayType(A),
1986 *CAP = S.Context.getAsConstantArrayType(P);
1987 assert(CAP);
1988 if (!CAA || CAA->getSize() != CAP->getSize())
1990
1992 S, TemplateParams, CAP->getElementType(), CAA->getElementType(), Info,
1995 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
1996 }
1997
1998 // type [i]
1999 case Type::DependentSizedArray: {
2000 const auto *AA = S.Context.getAsArrayType(A);
2001 if (!AA)
2003
2004 // Check the element type of the arrays
2005 const auto *DAP = S.Context.getAsDependentSizedArrayType(P);
2006 assert(DAP);
2008 S, TemplateParams, DAP->getElementType(), AA->getElementType(),
2009 Info, Deduced, TDF & TDF_IgnoreQualifiers,
2011 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2013 return Result;
2014
2015 // Determine the array bound is something we can deduce.
2017 getNTTParameterFromExpr(Info, DAP->getSizeExpr());
2018 if (!NTTP)
2020
2021 // We can perform template argument deduction for the given non-type
2022 // template parameter.
2023 assert(NTTP.getDepth() == Info.getDeducedDepth() &&
2024 "saw non-type template parameter with wrong depth");
2025 if (const auto *CAA = dyn_cast<ConstantArrayType>(AA)) {
2026 llvm::APSInt Size(CAA->getSize());
2028 S, TemplateParams, NTTP, Size, S.Context.getSizeType(),
2029 /*ArrayBound=*/true, Info, POK != PartialOrderingKind::None,
2030 Deduced, HasDeducedAnyParam);
2031 }
2032 if (const auto *DAA = dyn_cast<DependentSizedArrayType>(AA))
2033 if (DAA->getSizeExpr())
2035 S, TemplateParams, NTTP, DAA->getSizeExpr(), Info,
2036 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2037
2038 // Incomplete type does not match a dependently-sized array type
2040 }
2041
2042 // type(*)(T)
2043 // T(*)()
2044 // T(*)(T)
2045 case Type::FunctionProto: {
2046 const auto *FPP = P->castAs<FunctionProtoType>(),
2047 *FPA = A->getAs<FunctionProtoType>();
2048 if (!FPA)
2050
2051 if (FPP->getMethodQuals() != FPA->getMethodQuals() ||
2052 FPP->getRefQualifier() != FPA->getRefQualifier() ||
2053 FPP->isVariadic() != FPA->isVariadic())
2055
2056 // Check return types.
2058 S, TemplateParams, FPP->getReturnType(), FPA->getReturnType(),
2060 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2062 return Result;
2063
2064 // Check parameter types.
2066 S, TemplateParams, FPP->param_types(), FPA->param_types(), Info,
2068 HasDeducedAnyParam,
2069 /*HasDeducedParam=*/nullptr);
2071 return Result;
2072
2075
2076 // FIXME: Per core-2016/10/1019 (no corresponding core issue yet), permit
2077 // deducing through the noexcept-specifier if it's part of the canonical
2078 // type. libstdc++ relies on this.
2079 Expr *NoexceptExpr = FPP->getNoexceptExpr();
2081 NoexceptExpr ? getNTTParameterFromExpr(Info, NoexceptExpr)
2082 : nullptr) {
2083 assert(NTTP.getDepth() == Info.getDeducedDepth() &&
2084 "saw non-type template parameter with wrong depth");
2085
2086 llvm::APSInt Noexcept(1);
2087 switch (FPA->canThrow()) {
2088 case CT_Cannot:
2089 Noexcept = 1;
2090 [[fallthrough]];
2091
2092 case CT_Can:
2093 // We give E in noexcept(E) the "deduced from array bound" treatment.
2094 // FIXME: Should we?
2096 S, TemplateParams, NTTP, Noexcept, S.Context.BoolTy,
2097 /*DeducedFromArrayBound=*/true, Info,
2098 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2099
2100 case CT_Dependent:
2101 if (Expr *ArgNoexceptExpr = FPA->getNoexceptExpr())
2103 S, TemplateParams, NTTP, ArgNoexceptExpr, Info,
2104 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2105 // Can't deduce anything from throw(T...).
2106 break;
2107 }
2108 }
2109 // FIXME: Detect non-deduced exception specification mismatches?
2110 //
2111 // Careful about [temp.deduct.call] and [temp.deduct.conv], which allow
2112 // top-level differences in noexcept-specifications.
2113
2115 }
2116
2117 case Type::InjectedClassName:
2118 // Treat a template's injected-class-name as if the template
2119 // specialization type had been used.
2120
2121 // template-name<T> (where template-name refers to a class template)
2122 // template-name<i>
2123 // TT<T>
2124 // TT<i>
2125 // TT<>
2126 case Type::TemplateSpecialization: {
2127 // When Arg cannot be a derived class, we can just try to deduce template
2128 // arguments from the template-id.
2129 if (!(TDF & TDF_DerivedClass) || !A->isRecordType())
2130 return DeduceTemplateSpecArguments(S, TemplateParams, P, A, Info,
2132 Deduced, HasDeducedAnyParam);
2133
2135 Deduced.end());
2136
2138 S, TemplateParams, P, A, Info, POK != PartialOrderingKind::None,
2139 Deduced, HasDeducedAnyParam);
2141 return Result;
2142
2143 // We cannot inspect base classes as part of deduction when the type
2144 // is incomplete, so either instantiate any templates necessary to
2145 // complete the type, or skip over it if it cannot be completed.
2146 if (!S.isCompleteType(Info.getLocation(), A))
2147 return Result;
2148
2149 const CXXRecordDecl *RD = A->getAsCXXRecordDecl();
2150 if (RD->isInvalidDecl())
2151 return Result;
2152
2153 // Reset the incorrectly deduced argument from above.
2154 Deduced = DeducedOrig;
2155
2156 // Check bases according to C++14 [temp.deduct.call] p4b3:
2157 auto BaseResult = DeduceTemplateBases(S, RD, TemplateParams, P, Info,
2159 Deduced, HasDeducedAnyParam);
2161 : Result;
2162 }
2163
2164 // T type::*
2165 // T T::*
2166 // T (type::*)()
2167 // type (T::*)()
2168 // type (type::*)(T)
2169 // type (T::*)(T)
2170 // T (type::*)(T)
2171 // T (T::*)()
2172 // T (T::*)(T)
2173 case Type::MemberPointer: {
2174 const auto *MPP = P->castAs<MemberPointerType>(),
2175 *MPA = A->getAs<MemberPointerType>();
2176 if (!MPA)
2178
2179 QualType PPT = MPP->getPointeeType();
2180 if (PPT->isFunctionType())
2181 S.adjustMemberFunctionCC(PPT, /*HasThisPointer=*/false,
2182 /*IsCtorOrDtor=*/false, Info.getLocation());
2183 QualType APT = MPA->getPointeeType();
2184 if (APT->isFunctionType())
2185 S.adjustMemberFunctionCC(APT, /*HasThisPointer=*/false,
2186 /*IsCtorOrDtor=*/false, Info.getLocation());
2187
2188 unsigned SubTDF = TDF & TDF_IgnoreQualifiers;
2190 S, TemplateParams, PPT, APT, Info, Deduced, SubTDF,
2192 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2194 return Result;
2195
2196 QualType TP =
2197 MPP->isSugared()
2198 ? S.Context.getCanonicalTagType(MPP->getMostRecentCXXRecordDecl())
2199 : QualType(MPP->getQualifier().getAsType(), 0);
2200 assert(!TP.isNull() && "member pointer with non-type class");
2201
2202 QualType TA =
2203 MPA->isSugared()
2204 ? S.Context.getCanonicalTagType(MPA->getMostRecentCXXRecordDecl())
2205 : QualType(MPA->getQualifier().getAsType(), 0)
2207 assert(!TA.isNull() && "member pointer with non-type class");
2208
2210 S, TemplateParams, TP, TA, Info, Deduced, SubTDF,
2212 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2213 }
2214
2215 // (clang extension)
2216 //
2217 // type(^)(T)
2218 // T(^)()
2219 // T(^)(T)
2220 case Type::BlockPointer: {
2221 const auto *BPP = P->castAs<BlockPointerType>(),
2222 *BPA = A->getAs<BlockPointerType>();
2223 if (!BPA)
2226 S, TemplateParams, BPP->getPointeeType(), BPA->getPointeeType(), Info,
2228 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2229 }
2230
2231 // (clang extension)
2232 //
2233 // T __attribute__(((ext_vector_type(<integral constant>))))
2234 case Type::ExtVector: {
2235 const auto *VP = P->castAs<ExtVectorType>();
2236 QualType ElementType;
2237 if (const auto *VA = A->getAs<ExtVectorType>()) {
2238 // Make sure that the vectors have the same number of elements.
2239 if (VP->getNumElements() != VA->getNumElements())
2241 ElementType = VA->getElementType();
2242 } else if (const auto *VA = A->getAs<DependentSizedExtVectorType>()) {
2243 // We can't check the number of elements, since the argument has a
2244 // dependent number of elements. This can only occur during partial
2245 // ordering.
2246 ElementType = VA->getElementType();
2247 } else {
2249 }
2250 // Perform deduction on the element types.
2252 S, TemplateParams, VP->getElementType(), ElementType, Info, Deduced,
2254 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2255 }
2256
2257 case Type::DependentVector: {
2258 const auto *VP = P->castAs<DependentVectorType>();
2259
2260 if (const auto *VA = A->getAs<VectorType>()) {
2261 // Perform deduction on the element types.
2263 S, TemplateParams, VP->getElementType(), VA->getElementType(),
2264 Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),
2265 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2267 return Result;
2268
2269 // Perform deduction on the vector size, if we can.
2271 getNTTParameterFromExpr(Info, VP->getSizeExpr());
2272 if (!NTTP)
2274
2275 llvm::APSInt ArgSize(S.Context.getTypeSize(S.Context.IntTy), false);
2276 ArgSize = VA->getNumElements();
2277 // Note that we use the "array bound" rules here; just like in that
2278 // case, we don't have any particular type for the vector size, but
2279 // we can provide one if necessary.
2281 S, TemplateParams, NTTP, ArgSize, S.Context.UnsignedIntTy, true,
2282 Info, POK != PartialOrderingKind::None, Deduced,
2283 HasDeducedAnyParam);
2284 }
2285
2286 if (const auto *VA = A->getAs<DependentVectorType>()) {
2287 // Perform deduction on the element types.
2289 S, TemplateParams, VP->getElementType(), VA->getElementType(),
2290 Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),
2291 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2293 return Result;
2294
2295 // Perform deduction on the vector size, if we can.
2297 getNTTParameterFromExpr(Info, VP->getSizeExpr());
2298 if (!NTTP)
2300
2302 S, TemplateParams, NTTP, VA->getSizeExpr(), Info,
2303 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2304 }
2305
2307 }
2308
2309 // (clang extension)
2310 //
2311 // T __attribute__(((ext_vector_type(N))))
2312 case Type::DependentSizedExtVector: {
2313 const auto *VP = P->castAs<DependentSizedExtVectorType>();
2314
2315 if (const auto *VA = A->getAs<ExtVectorType>()) {
2316 // Perform deduction on the element types.
2318 S, TemplateParams, VP->getElementType(), VA->getElementType(),
2319 Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),
2320 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2322 return Result;
2323
2324 // Perform deduction on the vector size, if we can.
2326 getNTTParameterFromExpr(Info, VP->getSizeExpr());
2327 if (!NTTP)
2329
2330 llvm::APSInt ArgSize(S.Context.getTypeSize(S.Context.IntTy), false);
2331 ArgSize = VA->getNumElements();
2332 // Note that we use the "array bound" rules here; just like in that
2333 // case, we don't have any particular type for the vector size, but
2334 // we can provide one if necessary.
2336 S, TemplateParams, NTTP, ArgSize, S.Context.IntTy, true, Info,
2337 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2338 }
2339
2340 if (const auto *VA = A->getAs<DependentSizedExtVectorType>()) {
2341 // Perform deduction on the element types.
2343 S, TemplateParams, VP->getElementType(), VA->getElementType(),
2344 Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),
2345 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2347 return Result;
2348
2349 // Perform deduction on the vector size, if we can.
2351 getNTTParameterFromExpr(Info, VP->getSizeExpr());
2352 if (!NTTP)
2354
2356 S, TemplateParams, NTTP, VA->getSizeExpr(), Info,
2357 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2358 }
2359
2361 }
2362
2363 // (clang extension)
2364 //
2365 // T __attribute__((matrix_type(<integral constant>,
2366 // <integral constant>)))
2367 case Type::ConstantMatrix: {
2368 const auto *MP = P->castAs<ConstantMatrixType>(),
2369 *MA = A->getAs<ConstantMatrixType>();
2370 if (!MA)
2372
2373 // Check that the dimensions are the same
2374 if (MP->getNumRows() != MA->getNumRows() ||
2375 MP->getNumColumns() != MA->getNumColumns()) {
2377 }
2378 // Perform deduction on element types.
2380 S, TemplateParams, MP->getElementType(), MA->getElementType(), Info,
2382 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2383 }
2384
2385 case Type::DependentSizedMatrix: {
2386 const auto *MP = P->castAs<DependentSizedMatrixType>();
2387 const auto *MA = A->getAs<MatrixType>();
2388 if (!MA)
2390
2391 // Check the element type of the matrixes.
2393 S, TemplateParams, MP->getElementType(), MA->getElementType(),
2394 Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),
2395 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2397 return Result;
2398
2399 // Try to deduce a matrix dimension.
2400 auto DeduceMatrixArg =
2401 [&S, &Info, &Deduced, &TemplateParams, &HasDeducedAnyParam, POK](
2402 Expr *ParamExpr, const MatrixType *A,
2403 unsigned (ConstantMatrixType::*GetArgDimension)() const,
2404 Expr *(DependentSizedMatrixType::*GetArgDimensionExpr)() const) {
2405 const auto *ACM = dyn_cast<ConstantMatrixType>(A);
2406 const auto *ADM = dyn_cast<DependentSizedMatrixType>(A);
2407 if (!ParamExpr->isValueDependent()) {
2408 std::optional<llvm::APSInt> ParamConst =
2409 ParamExpr->getIntegerConstantExpr(S.Context);
2410 if (!ParamConst)
2412
2413 if (ACM) {
2414 if ((ACM->*GetArgDimension)() == *ParamConst)
2417 }
2418
2419 Expr *ArgExpr = (ADM->*GetArgDimensionExpr)();
2420 if (std::optional<llvm::APSInt> ArgConst =
2421 ArgExpr->getIntegerConstantExpr(S.Context))
2422 if (*ArgConst == *ParamConst)
2425 }
2426
2428 getNTTParameterFromExpr(Info, ParamExpr);
2429 if (!NTTP)
2431
2432 if (ACM) {
2433 llvm::APSInt ArgConst(
2435 ArgConst = (ACM->*GetArgDimension)();
2437 S, TemplateParams, NTTP, ArgConst, S.Context.getSizeType(),
2438 /*ArrayBound=*/true, Info, POK != PartialOrderingKind::None,
2439 Deduced, HasDeducedAnyParam);
2440 }
2441
2443 S, TemplateParams, NTTP, (ADM->*GetArgDimensionExpr)(), Info,
2444 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2445 };
2446
2447 if (auto Result = DeduceMatrixArg(MP->getRowExpr(), MA,
2451 return Result;
2452
2453 return DeduceMatrixArg(MP->getColumnExpr(), MA,
2456 }
2457
2458 // (clang extension)
2459 //
2460 // T __attribute__(((address_space(N))))
2461 case Type::DependentAddressSpace: {
2462 const auto *ASP = P->castAs<DependentAddressSpaceType>();
2463
2464 if (const auto *ASA = A->getAs<DependentAddressSpaceType>()) {
2465 // Perform deduction on the pointer type.
2467 S, TemplateParams, ASP->getPointeeType(), ASA->getPointeeType(),
2468 Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),
2469 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2471 return Result;
2472
2473 // Perform deduction on the address space, if we can.
2475 getNTTParameterFromExpr(Info, ASP->getAddrSpaceExpr());
2476 if (!NTTP)
2478
2480 S, TemplateParams, NTTP, ASA->getAddrSpaceExpr(), Info,
2481 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2482 }
2483
2485 llvm::APSInt ArgAddressSpace(S.Context.getTypeSize(S.Context.IntTy),
2486 false);
2487 ArgAddressSpace = toTargetAddressSpace(A.getAddressSpace());
2488
2489 // Perform deduction on the pointer types.
2491 S, TemplateParams, ASP->getPointeeType(),
2492 S.Context.removeAddrSpaceQualType(A), Info, Deduced, TDF,
2494 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2496 return Result;
2497
2498 // Perform deduction on the address space, if we can.
2500 getNTTParameterFromExpr(Info, ASP->getAddrSpaceExpr());
2501 if (!NTTP)
2503
2505 S, TemplateParams, NTTP, ArgAddressSpace, S.Context.IntTy, true,
2506 Info, POK != PartialOrderingKind::None, Deduced,
2507 HasDeducedAnyParam);
2508 }
2509
2511 }
2512 case Type::DependentBitInt: {
2513 const auto *IP = P->castAs<DependentBitIntType>();
2514
2515 if (const auto *IA = A->getAs<BitIntType>()) {
2516 if (IP->isUnsigned() != IA->isUnsigned())
2518
2520 getNTTParameterFromExpr(Info, IP->getNumBitsExpr());
2521 if (!NTTP)
2523
2524 // Deduce the size parameter of _BitInt as std::size_t
2526 llvm::APSInt ArgSize(S.Context.getTypeSize(T), /*IsUnsigned=*/true);
2527 ArgSize = IA->getNumBits();
2528
2530 S, TemplateParams, NTTP, ArgSize, T, true, Info,
2531 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2532 }
2533
2534 if (const auto *IA = A->getAs<DependentBitIntType>()) {
2535 if (IP->isUnsigned() != IA->isUnsigned())
2538 }
2539
2541 }
2542
2543 case Type::TypeOfExpr:
2544 case Type::TypeOf:
2545 case Type::DependentName:
2546 case Type::UnresolvedUsing:
2547 case Type::Decltype:
2548 case Type::UnaryTransform:
2549 case Type::DeducedTemplateSpecialization:
2550 case Type::PackExpansion:
2551 case Type::Pipe:
2552 case Type::ArrayParameter:
2553 case Type::HLSLAttributedResource:
2554 case Type::HLSLInlineSpirv:
2555 case Type::OverflowBehavior:
2556 // No template argument deduction for these types
2558
2559 case Type::PackIndexing:
2560 // C++26 [temp.deduct.type]p5.2:
2561 // The non-deduced contexts are:
2562 // [...]
2563 // - A pack-index-specifier or a pack-index-expression.
2564 assert(!P->getAs<PackIndexingType>()->hasSelectedType() &&
2565 "a pack-index-specifier with a selected type canonicalizes to "
2566 "the selected type and should not dispatch here");
2568 }
2569
2570 llvm_unreachable("Invalid Type Class!");
2571}
2572
2573/// C++26 [temp.deduct.type]p13:
2574/// When the value of the argument corresponding to a constant template
2575/// parameter P that is declared with a dependent type is deduced from an
2576/// expression, the template parameters in the type of P are deduced from the
2577/// type of the value.
2579 const TemplateArgument &A) {
2580 const Expr *E = A.getAsExpr();
2583 return NTTP.getType();
2585}
2586
2592 bool *HasDeducedAnyParam) {
2593 // If the template argument is a pack expansion, perform template argument
2594 // deduction against the pattern of that expansion. This only occurs during
2595 // partial ordering.
2596 if (A.isPackExpansion())
2598
2599 switch (P.getKind()) {
2601 llvm_unreachable("Null template argument in parameter list");
2602
2606 S, TemplateParams, P.getAsType(), A.getAsType(), Info, Deduced, 0,
2609 /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);
2610 Info.FirstArg = P;
2611 Info.SecondArg = A;
2613
2615 // PartialOrdering does not matter here, since template specializations are
2616 // not being deduced.
2619 S, TemplateParams, P.getAsTemplate(), A.getAsTemplate(), Info,
2620 /*DefaultArguments=*/{}, /*PartialOrdering=*/false, Deduced,
2621 HasDeducedAnyParam);
2622 Info.FirstArg = P;
2623 Info.SecondArg = A;
2625
2627 llvm_unreachable("caller should handle pack expansions");
2628
2633
2634 Info.FirstArg = P;
2635 Info.SecondArg = A;
2637
2639 // 'nullptr' has only one possible value, so it always matches.
2642 Info.FirstArg = P;
2643 Info.SecondArg = A;
2645
2648 if (llvm::APSInt::isSameValue(P.getAsIntegral(), A.getAsIntegral()))
2650 }
2651 Info.FirstArg = P;
2652 Info.SecondArg = A;
2654
2656 // FIXME: structural equality will also compare types,
2657 // but they should match iff they have the same value.
2659 A.structurallyEquals(P))
2661
2662 Info.FirstArg = P;
2663 Info.SecondArg = A;
2665
2669 switch (A.getKind()) {
2672 S, TemplateParams, NTTP, DeducedTemplateArgument(A),
2674 Deduced, HasDeducedAnyParam);
2675 }
2679 S, TemplateParams, NTTP, DeducedTemplateArgument(A),
2681 HasDeducedAnyParam);
2682
2685 S, TemplateParams, NTTP, A.getNullPtrType(), Info, PartialOrdering,
2686 Deduced, HasDeducedAnyParam);
2687
2690 S, TemplateParams, NTTP, A.getAsDecl(), A.getParamTypeForDecl(),
2691 Info, PartialOrdering, Deduced, HasDeducedAnyParam);
2692
2698 Info.FirstArg = P;
2699 Info.SecondArg = A;
2701 }
2702 llvm_unreachable("Unknown template argument kind");
2703 }
2704 // Can't deduce anything, but that's okay.
2707 llvm_unreachable("Argument packs should be expanded by the caller!");
2708 }
2709
2710 llvm_unreachable("Invalid TemplateArgument Kind!");
2711}
2712
2713/// Determine whether there is a template argument to be used for
2714/// deduction.
2715///
2716/// This routine "expands" argument packs in-place, overriding its input
2717/// parameters so that \c Args[ArgIdx] will be the available template argument.
2718///
2719/// \returns true if there is another template argument (which will be at
2720/// \c Args[ArgIdx]), false otherwise.
2722 unsigned &ArgIdx) {
2723 if (ArgIdx == Args.size())
2724 return false;
2725
2726 const TemplateArgument &Arg = Args[ArgIdx];
2727 if (Arg.getKind() != TemplateArgument::Pack)
2728 return true;
2729
2730 assert(ArgIdx == Args.size() - 1 && "Pack not at the end of argument list?");
2731 Args = Arg.pack_elements();
2732 ArgIdx = 0;
2733 return ArgIdx < Args.size();
2734}
2735
2736/// Determine whether the given set of template arguments has a pack
2737/// expansion that is not the last template argument.
2739 bool FoundPackExpansion = false;
2740 for (const auto &A : Args) {
2741 if (FoundPackExpansion)
2742 return true;
2743
2744 if (A.getKind() == TemplateArgument::Pack)
2745 return hasPackExpansionBeforeEnd(A.pack_elements());
2746
2747 // FIXME: If this is a fixed-arity pack expansion from an outer level of
2748 // templates, it should not be treated as a pack expansion.
2749 if (A.isPackExpansion())
2750 FoundPackExpansion = true;
2751 }
2752
2753 return false;
2754}
2755
2762 bool NumberOfArgumentsMustMatch, bool PartialOrdering,
2763 PackFold PackFold, bool *HasDeducedAnyParam) {
2764 bool FoldPackParameter = PackFold == PackFold::ParameterToArgument ||
2766 FoldPackArgument = PackFold == PackFold::ArgumentToParameter ||
2768
2769 // C++0x [temp.deduct.type]p9:
2770 // If the template argument list of P contains a pack expansion that is not
2771 // the last template argument, the entire template argument list is a
2772 // non-deduced context.
2773 if (FoldPackParameter && hasPackExpansionBeforeEnd(Ps))
2775
2776 // C++0x [temp.deduct.type]p9:
2777 // If P has a form that contains <T> or <i>, then each argument Pi of the
2778 // respective template argument list P is compared with the corresponding
2779 // argument Ai of the corresponding template argument list of A.
2780 for (unsigned ArgIdx = 0, ParamIdx = 0; /**/; /**/) {
2782 return !FoldPackParameter && hasTemplateArgumentForDeduction(As, ArgIdx)
2785
2786 if (!Ps[ParamIdx].isPackExpansion()) {
2787 // The simple case: deduce template arguments by matching Pi and Ai.
2788
2789 // Check whether we have enough arguments.
2790 if (!hasTemplateArgumentForDeduction(As, ArgIdx))
2791 return !FoldPackArgument && NumberOfArgumentsMustMatch
2794
2795 if (As[ArgIdx].isPackExpansion()) {
2796 // C++1z [temp.deduct.type]p9:
2797 // During partial ordering, if Ai was originally a pack expansion
2798 // [and] Pi is not a pack expansion, template argument deduction
2799 // fails.
2800 if (!FoldPackArgument)
2802
2803 TemplateArgument Pattern = As[ArgIdx].getPackExpansionPattern();
2804 for (;;) {
2805 // Deduce template parameters from the pattern.
2807 S, TemplateParams, Ps[ParamIdx], Pattern, Info,
2808 PartialOrdering, Deduced, HasDeducedAnyParam);
2810 return Result;
2811
2812 ++ParamIdx;
2815 if (Ps[ParamIdx].isPackExpansion())
2816 break;
2817 }
2818 } else {
2819 // Perform deduction for this Pi/Ai pair.
2821 S, TemplateParams, Ps[ParamIdx], As[ArgIdx], Info,
2822 PartialOrdering, Deduced, HasDeducedAnyParam);
2824 return Result;
2825
2826 ++ArgIdx;
2827 ++ParamIdx;
2828 continue;
2829 }
2830 }
2831
2832 // The parameter is a pack expansion.
2833
2834 // C++0x [temp.deduct.type]p9:
2835 // If Pi is a pack expansion, then the pattern of Pi is compared with
2836 // each remaining argument in the template argument list of A. Each
2837 // comparison deduces template arguments for subsequent positions in the
2838 // template parameter packs expanded by Pi.
2839 TemplateArgument Pattern = Ps[ParamIdx].getPackExpansionPattern();
2840
2841 // Prepare to deduce the packs within the pattern.
2842 PackDeductionScope PackScope(S, TemplateParams, Deduced, Info, Pattern);
2843
2844 // Keep track of the deduced template arguments for each parameter pack
2845 // expanded by this pack expansion (the outer index) and for each
2846 // template argument (the inner SmallVectors).
2847 for (; hasTemplateArgumentForDeduction(As, ArgIdx) &&
2848 PackScope.hasNextElement();
2849 ++ArgIdx) {
2850 if (!As[ArgIdx].isPackExpansion()) {
2851 if (!FoldPackParameter)
2853 if (FoldPackArgument)
2854 Info.setStrictPackMatch();
2855 }
2856 // Deduce template arguments from the pattern.
2858 S, TemplateParams, Pattern, As[ArgIdx], Info, PartialOrdering,
2859 Deduced, HasDeducedAnyParam);
2861 return Result;
2862
2863 PackScope.nextPackElement();
2864 }
2865
2866 // Build argument packs for each of the parameter packs expanded by this
2867 // pack expansion.
2868 return PackScope.finish();
2869 }
2870}
2871
2876 bool NumberOfArgumentsMustMatch) {
2877 return ::DeduceTemplateArguments(
2878 *this, TemplateParams, Ps, As, Info, Deduced, NumberOfArgumentsMustMatch,
2879 /*PartialOrdering=*/false, PackFold::ParameterToArgument,
2880 /*HasDeducedAnyParam=*/nullptr);
2881}
2882
2885 QualType NTTPType, SourceLocation Loc) {
2886 switch (Arg.getKind()) {
2888 llvm_unreachable("Can't get a NULL template argument here");
2889
2891 return TemplateArgumentLoc(
2892 Arg, Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
2893
2895 if (NTTPType.isNull())
2896 NTTPType = Arg.getParamTypeForDecl();
2897 Expr *E = BuildExpressionFromDeclTemplateArgument(Arg, NTTPType, Loc)
2898 .getAs<Expr>();
2899 return TemplateArgumentLoc(TemplateArgument(E, /*IsCanonical=*/false), E);
2900 }
2901
2903 if (NTTPType.isNull())
2904 NTTPType = Arg.getNullPtrType();
2905 Expr *E = BuildExpressionFromDeclTemplateArgument(Arg, NTTPType, Loc)
2906 .getAs<Expr>();
2907 return TemplateArgumentLoc(TemplateArgument(NTTPType, /*isNullPtr*/true),
2908 E);
2909 }
2910
2914 return TemplateArgumentLoc(TemplateArgument(E, /*IsCanonical=*/false), E);
2915 }
2916
2921 Builder.MakeTrivial(Context, Template.getQualifier(), Loc);
2922 return TemplateArgumentLoc(
2923 Context, Arg, Loc, Builder.getWithLocInContext(Context), Loc,
2924 /*EllipsisLoc=*/Arg.getKind() == TemplateArgument::TemplateExpansion
2925 ? Loc
2926 : SourceLocation());
2927 }
2928
2930 return TemplateArgumentLoc(Arg, Arg.getAsExpr());
2931
2934 }
2935
2936 llvm_unreachable("Invalid TemplateArgument Kind!");
2937}
2938
2941 SourceLocation Location) {
2943 Context.getInjectedTemplateArg(TemplateParm), QualType(), Location);
2944}
2945
2946/// Convert the given deduced template argument and add it to the set of
2947/// fully-converted template arguments.
2948static bool
2951 TemplateDeductionInfo &Info, bool IsDeduced,
2953 auto ConvertArg = [&](DeducedTemplateArgument Arg,
2954 unsigned ArgumentPackIndex) {
2955 // Convert the deduced template argument into a template
2956 // argument that we can check, almost as if the user had written
2957 // the template argument explicitly.
2958 TemplateArgumentLoc ArgLoc =
2960
2961 SaveAndRestore _1(CTAI.MatchingTTP, false);
2962 SaveAndRestore _2(CTAI.StrictPackMatch, false);
2963 // Check the template argument, converting it as necessary.
2964 auto Res = S.CheckTemplateArgument(
2965 Param, ArgLoc, Template, Template->getLocation(),
2966 Template->getSourceRange().getEnd(), ArgumentPackIndex, CTAI,
2967 IsDeduced
2971 if (CTAI.StrictPackMatch)
2972 Info.setStrictPackMatch();
2973 return Res;
2974 };
2975
2976 if (Arg.getKind() == TemplateArgument::Pack) {
2977 // This is a template argument pack, so check each of its arguments against
2978 // the template parameter.
2979 SmallVector<TemplateArgument, 2> SugaredPackedArgsBuilder,
2980 CanonicalPackedArgsBuilder;
2981 for (const auto &P : Arg.pack_elements()) {
2982 // When converting the deduced template argument, append it to the
2983 // general output list. We need to do this so that the template argument
2984 // checking logic has all of the prior template arguments available.
2985 DeducedTemplateArgument InnerArg(P);
2987 assert(InnerArg.getKind() != TemplateArgument::Pack &&
2988 "deduced nested pack");
2989 if (P.isNull()) {
2990 // We deduced arguments for some elements of this pack, but not for
2991 // all of them. This happens if we get a conditionally-non-deduced
2992 // context in a pack expansion (such as an overload set in one of the
2993 // arguments).
2994 S.Diag(Param->getLocation(),
2995 diag::err_template_arg_deduced_incomplete_pack)
2996 << Arg << Param;
2997 return true;
2998 }
2999 if (ConvertArg(InnerArg, SugaredPackedArgsBuilder.size()))
3000 return true;
3001
3002 // Move the converted template argument into our argument pack.
3003 SugaredPackedArgsBuilder.push_back(CTAI.SugaredConverted.pop_back_val());
3004 CanonicalPackedArgsBuilder.push_back(
3005 CTAI.CanonicalConverted.pop_back_val());
3006 }
3007
3008 // If the pack is empty, we still need to substitute into the parameter
3009 // itself, in case that substitution fails.
3010 if (SugaredPackedArgsBuilder.empty()) {
3013 /*Final=*/true);
3014 Sema::ArgPackSubstIndexRAII OnlySubstNonPackExpansion(S, std::nullopt);
3015
3016 if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
3017 Sema::InstantiatingTemplate Inst(S, Template->getLocation(), Template,
3018 NTTP, CTAI.SugaredConverted,
3019 Template->getSourceRange());
3020 if (Inst.isInvalid() ||
3021 S.SubstType(NTTP->getType(), Args, NTTP->getLocation(),
3022 NTTP->getDeclName()).isNull())
3023 return true;
3024 } else if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(Param)) {
3025 Sema::InstantiatingTemplate Inst(S, Template->getLocation(), Template,
3026 TTP, CTAI.SugaredConverted,
3027 Template->getSourceRange());
3028 if (Inst.isInvalid() ||
3029 !S.SubstTemplateParams(TTP->getTemplateParameters(), S.CurContext,
3030 Args))
3031 return true;
3032 }
3033 // For type parameters, no substitution is ever required.
3034 }
3035
3036 // Create the resulting argument pack.
3037 CTAI.SugaredConverted.push_back(
3038 TemplateArgument::CreatePackCopy(S.Context, SugaredPackedArgsBuilder));
3040 S.Context, CanonicalPackedArgsBuilder));
3041 return false;
3042 }
3043
3044 return ConvertArg(Arg, 0);
3045}
3046
3047/// \param IsIncomplete When used, we only consider template parameters that
3048/// were deduced, disregarding any default arguments. After the function
3049/// finishes, the object pointed at will contain a value indicating if the
3050/// conversion was actually incomplete.
3052 Sema &S, NamedDecl *Template, TemplateParameterList *TemplateParams,
3055 LocalInstantiationScope *CurrentInstantiationScope,
3056 unsigned NumAlreadyConverted, bool *IsIncomplete) {
3057 for (unsigned I = 0, N = TemplateParams->size(); I != N; ++I) {
3058 NamedDecl *Param = TemplateParams->getParam(I);
3059
3060 // C++0x [temp.arg.explicit]p3:
3061 // A trailing template parameter pack (14.5.3) not otherwise deduced will
3062 // be deduced to an empty sequence of template arguments.
3063 // FIXME: Where did the word "trailing" come from?
3064 if (Deduced[I].isNull() && Param->isTemplateParameterPack()) {
3065 if (auto Result =
3066 PackDeductionScope(S, TemplateParams, Deduced, Info, I).finish();
3068 return Result;
3069 }
3070
3071 if (!Deduced[I].isNull()) {
3072 if (I < NumAlreadyConverted) {
3073 // We may have had explicitly-specified template arguments for a
3074 // template parameter pack (that may or may not have been extended
3075 // via additional deduced arguments).
3076 if (Param->isParameterPack() && CurrentInstantiationScope &&
3077 CurrentInstantiationScope->getPartiallySubstitutedPack() == Param) {
3078 // Forget the partially-substituted pack; its substitution is now
3079 // complete.
3080 CurrentInstantiationScope->ResetPartiallySubstitutedPack();
3081 // We still need to check the argument in case it was extended by
3082 // deduction.
3083 } else {
3084 // We have already fully type-checked and converted this
3085 // argument, because it was explicitly-specified. Just record the
3086 // presence of this argument.
3087 CTAI.SugaredConverted.push_back(Deduced[I]);
3088 CTAI.CanonicalConverted.push_back(
3090 continue;
3091 }
3092 }
3093
3094 // We may have deduced this argument, so it still needs to be
3095 // checked and converted.
3096 if (ConvertDeducedTemplateArgument(S, Param, Deduced[I], Template, Info,
3097 IsDeduced, CTAI)) {
3098 Info.Param = makeTemplateParameter(Param);
3099 // FIXME: These template arguments are temporary. Free them!
3100 Info.reset(
3103 CTAI.CanonicalConverted));
3105 }
3106
3107 continue;
3108 }
3109
3110 // [C++26][temp.deduct.partial]p12 - When partial ordering, it's ok for
3111 // template parameters to remain not deduced. As a provisional fix for a
3112 // core issue that does not exist yet, which may be related to CWG2160, only
3113 // consider template parameters that were deduced, disregarding any default
3114 // arguments.
3115 if (IsIncomplete) {
3116 *IsIncomplete = true;
3117 CTAI.SugaredConverted.push_back({});
3118 CTAI.CanonicalConverted.push_back({});
3119 continue;
3120 }
3121
3122 // Substitute into the default template argument, if available.
3123 bool HasDefaultArg = false;
3124 TemplateDecl *TD = dyn_cast<TemplateDecl>(Template);
3125 if (!TD) {
3129 }
3130
3131 TemplateArgumentLoc DefArg;
3132 {
3133 Qualifiers ThisTypeQuals;
3134 CXXRecordDecl *ThisContext = nullptr;
3135 if (auto *Rec = dyn_cast<CXXRecordDecl>(TD->getDeclContext()))
3136 if (Rec->isLambda())
3137 if (auto *Method = dyn_cast<CXXMethodDecl>(Rec->getDeclContext())) {
3138 ThisContext = Method->getParent();
3139 ThisTypeQuals = Method->getMethodQualifiers();
3140 }
3141
3142 Sema::CXXThisScopeRAII ThisScope(S, ThisContext, ThisTypeQuals,
3143 S.getLangOpts().CPlusPlus17);
3144
3146 TD, /*TemplateKWLoc=*/SourceLocation(), TD->getLocation(),
3147 TD->getSourceRange().getEnd(), Param, CTAI.SugaredConverted,
3148 CTAI.CanonicalConverted, HasDefaultArg);
3149 }
3150
3151 // If there was no default argument, deduction is incomplete.
3152 if (DefArg.getArgument().isNull()) {
3153 Info.Param = makeTemplateParameter(TemplateParams->getParam(I));
3154 Info.reset(
3157
3160 }
3161
3162 SaveAndRestore _1(CTAI.PartialOrdering, false);
3163 SaveAndRestore _2(CTAI.MatchingTTP, false);
3164 SaveAndRestore _3(CTAI.StrictPackMatch, false);
3165 // Check whether we can actually use the default argument.
3167 Param, DefArg, TD, TD->getLocation(), TD->getSourceRange().getEnd(),
3168 /*ArgumentPackIndex=*/0, CTAI, Sema::CTAK_Specified)) {
3169 Info.Param = makeTemplateParameter(TemplateParams->getParam(I));
3170 // FIXME: These template arguments are temporary. Free them!
3171 Info.reset(
3175 }
3176
3177 // If we get here, we successfully used the default template argument.
3178 }
3179
3181}
3182
3184 if (auto *DC = dyn_cast<DeclContext>(D))
3185 return DC;
3186 return D->getDeclContext();
3187}
3188
3189template<typename T> struct IsPartialSpecialization {
3190 static constexpr bool value = false;
3191};
3192template<>
3196template<>
3198 static constexpr bool value = true;
3199};
3200
3203 ArrayRef<TemplateArgument> SugaredDeducedArgs,
3204 ArrayRef<TemplateArgument> CanonicalDeducedArgs,
3205 TemplateDeductionInfo &Info) {
3206 llvm::SmallVector<AssociatedConstraint, 3> AssociatedConstraints;
3207 bool DeducedArgsNeedReplacement = false;
3208 if (auto *TD = dyn_cast<ClassTemplatePartialSpecializationDecl>(Template)) {
3209 TD->getAssociatedConstraints(AssociatedConstraints);
3210 DeducedArgsNeedReplacement = !TD->isClassScopeExplicitSpecialization();
3211 } else if (auto *TD =
3212 dyn_cast<VarTemplatePartialSpecializationDecl>(Template)) {
3213 TD->getAssociatedConstraints(AssociatedConstraints);
3214 DeducedArgsNeedReplacement = !TD->isClassScopeExplicitSpecialization();
3215 } else {
3216 cast<TemplateDecl>(Template)->getAssociatedConstraints(
3217 AssociatedConstraints);
3218 }
3219
3220 std::optional<ArrayRef<TemplateArgument>> Innermost;
3221 // If we don't need to replace the deduced template arguments,
3222 // we can add them immediately as the inner-most argument list.
3223 if (!DeducedArgsNeedReplacement)
3224 Innermost = SugaredDeducedArgs;
3225
3227 Template, Template->getDeclContext(), /*Final=*/false, Innermost,
3228 /*RelativeToPrimary=*/true, /*Pattern=*/
3229 nullptr, /*ForConstraintInstantiation=*/true);
3230
3231 // getTemplateInstantiationArgs picks up the non-deduced version of the
3232 // template args when this is a variable template partial specialization and
3233 // not class-scope explicit specialization, so replace with Deduced Args
3234 // instead of adding to inner-most.
3235 if (!Innermost)
3236 MLTAL.replaceInnermostTemplateArguments(Template, SugaredDeducedArgs);
3237
3238 if (S.CheckConstraintSatisfaction(Template, AssociatedConstraints, MLTAL,
3239 Info.getLocation(),
3242 Info.reset(
3243 TemplateArgumentList::CreateCopy(S.Context, SugaredDeducedArgs),
3244 TemplateArgumentList::CreateCopy(S.Context, CanonicalDeducedArgs));
3246 }
3248}
3249
3253 TemplateDeductionInfo &Info) {
3254 TemplateParameterList *TPL = Template->getTemplateParameters();
3255 TemplateArgumentListInfo InstArgs(TPL->getLAngleLoc(), TPL->getRAngleLoc());
3256 if (S.SubstTemplateArguments(Ps, MLTAL, InstArgs)) {
3257 unsigned ArgIdx = InstArgs.size(), ParamIdx = ArgIdx;
3258 if (ParamIdx >= TPL->size())
3259 ParamIdx = TPL->size() - 1;
3260
3261 Decl *Param = TPL->getParam(ParamIdx);
3262 Info.Param = makeTemplateParameter(Param);
3263 Info.FirstArg = Ps[ArgIdx].getArgument();
3265 }
3266
3269 if (S.CheckTemplateArgumentList(Template, Template->getLocation(), InstArgs,
3270 /*DefaultArgs=*/{}, false, InstCTAI,
3271 /*UpdateArgsWithConversions=*/true,
3276
3277 // Check that we produced the correct argument list.
3279 AsStack{As};
3280 for (;;) {
3281 auto take = [](SmallVectorImpl<ArrayRef<TemplateArgument>> &Stack)
3283 while (!Stack.empty()) {
3284 auto &Xs = Stack.back();
3285 if (Xs.empty()) {
3286 Stack.pop_back();
3287 continue;
3288 }
3289 auto &X = Xs.front();
3290 if (X.getKind() == TemplateArgument::Pack) {
3291 Stack.emplace_back(X.getPackAsArray());
3292 Xs = Xs.drop_front();
3293 continue;
3294 }
3295 assert(!X.isNull());
3296 return {Xs, X};
3297 }
3298 static constexpr ArrayRef<TemplateArgument> None;
3299 return {const_cast<ArrayRef<TemplateArgument> &>(None),
3301 };
3302 auto [Ps, P] = take(PsStack);
3303 auto [As, A] = take(AsStack);
3304 if (P.isNull() && A.isNull())
3305 break;
3306 TemplateArgument PP = P.isPackExpansion() ? P.getPackExpansionPattern() : P,
3307 PA = A.isPackExpansion() ? A.getPackExpansionPattern() : A;
3308 if (!S.Context.isSameTemplateArgument(PP, PA)) {
3309 if (!P.isPackExpansion() && !A.isPackExpansion()) {
3311 (AsStack.empty() ? As.end() : AsStack.back().begin()) -
3312 As.begin()));
3313 Info.FirstArg = P;
3314 Info.SecondArg = A;
3316 }
3317 if (P.isPackExpansion()) {
3318 Ps = Ps.drop_front();
3319 continue;
3320 }
3321 if (A.isPackExpansion()) {
3322 As = As.drop_front();
3323 continue;
3324 }
3325 }
3326 Ps = Ps.drop_front(P.isPackExpansion() ? 0 : 1);
3327 As = As.drop_front(A.isPackExpansion() && !P.isPackExpansion() ? 0 : 1);
3328 }
3329 assert(PsStack.empty());
3330 assert(AsStack.empty());
3332}
3333
3334/// Complete template argument deduction.
3336 Sema &S, NamedDecl *Entity, TemplateParameterList *EntityTPL,
3340 TemplateDeductionInfo &Info, bool CopyDeducedArgs) {
3341 Sema::ContextRAII SavedContext(S, getAsDeclContextOrEnclosing(Entity));
3342
3343 // C++ [temp.deduct.type]p2:
3344 // [...] or if any template argument remains neither deduced nor
3345 // explicitly specified, template argument deduction fails.
3348 S, Entity, EntityTPL, /*IsDeduced=*/PartialOrdering, Deduced, Info,
3349 CTAI,
3350 /*CurrentInstantiationScope=*/nullptr,
3351 /*NumAlreadyConverted=*/0U, /*IsIncomplete=*/nullptr);
3353 return Result;
3354
3355 if (CopyDeducedArgs) {
3356 // Form the template argument list from the deduced template arguments.
3357 TemplateArgumentList *SugaredDeducedArgumentList =
3359 TemplateArgumentList *CanonicalDeducedArgumentList =
3361 Info.reset(SugaredDeducedArgumentList, CanonicalDeducedArgumentList);
3362 }
3363
3365 /*Final=*/true);
3366 MLTAL.addOuterRetainedLevels(Template->getTemplateParameters()->getDepth());
3367 if (auto Result =
3368 CheckDeducedTemplateArgumentList(S, Template, Ps, As, MLTAL, Info);
3370 return Result;
3371
3372 if (!PartialOrdering) {
3374 S, Entity, CTAI.SugaredConverted, CTAI.CanonicalConverted, Info);
3376 return Result;
3377 }
3378
3380}
3382 Sema &S, NamedDecl *Entity, TemplateParameterList *EntityTPL,
3386 TemplateDeductionInfo &Info, bool CopyDeducedArgs) {
3387 TemplateParameterList *TPL = Template->getTemplateParameters();
3388 SmallVector<TemplateArgumentLoc, 8> PsLoc(Ps.size());
3389 for (unsigned I = 0, N = Ps.size(); I != N; ++I)
3390 PsLoc[I] = S.getTrivialTemplateArgumentLoc(Ps[I], QualType(),
3391 TPL->getParam(I)->getLocation());
3392 return FinishTemplateArgumentDeduction(S, Entity, EntityTPL, Template,
3393 PartialOrdering, PsLoc, As, Deduced,
3394 Info, CopyDeducedArgs);
3395}
3396
3397/// Complete template argument deduction for DeduceTemplateArgumentsFromType.
3398/// FIXME: this is mostly duplicated with the above two versions. Deduplicate
3399/// the three implementations.
3401 Sema &S, TemplateDecl *TD,
3403 TemplateDeductionInfo &Info) {
3405
3406 // C++ [temp.deduct.type]p2:
3407 // [...] or if any template argument remains neither deduced nor
3408 // explicitly specified, template argument deduction fails.
3411 S, TD, TD->getTemplateParameters(), /*IsDeduced=*/false, Deduced,
3412 Info, CTAI,
3413 /*CurrentInstantiationScope=*/nullptr, /*NumAlreadyConverted=*/0,
3414 /*IsIncomplete=*/nullptr);
3416 return Result;
3417
3418 return ::CheckDeducedArgumentConstraints(S, TD, CTAI.SugaredConverted,
3419 CTAI.CanonicalConverted, Info);
3420}
3421
3422/// Perform template argument deduction to determine whether the given template
3423/// arguments match the given class or variable template partial specialization
3424/// per C++ [temp.class.spec.match].
3425template <typename T>
3426static std::enable_if_t<IsPartialSpecialization<T>::value,
3429 ArrayRef<TemplateArgument> TemplateArgs,
3430 TemplateDeductionInfo &Info) {
3431 if (Partial->isInvalidDecl())
3433
3434 // C++ [temp.class.spec.match]p2:
3435 // A partial specialization matches a given actual template
3436 // argument list if the template arguments of the partial
3437 // specialization can be deduced from the actual template argument
3438 // list (14.8.2).
3439
3440 // Unevaluated SFINAE context.
3443 Sema::SFINAETrap Trap(S, Info);
3444
3445 // This deduction has no relation to any outer instantiation we might be
3446 // performing.
3447 LocalInstantiationScope InstantiationScope(S);
3448
3450 Deduced.resize(Partial->getTemplateParameters()->size());
3452 S, Partial->getTemplateParameters(),
3453 Partial->getTemplateArgs().asArray(), TemplateArgs, Info, Deduced,
3454 /*NumberOfArgumentsMustMatch=*/false, /*PartialOrdering=*/false,
3456 /*HasDeducedAnyParam=*/nullptr);
3458 return Result;
3459
3460 SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());
3461 Sema::InstantiatingTemplate Inst(S, Info.getLocation(), Partial, DeducedArgs);
3462 if (Inst.isInvalid())
3464
3467 Result = ::FinishTemplateArgumentDeduction(
3468 S, Partial, Partial->getTemplateParameters(),
3469 Partial->getSpecializedTemplate(),
3470 /*IsPartialOrdering=*/false,
3471 Partial->getTemplateArgsAsWritten()->arguments(), TemplateArgs, Deduced,
3472 Info, /*CopyDeducedArgs=*/true);
3473 });
3474
3476 return Result;
3477
3478 if (Trap.hasErrorOccurred())
3480
3482}
3483
3486 ArrayRef<TemplateArgument> TemplateArgs,
3487 TemplateDeductionInfo &Info) {
3488 return ::DeduceTemplateArguments(*this, Partial, TemplateArgs, Info);
3489}
3492 ArrayRef<TemplateArgument> TemplateArgs,
3493 TemplateDeductionInfo &Info) {
3494 return ::DeduceTemplateArguments(*this, Partial, TemplateArgs, Info);
3495}
3496
3500 if (TD->isInvalidDecl())
3502
3503 QualType PType;
3504 if (const auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {
3505 // Use the InjectedClassNameType.
3506 PType = Context.getCanonicalTagType(CTD->getTemplatedDecl());
3507 } else if (const auto *AliasTemplate = dyn_cast<TypeAliasTemplateDecl>(TD)) {
3508 PType = AliasTemplate->getTemplatedDecl()->getUnderlyingType();
3509 } else {
3510 assert(false && "Expected a class or alias template");
3511 }
3512
3513 // Unevaluated SFINAE context.
3516 SFINAETrap Trap(*this, Info);
3517
3518 // This deduction has no relation to any outer instantiation we might be
3519 // performing.
3520 LocalInstantiationScope InstantiationScope(*this);
3521
3523 TD->getTemplateParameters()->size());
3526 if (auto DeducedResult = DeduceTemplateArguments(
3527 TD->getTemplateParameters(), PArgs, AArgs, Info, Deduced, false);
3528 DeducedResult != TemplateDeductionResult::Success) {
3529 return DeducedResult;
3530 }
3531
3532 SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());
3533 InstantiatingTemplate Inst(*this, Info.getLocation(), TD, DeducedArgs);
3534 if (Inst.isInvalid())
3536
3539 Result = ::FinishTemplateArgumentDeduction(*this, TD, Deduced, Info);
3540 });
3541
3543 return Result;
3544
3545 if (Trap.hasErrorOccurred())
3547
3549}
3550
3551/// Determine whether the given type T is a simple-template-id type.
3553 if (const TemplateSpecializationType *Spec
3554 = T->getAs<TemplateSpecializationType>())
3555 return Spec->getTemplateName().getAsTemplateDecl() != nullptr;
3556
3557 // C++17 [temp.local]p2:
3558 // the injected-class-name [...] is equivalent to the template-name followed
3559 // by the template-arguments of the class template specialization or partial
3560 // specialization enclosed in <>
3561 // ... which means it's equivalent to a simple-template-id.
3562 //
3563 // This only arises during class template argument deduction for a copy
3564 // deduction candidate, where it permits slicing.
3565 if (isa<InjectedClassNameType>(T.getCanonicalType()))
3566 return true;
3567
3568 return false;
3569}
3570
3573 TemplateArgumentListInfo &ExplicitTemplateArgs,
3576 TemplateDeductionInfo &Info) {
3577 assert(isSFINAEContext());
3578 assert(isUnevaluatedContext());
3579
3580 FunctionDecl *Function = FunctionTemplate->getTemplatedDecl();
3581 TemplateParameterList *TemplateParams
3582 = FunctionTemplate->getTemplateParameters();
3583
3584 if (ExplicitTemplateArgs.size() == 0) {
3585 // No arguments to substitute; just copy over the parameter types and
3586 // fill in the function type.
3587 for (auto *P : Function->parameters())
3588 ParamTypes.push_back(P->getType());
3589
3590 if (FunctionType)
3591 *FunctionType = Function->getType();
3593 }
3594
3595 // C++ [temp.arg.explicit]p3:
3596 // Template arguments that are present shall be specified in the
3597 // declaration order of their corresponding template-parameters. The
3598 // template argument list shall not specify more template-arguments than
3599 // there are corresponding template-parameters.
3600
3601 // Enter a new template instantiation context where we check the
3602 // explicitly-specified template arguments against this function template,
3603 // and then substitute them into the function parameter types.
3606 *this, Info.getLocation(), FunctionTemplate, DeducedArgs,
3608 if (Inst.isInvalid())
3610
3613 ExplicitTemplateArgs, /*DefaultArgs=*/{},
3614 /*PartialTemplateArgs=*/true, CTAI,
3615 /*UpdateArgsWithConversions=*/false)) {
3616 unsigned Index = CTAI.SugaredConverted.size();
3617 if (Index >= TemplateParams->size())
3619 Info.Param = makeTemplateParameter(TemplateParams->getParam(Index));
3621 }
3622
3623 // Form the template argument list from the explicitly-specified
3624 // template arguments.
3625 TemplateArgumentList *SugaredExplicitArgumentList =
3627 TemplateArgumentList *CanonicalExplicitArgumentList =
3629 Info.setExplicitArgs(SugaredExplicitArgumentList,
3630 CanonicalExplicitArgumentList);
3631
3632 // Template argument deduction and the final substitution should be
3633 // done in the context of the templated declaration. Explicit
3634 // argument substitution, on the other hand, needs to happen in the
3635 // calling context.
3636 ContextRAII SavedContext(*this, FunctionTemplate->getTemplatedDecl());
3637
3638 // If we deduced template arguments for a template parameter pack,
3639 // note that the template argument pack is partially substituted and record
3640 // the explicit template arguments. They'll be used as part of deduction
3641 // for this template parameter pack.
3642 unsigned PartiallySubstitutedPackIndex = -1u;
3643 if (!CTAI.SugaredConverted.empty()) {
3644 const TemplateArgument &Arg = CTAI.SugaredConverted.back();
3645 if (Arg.getKind() == TemplateArgument::Pack) {
3646 auto *Param = TemplateParams->getParam(CTAI.SugaredConverted.size() - 1);
3647 // If this is a fully-saturated fixed-size pack, it should be
3648 // fully-substituted, not partially-substituted.
3649 UnsignedOrNone Expansions = getExpandedPackSize(Param);
3650 if (!Expansions || Arg.pack_size() < *Expansions) {
3651 PartiallySubstitutedPackIndex = CTAI.SugaredConverted.size() - 1;
3652 CurrentInstantiationScope->SetPartiallySubstitutedPack(
3653 Param, Arg.pack_begin(), Arg.pack_size());
3654 }
3655 }
3656 }
3657
3658 const FunctionProtoType *Proto
3659 = Function->getType()->getAs<FunctionProtoType>();
3660 assert(Proto && "Function template does not have a prototype?");
3661
3662 // Isolate our substituted parameters from our caller.
3663 LocalInstantiationScope InstScope(*this, /*MergeWithOuterScope*/true);
3664
3665 ExtParameterInfoBuilder ExtParamInfos;
3666
3668 SugaredExplicitArgumentList->asArray(),
3669 /*Final=*/true);
3670
3671 // Instantiate the types of each of the function parameters given the
3672 // explicitly-specified template arguments. If the function has a trailing
3673 // return type, substitute it after the arguments to ensure we substitute
3674 // in lexical order.
3675 if (Proto->hasTrailingReturn()) {
3676 if (SubstParmTypes(Function->getLocation(), Function->parameters(),
3677 Proto->getExtParameterInfosOrNull(), MLTAL, ParamTypes,
3678 /*params=*/nullptr, ExtParamInfos))
3680 }
3681
3682 // Instantiate the return type.
3683 QualType ResultType;
3684 {
3685 // C++11 [expr.prim.general]p3:
3686 // If a declaration declares a member function or member function
3687 // template of a class X, the expression this is a prvalue of type
3688 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
3689 // and the end of the function-definition, member-declarator, or
3690 // declarator.
3691 Qualifiers ThisTypeQuals;
3692 CXXRecordDecl *ThisContext = nullptr;
3693 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Function)) {
3694 ThisContext = Method->getParent();
3695 ThisTypeQuals = Method->getMethodQualifiers();
3696 }
3697
3698 CXXThisScopeRAII ThisScope(*this, ThisContext, ThisTypeQuals,
3700
3701 ResultType =
3702 SubstType(Proto->getReturnType(), MLTAL,
3703 Function->getTypeSpecStartLoc(), Function->getDeclName());
3704 if (ResultType.isNull())
3706 // CUDA: Kernel function must have 'void' return type.
3707 if (getLangOpts().CUDA)
3708 if (Function->hasAttr<CUDAGlobalAttr>() && !ResultType->isVoidType()) {
3709 Diag(Function->getLocation(), diag::err_kern_type_not_void_return)
3710 << Function->getType() << Function->getSourceRange();
3712 }
3713 }
3714
3715 // Instantiate the types of each of the function parameters given the
3716 // explicitly-specified template arguments if we didn't do so earlier.
3717 if (!Proto->hasTrailingReturn() &&
3718 SubstParmTypes(Function->getLocation(), Function->parameters(),
3719 Proto->getExtParameterInfosOrNull(), MLTAL, ParamTypes,
3720 /*params*/ nullptr, ExtParamInfos))
3722
3723 if (FunctionType) {
3724 auto EPI = Proto->getExtProtoInfo();
3725 EPI.ExtParameterInfos = ExtParamInfos.getPointerOrNull(ParamTypes.size());
3726 *FunctionType = BuildFunctionType(ResultType, ParamTypes,
3727 Function->getLocation(),
3728 Function->getDeclName(),
3729 EPI);
3730 if (FunctionType->isNull())
3732 }
3733
3734 // C++ [temp.arg.explicit]p2:
3735 // Trailing template arguments that can be deduced (14.8.2) may be
3736 // omitted from the list of explicit template-arguments. If all of the
3737 // template arguments can be deduced, they may all be omitted; in this
3738 // case, the empty template argument list <> itself may also be omitted.
3739 //
3740 // Take all of the explicitly-specified arguments and put them into
3741 // the set of deduced template arguments. The partially-substituted
3742 // parameter pack, however, will be set to NULL since the deduction
3743 // mechanism handles the partially-substituted argument pack directly.
3744 Deduced.reserve(TemplateParams->size());
3745 for (unsigned I = 0, N = SugaredExplicitArgumentList->size(); I != N; ++I) {
3746 const TemplateArgument &Arg = SugaredExplicitArgumentList->get(I);
3747 if (I == PartiallySubstitutedPackIndex)
3748 Deduced.push_back(DeducedTemplateArgument());
3749 else
3750 Deduced.push_back(Arg);
3751 }
3752
3754}
3755
3756/// Check whether the deduced argument type for a call to a function
3757/// template matches the actual argument type per C++ [temp.deduct.call]p4.
3760 Sema::OriginalCallArg OriginalArg,
3761 QualType DeducedA) {
3762 ASTContext &Context = S.Context;
3763
3764 auto Failed = [&]() -> TemplateDeductionResult {
3765 Info.FirstArg = TemplateArgument(DeducedA);
3766 Info.SecondArg = TemplateArgument(OriginalArg.OriginalArgType);
3767 Info.CallArgIndex = OriginalArg.ArgIdx;
3768 return OriginalArg.DecomposedParam
3771 };
3772
3773 QualType A = OriginalArg.OriginalArgType;
3774 QualType OriginalParamType = OriginalArg.OriginalParamType;
3775
3776 // Check for type equality (top-level cv-qualifiers and _Atomic are ignored,
3777 // since _Atomic is treated as a qualifier).
3778 if (Context.hasSameType(A.getAtomicUnqualifiedType(),
3779 DeducedA.getAtomicUnqualifiedType()))
3781
3782 // Strip off references on the argument types; they aren't needed for
3783 // the following checks.
3784 if (const ReferenceType *DeducedARef = DeducedA->getAs<ReferenceType>())
3785 DeducedA = DeducedARef->getPointeeType();
3786 if (const ReferenceType *ARef = A->getAs<ReferenceType>())
3787 A = ARef->getPointeeType();
3788
3789 // C++ [temp.deduct.call]p4:
3790 // [...] However, there are three cases that allow a difference:
3791 // - If the original P is a reference type, the deduced A (i.e., the
3792 // type referred to by the reference) can be more cv-qualified than
3793 // the transformed A.
3794 if (const ReferenceType *OriginalParamRef
3795 = OriginalParamType->getAs<ReferenceType>()) {
3796 // We don't want to keep the reference around any more.
3797 OriginalParamType = OriginalParamRef->getPointeeType();
3798
3799 // FIXME: Resolve core issue (no number yet): if the original P is a
3800 // reference type and the transformed A is function type "noexcept F",
3801 // the deduced A can be F.
3802 if (A->isFunctionType() && S.IsFunctionConversion(A, DeducedA))
3804
3805 Qualifiers AQuals = A.getQualifiers();
3806 Qualifiers DeducedAQuals = DeducedA.getQualifiers();
3807
3808 // Under Objective-C++ ARC, the deduced type may have implicitly
3809 // been given strong or (when dealing with a const reference)
3810 // unsafe_unretained lifetime. If so, update the original
3811 // qualifiers to include this lifetime.
3812 if (S.getLangOpts().ObjCAutoRefCount &&
3813 ((DeducedAQuals.getObjCLifetime() == Qualifiers::OCL_Strong &&
3815 (DeducedAQuals.hasConst() &&
3816 DeducedAQuals.getObjCLifetime() == Qualifiers::OCL_ExplicitNone))) {
3817 AQuals.setObjCLifetime(DeducedAQuals.getObjCLifetime());
3818 }
3819
3820 if (AQuals == DeducedAQuals) {
3821 // Qualifiers match; there's nothing to do.
3822 } else if (!DeducedAQuals.compatiblyIncludes(AQuals, S.getASTContext())) {
3823 return Failed();
3824 } else {
3825 // Qualifiers are compatible, so have the argument type adopt the
3826 // deduced argument type's qualifiers as if we had performed the
3827 // qualification conversion.
3828 A = Context.getQualifiedType(A.getUnqualifiedType(), DeducedAQuals);
3829 }
3830 }
3831
3832 // - The transformed A can be another pointer or pointer to member
3833 // type that can be converted to the deduced A via a function pointer
3834 // conversion and/or a qualification conversion.
3835 //
3836 // Also allow conversions which merely strip __attribute__((noreturn)) from
3837 // function types (recursively).
3838 bool ObjCLifetimeConversion = false;
3839 if ((A->isAnyPointerType() || A->isMemberPointerType()) &&
3840 (S.IsQualificationConversion(A, DeducedA, false,
3841 ObjCLifetimeConversion) ||
3842 S.IsFunctionConversion(A, DeducedA)))
3844
3845 // - If P is a class and P has the form simple-template-id, then the
3846 // transformed A can be a derived class of the deduced A. [...]
3847 // [...] Likewise, if P is a pointer to a class of the form
3848 // simple-template-id, the transformed A can be a pointer to a
3849 // derived class pointed to by the deduced A.
3850 if (const PointerType *OriginalParamPtr
3851 = OriginalParamType->getAs<PointerType>()) {
3852 if (const PointerType *DeducedAPtr = DeducedA->getAs<PointerType>()) {
3853 if (const PointerType *APtr = A->getAs<PointerType>()) {
3854 if (A->getPointeeType()->isRecordType()) {
3855 OriginalParamType = OriginalParamPtr->getPointeeType();
3856 DeducedA = DeducedAPtr->getPointeeType();
3857 A = APtr->getPointeeType();
3858 }
3859 }
3860 }
3861 }
3862
3863 if (Context.hasSameUnqualifiedType(A, DeducedA))
3865
3866 if (A->isRecordType() && isSimpleTemplateIdType(OriginalParamType) &&
3867 S.IsDerivedFrom(Info.getLocation(), A, DeducedA))
3869
3870 return Failed();
3871}
3872
3873/// Find the pack index for a particular parameter index in an instantiation of
3874/// a function template with specific arguments.
3875///
3876/// \return The pack index for whichever pack produced this parameter, or -1
3877/// if this was not produced by a parameter. Intended to be used as the
3878/// ArgumentPackSubstitutionIndex for further substitutions.
3879// FIXME: We should track this in OriginalCallArgs so we don't need to
3880// reconstruct it here.
3881static UnsignedOrNone
3884 unsigned ParamIdx) {
3885 unsigned Idx = 0;
3886 for (auto *PD : FunctionTemplate->getTemplatedDecl()->parameters()) {
3887 if (PD->isParameterPack()) {
3888 UnsignedOrNone NumArgs =
3889 S.getNumArgumentsInExpansion(PD->getType(), Args);
3890 unsigned NumExpansions = NumArgs ? *NumArgs : 1;
3891 if (Idx + NumExpansions > ParamIdx)
3892 return ParamIdx - Idx;
3893 Idx += NumExpansions;
3894 } else {
3895 if (Idx == ParamIdx)
3896 return std::nullopt; // Not a pack expansion
3897 ++Idx;
3898 }
3899 }
3900
3901 llvm_unreachable("parameter index would not be produced from template");
3902}
3903
3904// if `Specialization` is a `CXXConstructorDecl` or `CXXConversionDecl`,
3905// we'll try to instantiate and update its explicit specifier after constraint
3906// checking.
3909 const MultiLevelTemplateArgumentList &SubstArgs,
3911 ArrayRef<TemplateArgument> DeducedArgs) {
3912 auto GetExplicitSpecifier = [](FunctionDecl *D) {
3913 return isa<CXXConstructorDecl>(D)
3914 ? cast<CXXConstructorDecl>(D)->getExplicitSpecifier()
3915 : cast<CXXConversionDecl>(D)->getExplicitSpecifier();
3916 };
3917 auto SetExplicitSpecifier = [](FunctionDecl *D, ExplicitSpecifier ES) {
3919 ? cast<CXXConstructorDecl>(D)->setExplicitSpecifier(ES)
3920 : cast<CXXConversionDecl>(D)->setExplicitSpecifier(ES);
3921 };
3922
3923 ExplicitSpecifier ES = GetExplicitSpecifier(Specialization);
3924 Expr *ExplicitExpr = ES.getExpr();
3925 if (!ExplicitExpr)
3927 if (!ExplicitExpr->isValueDependent())
3929
3930 // By this point, FinishTemplateArgumentDeduction will have been reverted back
3931 // to a regular non-SFINAE template instantiation context, so setup a new
3932 // SFINAE context.
3934 S, Info.getLocation(), FunctionTemplate, DeducedArgs,
3936 if (Inst.isInvalid())
3938 Sema::SFINAETrap Trap(S, Info);
3939 const ExplicitSpecifier InstantiatedES =
3940 S.instantiateExplicitSpecifier(SubstArgs, ES);
3941 if (InstantiatedES.isInvalid() || Trap.hasErrorOccurred()) {
3942 Specialization->setInvalidDecl(true);
3944 }
3945 SetExplicitSpecifier(Specialization, InstantiatedES);
3947}
3948
3952 unsigned NumExplicitlySpecified, FunctionDecl *&Specialization,
3954 SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs,
3955 bool PartialOverloading, bool PartialOrdering,
3956 bool ForOverloadSetAddressResolution,
3957 llvm::function_ref<bool(bool)> CheckNonDependent) {
3958 // Enter a new template instantiation context while we instantiate the
3959 // actual function declaration.
3960 SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());
3962 *this, Info.getLocation(), FunctionTemplate, DeducedArgs,
3964 if (Inst.isInvalid())
3966
3967 ContextRAII SavedContext(*this, FunctionTemplate->getTemplatedDecl());
3968
3969 // C++ [temp.deduct.type]p2:
3970 // [...] or if any template argument remains neither deduced nor
3971 // explicitly specified, template argument deduction fails.
3972 bool IsIncomplete = false;
3975 *this, FunctionTemplate, FunctionTemplate->getTemplateParameters(),
3976 /*IsDeduced=*/true, Deduced, Info, CTAI, CurrentInstantiationScope,
3977 NumExplicitlySpecified, PartialOverloading ? &IsIncomplete : nullptr);
3979 return Result;
3980
3981 // Form the template argument list from the deduced template arguments.
3982 TemplateArgumentList *SugaredDeducedArgumentList =
3984 TemplateArgumentList *CanonicalDeducedArgumentList =
3986 Info.reset(SugaredDeducedArgumentList, CanonicalDeducedArgumentList);
3987
3988 // Substitute the deduced template arguments into the function template
3989 // declaration to produce the function template specialization.
3990 DeclContext *Owner = FunctionTemplate->getDeclContext();
3991 if (FunctionTemplate->getFriendObjectKind())
3992 Owner = FunctionTemplate->getLexicalDeclContext();
3993 FunctionDecl *FD = FunctionTemplate->getTemplatedDecl();
3994
3995 if (CheckNonDependent(/*OnlyInitializeNonUserDefinedConversions=*/true))
3997
3998 // C++20 [temp.deduct.general]p5: [CWG2369]
3999 // If the function template has associated constraints, those constraints
4000 // are checked for satisfaction. If the constraints are not satisfied, type
4001 // deduction fails.
4002 //
4003 // FIXME: We haven't implemented CWG2369 for lambdas yet, because we need
4004 // to figure out how to instantiate lambda captures to the scope without
4005 // first instantiating the lambda.
4006 bool IsLambda = isLambdaCallOperator(FD) || isLambdaConversionOperator(FD);
4007 if (!IsLambda && !IsIncomplete) {
4009 Info.getLocation(),
4010 FunctionTemplate->getCanonicalDecl()->getTemplatedDecl(),
4016 }
4017 }
4018 // C++ [temp.deduct.call]p10: [CWG1391]
4019 // If deduction succeeds for all parameters that contain
4020 // template-parameters that participate in template argument deduction,
4021 // and all template arguments are explicitly specified, deduced, or
4022 // obtained from default template arguments, remaining parameters are then
4023 // compared with the corresponding arguments. For each remaining parameter
4024 // P with a type that was non-dependent before substitution of any
4025 // explicitly-specified template arguments, if the corresponding argument
4026 // A cannot be implicitly converted to P, deduction fails.
4027 if (CheckNonDependent(/*OnlyInitializeNonUserDefinedConversions=*/false))
4029
4031 FunctionTemplate, CanonicalDeducedArgumentList->asArray(),
4032 /*Final=*/false);
4033 Specialization = cast_or_null<FunctionDecl>(
4034 SubstDecl(FD, Owner, SubstArgs));
4035 if (!Specialization || Specialization->isInvalidDecl())
4037
4038 assert(isSameDeclaration(Specialization->getPrimaryTemplate(),
4040
4041 // If the template argument list is owned by the function template
4042 // specialization, release it.
4043 if (Specialization->getTemplateSpecializationArgs() ==
4044 CanonicalDeducedArgumentList)
4045 Info.takeCanonical();
4046
4047 // C++2a [temp.deduct]p5
4048 // [...] When all template arguments have been deduced [...] all uses of
4049 // template parameters [...] are replaced with the corresponding deduced
4050 // or default argument values.
4051 // [...] If the function template has associated constraints
4052 // ([temp.constr.decl]), those constraints are checked for satisfaction
4053 // ([temp.constr.constr]). If the constraints are not satisfied, type
4054 // deduction fails.
4055 if (IsLambda && !IsIncomplete) {
4063 }
4064 }
4065
4066 // We skipped the instantiation of the explicit-specifier during the
4067 // substitution of `FD` before. So, we try to instantiate it back if
4068 // `Specialization` is either a constructor or a conversion function.
4072 Info, FunctionTemplate,
4073 DeducedArgs)) {
4075 }
4076 }
4077
4078 if (OriginalCallArgs) {
4079 // C++ [temp.deduct.call]p4:
4080 // In general, the deduction process attempts to find template argument
4081 // values that will make the deduced A identical to A (after the type A
4082 // is transformed as described above). [...]
4083 llvm::SmallDenseMap<std::pair<unsigned, QualType>, QualType> DeducedATypes;
4084 for (unsigned I = 0, N = OriginalCallArgs->size(); I != N; ++I) {
4085 OriginalCallArg OriginalArg = (*OriginalCallArgs)[I];
4086
4087 auto ParamIdx = OriginalArg.ArgIdx;
4088 unsigned ExplicitOffset =
4089 (Specialization->hasCXXExplicitFunctionObjectParameter() &&
4090 !ForOverloadSetAddressResolution)
4091 ? 1
4092 : 0;
4093 if (ParamIdx >= Specialization->getNumParams() - ExplicitOffset)
4094 // FIXME: This presumably means a pack ended up smaller than we
4095 // expected while deducing. Should this not result in deduction
4096 // failure? Can it even happen?
4097 continue;
4098
4099 QualType DeducedA;
4100 if (!OriginalArg.DecomposedParam) {
4101 // P is one of the function parameters, just look up its substituted
4102 // type.
4103 DeducedA =
4104 Specialization->getParamDecl(ParamIdx + ExplicitOffset)->getType();
4105 } else {
4106 // P is a decomposed element of a parameter corresponding to a
4107 // braced-init-list argument. Substitute back into P to find the
4108 // deduced A.
4109 QualType &CacheEntry =
4110 DeducedATypes[{ParamIdx, OriginalArg.OriginalParamType}];
4111 if (CacheEntry.isNull()) {
4113 *this, getPackIndexForParam(*this, FunctionTemplate, SubstArgs,
4114 ParamIdx));
4115 CacheEntry =
4116 SubstType(OriginalArg.OriginalParamType, SubstArgs,
4117 Specialization->getTypeSpecStartLoc(),
4118 Specialization->getDeclName());
4119 }
4120 DeducedA = CacheEntry;
4121 }
4122
4123 if (auto TDK =
4124 CheckOriginalCallArgDeduction(*this, Info, OriginalArg, DeducedA);
4126 return TDK;
4127 }
4128 }
4129
4130 // If we suppressed any diagnostics while performing template argument
4131 // deduction, and if we haven't already instantiated this declaration,
4132 // keep track of these diagnostics. They'll be emitted if this specialization
4133 // is actually used.
4134 if (Info.diag_begin() != Info.diag_end()) {
4135 auto [Pos, Inserted] =
4136 SuppressedDiagnostics.try_emplace(Specialization->getCanonicalDecl());
4137 if (Inserted)
4138 Pos->second.append(Info.diag_begin(), Info.diag_end());
4139 }
4140
4142}
4143
4147 if (!FailedTSC)
4148 return;
4149
4150 Decl *TemplatedDecl = TD->getTemplatedDecl();
4151 for (TemplateSpecCandidate &Candidate : *FailedTSC) {
4152 if (Candidate.Specialization &&
4153 declaresSameEntity(Candidate.Specialization, TemplatedDecl))
4154 return;
4155 }
4156
4157 FailedTSC->addCandidate().set(
4158 DeclAccessPair::make(TD, AS_public), TemplatedDecl,
4160}
4161
4163 FriendTemplateDecl *FTD, ClassTemplateDecl *PatternCTD,
4165 ArrayRef<TemplateArgument> PatternArgs,
4166 ArrayRef<TemplateArgument> CandidateArgs, SourceLocation Loc,
4167 TemplateSpecCandidateSet *FailedTSC,
4168 MultiLevelTemplateArgumentList &DeducedArgs) {
4171 ContextRAII SavedContext(*this, FTD->getDeclContext());
4172 LocalInstantiationScope InstantiationScope(*this);
4173 InstantiatingTemplate Inst(*this, Loc, FTD);
4174 if (Inst.isInvalid()) {
4175 TemplateDeductionInfo Info(Loc);
4177 *this, PatternCTD, Info, TemplateDeductionResult::InstantiationDepth,
4178 FailedTSC);
4179 return false;
4180 }
4181
4183 DeducedArgLists.reserve(TPLs.size());
4184 for (TemplateParameterList *Params : TPLs) {
4185 TemplateDeductionInfo Info(Loc, Params->getDepth());
4186 SFINAETrap Trap(*this, Info);
4189 Params, PatternArgs, CandidateArgs, Info, Deduced,
4190 /*NumberOfArgumentsMustMatch=*/false);
4191
4193 bool IsIncomplete = false;
4196 *this, PatternCTD, Params, /*IsDeduced=*/false, Deduced, Info, CTAI,
4197 &InstantiationScope, /*NumAlreadyConverted=*/0, &IsIncomplete);
4198 if (Result == TemplateDeductionResult::Success && IsIncomplete) {
4199 for (unsigned I = 0, N = Deduced.size(); I != N; ++I) {
4200 if (!Deduced[I].isNull())
4201 continue;
4202 Info.Param = makeTemplateParameter(Params->getParam(I));
4203 break;
4204 }
4205 Info.reset(
4209 }
4213 AddFriendTemplateDeductionCandidate(*this, PatternCTD, Info, Result,
4214 FailedTSC);
4215 return false;
4216 }
4217
4218 DeducedArgLists.push_back(
4220 }
4221
4222 for (TemplateArgumentList *Args : llvm::reverse(DeducedArgLists))
4223 DeducedArgs.addOuterTemplateArguments(FTD, Args->asArray(),
4224 /*Final=*/true);
4225 if (!TPLs.empty())
4226 DeducedArgs.addOuterRetainedLevels(TPLs.front()->getDepth());
4227
4228 if (DeducedArgs.isAnyArgInstantiationDependent() &&
4229 llvm::any_of(TPLs, [](TemplateParameterList *Params) {
4230 return Params->hasAssociatedConstraints();
4231 }))
4232 return false;
4233
4235 PatternArgLocs.reserve(PatternArgs.size());
4236 for (const TemplateArgument &Arg : PatternArgs)
4237 PatternArgLocs.push_back(
4239
4240 {
4241 TemplateDeductionInfo Info(Loc);
4242 SFINAETrap Trap(*this, Info);
4244 *this, CandidateCTD, PatternArgLocs, CandidateArgs, DeducedArgs, Info);
4248 AddFriendTemplateDeductionCandidate(*this, PatternCTD, Info, Result,
4249 FailedTSC);
4250 return false;
4251 }
4252 }
4253
4254 for (TemplateParameterList *Params : TPLs) {
4256 Params->getAssociatedConstraints(Constraints);
4257 if (Constraints.empty())
4258 continue;
4259
4260 TemplateDeductionInfo Info(Loc, Params->getDepth());
4261 SFINAETrap Trap(*this, Info);
4262 if (CheckConstraintSatisfaction(PatternCTD, Constraints, DeducedArgs,
4263 SourceRange(Loc),
4266 Trap.hasErrorOccurred()) {
4267 SmallVector<TemplateArgument, 4> CanonicalCandidateArgs;
4268 CanonicalCandidateArgs.reserve(CandidateArgs.size());
4269 for (const TemplateArgument &Arg : CandidateArgs)
4270 CanonicalCandidateArgs.push_back(
4271 Context.getCanonicalTemplateArgument(Arg));
4272 Info.reset(
4274 TemplateArgumentList::CreateCopy(Context, CanonicalCandidateArgs));
4276 *this, PatternCTD, Info,
4278 return false;
4279 }
4280 }
4281
4282 return true;
4283}
4284
4285/// Gets the type of a function for template-argument-deducton
4286/// purposes when it's considered as part of an overload set.
4288 FunctionDecl *Fn) {
4289 // We may need to deduce the return type of the function now.
4290 if (S.getLangOpts().CPlusPlus14 && Fn->getReturnType()->isUndeducedType() &&
4291 S.DeduceReturnType(Fn, R.Expression->getExprLoc(), /*Diagnose*/ false))
4292 return {};
4293
4294 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Fn))
4295 if (Method->isImplicitObjectMemberFunction()) {
4296 // An instance method that's referenced in a form that doesn't
4297 // look like a member pointer is just invalid.
4298 if (!R.HasFormOfMemberPointer)
4299 return {};
4300
4302 Fn->getType(), /*Qualifier=*/std::nullopt, Method->getParent());
4303 }
4304
4305 if (!R.IsAddressOfOperand) return Fn->getType();
4306 return S.Context.getPointerType(Fn->getType());
4307}
4308
4309/// Apply the deduction rules for overload sets.
4310///
4311/// \return the null type if this argument should be treated as an
4312/// undeduced context
4313static QualType
4315 Expr *Arg, QualType ParamType,
4316 bool ParamWasReference,
4317 TemplateSpecCandidateSet *FailedTSC = nullptr) {
4318
4320
4321 OverloadExpr *Ovl = R.Expression;
4322
4323 // C++0x [temp.deduct.call]p4
4324 unsigned TDF = 0;
4325 if (ParamWasReference)
4327 if (R.IsAddressOfOperand)
4328 TDF |= TDF_IgnoreQualifiers;
4329
4330 // C++0x [temp.deduct.call]p6:
4331 // When P is a function type, pointer to function type, or pointer
4332 // to member function type:
4333
4334 if (!ParamType->isFunctionType() &&
4335 !ParamType->isFunctionPointerType() &&
4336 !ParamType->isMemberFunctionPointerType()) {
4337 if (Ovl->hasExplicitTemplateArgs()) {
4338 // But we can still look for an explicit specialization.
4339 if (FunctionDecl *ExplicitSpec =
4341 Ovl, /*Complain=*/false,
4342 /*Found=*/nullptr, FailedTSC,
4343 /*ForTypeDeduction=*/true))
4344 return GetTypeOfFunction(S, R, ExplicitSpec);
4345 }
4346
4347 DeclAccessPair DAP;
4348 if (FunctionDecl *Viable =
4350 return GetTypeOfFunction(S, R, Viable);
4351
4352 return {};
4353 }
4354
4355 // Gather the explicit template arguments, if any.
4356 TemplateArgumentListInfo ExplicitTemplateArgs;
4357 if (Ovl->hasExplicitTemplateArgs())
4358 Ovl->copyTemplateArgumentsInto(ExplicitTemplateArgs);
4360 for (UnresolvedSetIterator I = Ovl->decls_begin(),
4361 E = Ovl->decls_end(); I != E; ++I) {
4362 NamedDecl *D = (*I)->getUnderlyingDecl();
4363
4364 if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D)) {
4365 // - If the argument is an overload set containing one or more
4366 // function templates, the parameter is treated as a
4367 // non-deduced context.
4368 if (!Ovl->hasExplicitTemplateArgs())
4369 return {};
4370
4371 // Otherwise, see if we can resolve a function type
4372 FunctionDecl *Specialization = nullptr;
4373 TemplateDeductionInfo Info(Ovl->getNameLoc());
4374 if (S.DeduceTemplateArguments(FunTmpl, &ExplicitTemplateArgs,
4377 continue;
4378
4379 D = Specialization;
4380 }
4381
4383 QualType ArgType = GetTypeOfFunction(S, R, Fn);
4384 if (ArgType.isNull()) continue;
4385
4386 // Function-to-pointer conversion.
4387 if (!ParamWasReference && ParamType->isPointerType() &&
4388 ArgType->isFunctionType())
4389 ArgType = S.Context.getPointerType(ArgType);
4390
4391 // - If the argument is an overload set (not containing function
4392 // templates), trial argument deduction is attempted using each
4393 // of the members of the set. If deduction succeeds for only one
4394 // of the overload set members, that member is used as the
4395 // argument value for the deduction. If deduction succeeds for
4396 // more than one member of the overload set the parameter is
4397 // treated as a non-deduced context.
4398
4399 // We do all of this in a fresh context per C++0x [temp.deduct.type]p2:
4400 // Type deduction is done independently for each P/A pair, and
4401 // the deduced template argument values are then combined.
4402 // So we do not reject deductions which were made elsewhere.
4404 Deduced(TemplateParams->size());
4405 TemplateDeductionInfo Info(Ovl->getNameLoc());
4407 S, TemplateParams, ParamType, ArgType, Info, Deduced, TDF,
4408 PartialOrderingKind::None, /*DeducedFromArrayBound=*/false,
4409 /*HasDeducedAnyParam=*/nullptr);
4411 continue;
4412 // C++ [temp.deduct.call]p6:
4413 // [...] If all successful deductions yield the same deduced A, that
4414 // deduced A is the result of deduction; otherwise, the parameter is
4415 // treated as a non-deduced context. [...]
4416 if (!Match.isNull() && !S.isSameOrCompatibleFunctionType(Match, ArgType))
4417 return {};
4418 Match = ArgType;
4419 }
4420
4421 return Match;
4422}
4423
4424/// Perform the adjustments to the parameter and argument types
4425/// described in C++ [temp.deduct.call].
4426///
4427/// \returns true if the caller should not attempt to perform any template
4428/// argument deduction based on this P/A pair because the argument is an
4429/// overloaded function set that could not be resolved.
4431 Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex,
4432 QualType &ParamType, QualType &ArgType,
4433 Expr::Classification ArgClassification, Expr *Arg, unsigned &TDF,
4434 TemplateSpecCandidateSet *FailedTSC = nullptr) {
4435 // C++0x [temp.deduct.call]p3:
4436 // If P is a cv-qualified type, the top level cv-qualifiers of P's type
4437 // are ignored for type deduction.
4438 if (ParamType.hasQualifiers())
4439 ParamType = ParamType.getUnqualifiedType();
4440
4441 // [...] If P is a reference type, the type referred to by P is
4442 // used for type deduction.
4443 const ReferenceType *ParamRefType = ParamType->getAs<ReferenceType>();
4444 if (ParamRefType)
4445 ParamType = ParamRefType->getPointeeType();
4446
4447 // Overload sets usually make this parameter an undeduced context,
4448 // but there are sometimes special circumstances. Typically
4449 // involving a template-id-expr.
4450 if (ArgType == S.Context.OverloadTy) {
4451 assert(Arg && "expected a non-null arg expression");
4452 ArgType = ResolveOverloadForDeduction(S, TemplateParams, Arg, ParamType,
4453 ParamRefType != nullptr, FailedTSC);
4454 if (ArgType.isNull())
4455 return true;
4456 }
4457
4458 if (ParamRefType) {
4459 // If the argument has incomplete array type, try to complete its type.
4460 if (ArgType->isIncompleteArrayType()) {
4461 assert(Arg && "expected a non-null arg expression");
4462 ArgType = S.getCompletedType(Arg);
4463 }
4464
4465 // C++1z [temp.deduct.call]p3:
4466 // If P is a forwarding reference and the argument is an lvalue, the type
4467 // "lvalue reference to A" is used in place of A for type deduction.
4468 if (isForwardingReference(QualType(ParamRefType, 0), FirstInnerIndex) &&
4469 ArgClassification.isLValue()) {
4470 if (S.getLangOpts().OpenCL && !ArgType.hasAddressSpace())
4471 ArgType = S.Context.getAddrSpaceQualType(
4473 ArgType = S.Context.getLValueReferenceType(ArgType);
4474 }
4475 } else {
4476 // C++ [temp.deduct.call]p2:
4477 // If P is not a reference type:
4478 // - If A is an array type, the pointer type produced by the
4479 // array-to-pointer standard conversion (4.2) is used in place of
4480 // A for type deduction; otherwise,
4481 // - If A is a function type, the pointer type produced by the
4482 // function-to-pointer standard conversion (4.3) is used in place
4483 // of A for type deduction; otherwise,
4484 if (ArgType->canDecayToPointerType())
4485 ArgType = S.Context.getDecayedType(ArgType);
4486 else {
4487 // - If A is a cv-qualified type, the top level cv-qualifiers of A's
4488 // type are ignored for type deduction.
4489 ArgType = ArgType.getUnqualifiedType();
4490 }
4491 }
4492
4493 // C++0x [temp.deduct.call]p4:
4494 // In general, the deduction process attempts to find template argument
4495 // values that will make the deduced A identical to A (after the type A
4496 // is transformed as described above). [...]
4498
4499 // - If the original P is a reference type, the deduced A (i.e., the
4500 // type referred to by the reference) can be more cv-qualified than
4501 // the transformed A.
4502 if (ParamRefType)
4504 // - The transformed A can be another pointer or pointer to member
4505 // type that can be converted to the deduced A via a qualification
4506 // conversion (4.4).
4507 if (ArgType->isPointerType() || ArgType->isMemberPointerType() ||
4508 ArgType->isObjCObjectPointerType())
4509 TDF |= TDF_IgnoreQualifiers;
4510 // - If P is a class and P has the form simple-template-id, then the
4511 // transformed A can be a derived class of the deduced A. Likewise,
4512 // if P is a pointer to a class of the form simple-template-id, the
4513 // transformed A can be a pointer to a derived class pointed to by
4514 // the deduced A.
4515 if (isSimpleTemplateIdType(ParamType) ||
4516 (ParamType->getAs<PointerType>() &&
4518 ParamType->castAs<PointerType>()->getPointeeType())))
4519 TDF |= TDF_DerivedClass;
4520
4521 return false;
4522}
4523
4524static bool
4526 QualType T);
4527
4529 Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex,
4530 QualType ParamType, QualType ArgType,
4531 Expr::Classification ArgClassification, Expr *Arg,
4535 bool DecomposedParam, unsigned ArgIdx, unsigned TDF,
4536 TemplateSpecCandidateSet *FailedTSC = nullptr);
4537
4538/// Attempt template argument deduction from an initializer list
4539/// deemed to be an argument in a function call.
4541 Sema &S, TemplateParameterList *TemplateParams, QualType AdjustedParamType,
4544 SmallVectorImpl<Sema::OriginalCallArg> &OriginalCallArgs, unsigned ArgIdx,
4545 unsigned TDF) {
4546 // C++ [temp.deduct.call]p1: (CWG 1591)
4547 // If removing references and cv-qualifiers from P gives
4548 // std::initializer_list<P0> or P0[N] for some P0 and N and the argument is
4549 // a non-empty initializer list, then deduction is performed instead for
4550 // each element of the initializer list, taking P0 as a function template
4551 // parameter type and the initializer element as its argument
4552 //
4553 // We've already removed references and cv-qualifiers here.
4554 if (!ILE->getNumInits())
4556
4557 QualType ElTy;
4558 auto *ArrTy = S.Context.getAsArrayType(AdjustedParamType);
4559 if (ArrTy)
4560 ElTy = ArrTy->getElementType();
4561 else if (!S.isStdInitializerList(AdjustedParamType, &ElTy)) {
4562 // Otherwise, an initializer list argument causes the parameter to be
4563 // considered a non-deduced context
4565 }
4566
4567 // Resolving a core issue: a braced-init-list containing any designators is
4568 // a non-deduced context.
4569 for (Expr *E : ILE->inits())
4572
4573 // Deduction only needs to be done for dependent types.
4574 if (ElTy->isDependentType()) {
4575 for (Expr *E : ILE->inits()) {
4577 S, TemplateParams, 0, ElTy, E->getType(),
4578 E->Classify(S.getASTContext()), E, Info, Deduced,
4579 OriginalCallArgs, true, ArgIdx, TDF);
4581 return Result;
4582 }
4583 }
4584
4585 // in the P0[N] case, if N is a non-type template parameter, N is deduced
4586 // from the length of the initializer list.
4587 if (auto *DependentArrTy = dyn_cast_or_null<DependentSizedArrayType>(ArrTy)) {
4588 // Determine the array bound is something we can deduce.
4590 getNTTParameterFromExpr(Info, DependentArrTy->getSizeExpr())) {
4591 // We can perform template argument deduction for the given non-type
4592 // template parameter.
4593 // C++ [temp.deduct.type]p13:
4594 // The type of N in the type T[N] is std::size_t.
4596 llvm::APInt Size(S.Context.getIntWidth(T),
4599 S, TemplateParams, NTTP, llvm::APSInt(Size), T,
4600 /*ArrayBound=*/true, Info, /*PartialOrdering=*/false, Deduced,
4601 /*HasDeducedAnyParam=*/nullptr);
4603 return Result;
4604 }
4605 }
4606
4608}
4609
4610/// Perform template argument deduction per [temp.deduct.call] for a
4611/// single parameter / argument pair.
4613 Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex,
4614 QualType ParamType, QualType ArgType,
4615 Expr::Classification ArgClassification, Expr *Arg,
4619 bool DecomposedParam, unsigned ArgIdx, unsigned TDF,
4620 TemplateSpecCandidateSet *FailedTSC) {
4621
4622 QualType OrigParamType = ParamType;
4623
4624 // If P is a reference type [...]
4625 // If P is a cv-qualified type [...]
4627 S, TemplateParams, FirstInnerIndex, ParamType, ArgType,
4628 ArgClassification, Arg, TDF, FailedTSC))
4630
4631 // If [...] the argument is a non-empty initializer list [...]
4632 if (InitListExpr *ILE = dyn_cast_if_present<InitListExpr>(Arg))
4633 return DeduceFromInitializerList(S, TemplateParams, ParamType, ILE, Info,
4634 Deduced, OriginalCallArgs, ArgIdx, TDF);
4635
4636 // [...] the deduction process attempts to find template argument values
4637 // that will make the deduced A identical to A
4638 //
4639 // Keep track of the argument type and corresponding parameter index,
4640 // so we can check for compatibility between the deduced A and A.
4641 if (Arg)
4642 OriginalCallArgs.push_back(
4643 Sema::OriginalCallArg(OrigParamType, DecomposedParam, ArgIdx, ArgType));
4645 S, TemplateParams, ParamType, ArgType, Info, Deduced, TDF,
4646 PartialOrderingKind::None, /*DeducedFromArrayBound=*/false,
4647 /*HasDeducedAnyParam=*/nullptr);
4648}
4649
4652 TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,
4654 bool PartialOverloading, bool AggregateDeductionCandidate,
4655 bool PartialOrdering, QualType ObjectType,
4656 Expr::Classification ObjectClassification,
4657 bool ForOverloadSetAddressResolution,
4658 llvm::function_ref<bool(ArrayRef<QualType>, bool)> CheckNonDependent) {
4659 if (FunctionTemplate->isInvalidDecl())
4661
4662 FunctionDecl *Function = FunctionTemplate->getTemplatedDecl();
4663 unsigned NumParams = Function->getNumParams();
4664 bool HasExplicitObject = false;
4665 int ExplicitObjectOffset = 0;
4666
4667 // [C++26] [over.call.func]p3
4668 // If the primary-expression is the address of an overload set,
4669 // the argument list is the same as the expression-list in the call.
4670 // Otherwise, the argument list is the expression-list in the call augmented
4671 // by the addition of an implied object argument as in a qualified function
4672 // call.
4673 if (!ForOverloadSetAddressResolution &&
4674 Function->hasCXXExplicitFunctionObjectParameter()) {
4675 HasExplicitObject = true;
4676 ExplicitObjectOffset = 1;
4677 }
4678
4679 unsigned FirstInnerIndex = getFirstInnerIndex(FunctionTemplate);
4680
4681 // C++ [temp.deduct.call]p1:
4682 // Template argument deduction is done by comparing each function template
4683 // parameter type (call it P) with the type of the corresponding argument
4684 // of the call (call it A) as described below.
4685 if (Args.size() < Function->getMinRequiredExplicitArguments() &&
4686 !PartialOverloading)
4688 else if (TooManyArguments(NumParams, Args.size() + ExplicitObjectOffset,
4689 PartialOverloading)) {
4690 const auto *Proto = Function->getType()->castAs<FunctionProtoType>();
4691 if (Proto->isTemplateVariadic())
4692 /* Do nothing */;
4693 else if (!Proto->isVariadic())
4695 }
4696
4699 Sema::SFINAETrap Trap(*this, Info);
4700
4701 // The types of the parameters from which we will perform template argument
4702 // deduction.
4703 LocalInstantiationScope InstScope(*this);
4704 TemplateParameterList *TemplateParams
4705 = FunctionTemplate->getTemplateParameters();
4707 SmallVector<QualType, 8> ParamTypes;
4708 unsigned NumExplicitlySpecified = 0;
4709 if (ExplicitTemplateArgs) {
4712 Result = SubstituteExplicitTemplateArguments(
4713 FunctionTemplate, *ExplicitTemplateArgs, Deduced, ParamTypes, nullptr,
4714 Info);
4715 });
4717 return Result;
4718 if (Trap.hasErrorOccurred())
4720
4721 NumExplicitlySpecified = Deduced.size();
4722 } else {
4723 // Just fill in the parameter types from the function declaration.
4724 for (unsigned I = 0; I != NumParams; ++I)
4725 ParamTypes.push_back(Function->getParamDecl(I)->getType());
4726 }
4727
4728 SmallVector<OriginalCallArg, 8> OriginalCallArgs;
4729
4730 // Deduce an argument of type ParamType from an expression with index ArgIdx.
4731 auto DeduceCallArgument = [&](QualType ParamType, unsigned ArgIdx,
4732 bool ExplicitObjectArgument) {
4733 // C++ [demp.deduct.call]p1: (DR1391)
4734 // Template argument deduction is done by comparing each function template
4735 // parameter that contains template-parameters that participate in
4736 // template argument deduction ...
4737 if (!hasDeducibleTemplateParameters(*this, FunctionTemplate, ParamType))
4739
4740 if (ExplicitObjectArgument) {
4741 // ... with the type of the corresponding argument
4743 *this, TemplateParams, FirstInnerIndex, ParamType, ObjectType,
4744 ObjectClassification,
4745 /*Arg=*/nullptr, Info, Deduced, OriginalCallArgs,
4746 /*Decomposed*/ false, ArgIdx, /*TDF*/ 0);
4747 }
4748
4749 // ... with the type of the corresponding argument
4751 *this, TemplateParams, FirstInnerIndex, ParamType,
4752 Args[ArgIdx]->getType(), Args[ArgIdx]->Classify(getASTContext()),
4753 Args[ArgIdx], Info, Deduced, OriginalCallArgs, /*Decomposed*/ false,
4754 ArgIdx, /*TDF*/ 0);
4755 };
4756
4757 // Deduce template arguments from the function parameters.
4758 Deduced.resize(TemplateParams->size());
4759 SmallVector<QualType, 8> ParamTypesForArgChecking;
4760 for (unsigned ParamIdx = 0, NumParamTypes = ParamTypes.size(), ArgIdx = 0;
4761 ParamIdx != NumParamTypes; ++ParamIdx) {
4762 QualType ParamType = ParamTypes[ParamIdx];
4763
4764 const PackExpansionType *ParamExpansion =
4765 dyn_cast<PackExpansionType>(ParamType);
4766 if (!ParamExpansion) {
4767 // Simple case: matching a function parameter to a function argument.
4768 if (ArgIdx >= Args.size() && !(HasExplicitObject && ParamIdx == 0))
4769 break;
4770
4771 ParamTypesForArgChecking.push_back(ParamType);
4772
4773 if (ParamIdx == 0 && HasExplicitObject) {
4774 if (ObjectType.isNull())
4776
4777 if (auto Result = DeduceCallArgument(ParamType, 0,
4778 /*ExplicitObjectArgument=*/true);
4780 return Result;
4781 continue;
4782 }
4783
4784 if (auto Result = DeduceCallArgument(ParamType, ArgIdx++,
4785 /*ExplicitObjectArgument=*/false);
4787 return Result;
4788
4789 continue;
4790 }
4791
4792 bool IsTrailingPack = ParamIdx + 1 == NumParamTypes;
4793
4794 QualType ParamPattern = ParamExpansion->getPattern();
4795 PackDeductionScope PackScope(*this, TemplateParams, Deduced, Info,
4796 ParamPattern,
4797 AggregateDeductionCandidate && IsTrailingPack);
4798
4799 // C++0x [temp.deduct.call]p1:
4800 // For a function parameter pack that occurs at the end of the
4801 // parameter-declaration-list, the type A of each remaining argument of
4802 // the call is compared with the type P of the declarator-id of the
4803 // function parameter pack. Each comparison deduces template arguments
4804 // for subsequent positions in the template parameter packs expanded by
4805 // the function parameter pack. When a function parameter pack appears
4806 // in a non-deduced context [not at the end of the list], the type of
4807 // that parameter pack is never deduced.
4808 //
4809 // FIXME: The above rule allows the size of the parameter pack to change
4810 // after we skip it (in the non-deduced case). That makes no sense, so
4811 // we instead notionally deduce the pack against N arguments, where N is
4812 // the length of the explicitly-specified pack if it's expanded by the
4813 // parameter pack and 0 otherwise, and we treat each deduction as a
4814 // non-deduced context.
4815 if (IsTrailingPack || PackScope.hasFixedArity()) {
4816 for (; ArgIdx < Args.size() && PackScope.hasNextElement();
4817 PackScope.nextPackElement(), ++ArgIdx) {
4818 ParamTypesForArgChecking.push_back(ParamPattern);
4819 if (auto Result = DeduceCallArgument(ParamPattern, ArgIdx,
4820 /*ExplicitObjectArgument=*/false);
4822 return Result;
4823 }
4824 } else {
4825 // If the parameter type contains an explicitly-specified pack that we
4826 // could not expand, skip the number of parameters notionally created
4827 // by the expansion.
4828 UnsignedOrNone NumExpansions = ParamExpansion->getNumExpansions();
4829 if (NumExpansions && !PackScope.isPartiallyExpanded()) {
4830 for (unsigned I = 0; I != *NumExpansions && ArgIdx < Args.size();
4831 ++I, ++ArgIdx) {
4832 ParamTypesForArgChecking.push_back(ParamPattern);
4833 // FIXME: Should we add OriginalCallArgs for these? What if the
4834 // corresponding argument is a list?
4835 PackScope.nextPackElement();
4836 }
4837 } else if (!IsTrailingPack && !PackScope.isPartiallyExpanded() &&
4838 PackScope.isDeducedFromEarlierParameter()) {
4839 // [temp.deduct.general#3]
4840 // When all template arguments have been deduced
4841 // or obtained from default template arguments, all uses of template
4842 // parameters in the template parameter list of the template are
4843 // replaced with the corresponding deduced or default argument values
4844 //
4845 // If we have a trailing parameter pack, that has been deduced
4846 // previously we substitute the pack here in a similar fashion as
4847 // above with the trailing parameter packs. The main difference here is
4848 // that, in this case we are not processing all of the remaining
4849 // arguments. We are only process as many arguments as we have in
4850 // the already deduced parameter.
4851 UnsignedOrNone ArgPosAfterSubstitution =
4852 PackScope.getSavedPackSizeIfAllEqual();
4853 if (!ArgPosAfterSubstitution)
4854 continue;
4855
4856 unsigned PackArgEnd = ArgIdx + *ArgPosAfterSubstitution;
4857 for (; ArgIdx < PackArgEnd && ArgIdx < Args.size(); ArgIdx++) {
4858 ParamTypesForArgChecking.push_back(ParamPattern);
4859 if (auto Result =
4860 DeduceCallArgument(ParamPattern, ArgIdx,
4861 /*ExplicitObjectArgument=*/false);
4863 return Result;
4864
4865 PackScope.nextPackElement();
4866 }
4867 }
4868 }
4869
4870 // Build argument packs for each of the parameter packs expanded by this
4871 // pack expansion.
4872 if (auto Result = PackScope.finish();
4874 return Result;
4875 }
4876
4877 // Capture the context in which the function call is made. This is the context
4878 // that is needed when the accessibility of template arguments is checked.
4879 DeclContext *CallingCtx = CurContext;
4880
4883 Result = FinishTemplateArgumentDeduction(
4884 FunctionTemplate, Deduced, NumExplicitlySpecified, Specialization, Info,
4885 &OriginalCallArgs, PartialOverloading, PartialOrdering,
4886 ForOverloadSetAddressResolution,
4887 [&, CallingCtx](bool OnlyInitializeNonUserDefinedConversions) {
4888 ContextRAII SavedContext(*this, CallingCtx);
4889 return CheckNonDependent(ParamTypesForArgChecking,
4890 OnlyInitializeNonUserDefinedConversions);
4891 });
4892 });
4893 if (Trap.hasErrorOccurred()) {
4894 if (Specialization)
4895 Specialization->setInvalidDecl(true);
4897 }
4898 return Result;
4899}
4900
4903 bool AdjustExceptionSpec) {
4904 if (ArgFunctionType.isNull())
4905 return ArgFunctionType;
4906
4907 const auto *FunctionTypeP = FunctionType->castAs<FunctionProtoType>();
4908 const auto *ArgFunctionTypeP = ArgFunctionType->castAs<FunctionProtoType>();
4909 FunctionProtoType::ExtProtoInfo EPI = ArgFunctionTypeP->getExtProtoInfo();
4910 bool Rebuild = false;
4911
4912 CallingConv CC = FunctionTypeP->getCallConv();
4913 if (EPI.ExtInfo.getCC() != CC) {
4914 EPI.ExtInfo = EPI.ExtInfo.withCallingConv(CC);
4915 Rebuild = true;
4916 }
4917
4918 bool NoReturn = FunctionTypeP->getNoReturnAttr();
4919 if (EPI.ExtInfo.getNoReturn() != NoReturn) {
4920 EPI.ExtInfo = EPI.ExtInfo.withNoReturn(NoReturn);
4921 Rebuild = true;
4922 }
4923
4924 if (AdjustExceptionSpec && (FunctionTypeP->hasExceptionSpec() ||
4925 ArgFunctionTypeP->hasExceptionSpec())) {
4926 EPI.ExceptionSpec = FunctionTypeP->getExtProtoInfo().ExceptionSpec;
4927 Rebuild = true;
4928 }
4929
4930 if (!Rebuild)
4931 return ArgFunctionType;
4932
4933 return Context.getFunctionType(ArgFunctionTypeP->getReturnType(),
4934 ArgFunctionTypeP->getParamTypes(), EPI);
4935}
4936
4939 TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ArgFunctionType,
4941 bool IsAddressOfFunction) {
4942 if (FunctionTemplate->isInvalidDecl())
4944
4945 FunctionDecl *Function = FunctionTemplate->getTemplatedDecl();
4946 TemplateParameterList *TemplateParams
4947 = FunctionTemplate->getTemplateParameters();
4948 QualType FunctionType = Function->getType();
4949
4952
4953 // Unevaluated SFINAE context.
4956 SFINAETrap Trap(*this, Info);
4957
4958 // Substitute any explicit template arguments.
4959 LocalInstantiationScope InstScope(*this);
4961 unsigned NumExplicitlySpecified = 0;
4962 SmallVector<QualType, 4> ParamTypes;
4963 if (ExplicitTemplateArgs) {
4966 Result = SubstituteExplicitTemplateArguments(
4967 FunctionTemplate, *ExplicitTemplateArgs, Deduced, ParamTypes,
4968 &FunctionType, Info);
4969 });
4971 return Result;
4972 if (Trap.hasErrorOccurred())
4974
4975 NumExplicitlySpecified = Deduced.size();
4976 }
4977
4978 // When taking the address of a function, we require convertibility of
4979 // the resulting function type. Otherwise, we allow arbitrary mismatches
4980 // of calling convention and noreturn.
4981 if (!IsAddressOfFunction)
4982 ArgFunctionType = adjustCCAndNoReturn(ArgFunctionType, FunctionType,
4983 /*AdjustExceptionSpec*/false);
4984
4985 Deduced.resize(TemplateParams->size());
4986
4987 // If the function has a deduced return type, substitute it for a dependent
4988 // type so that we treat it as a non-deduced context in what follows.
4989 bool HasDeducedReturnType = false;
4990 if (getLangOpts().CPlusPlus14 &&
4991 Function->getReturnType()->getContainedAutoType()) {
4993 HasDeducedReturnType = true;
4994 }
4995
4996 if (!ArgFunctionType.isNull() && !FunctionType.isNull()) {
4997 unsigned TDF =
4999 // Deduce template arguments from the function type.
5001 *this, TemplateParams, FunctionType, ArgFunctionType, Info, Deduced,
5002 TDF, PartialOrderingKind::None, /*DeducedFromArrayBound=*/false,
5003 /*HasDeducedAnyParam=*/nullptr);
5005 return Result;
5006 // Substituting the function type can instantiate the trailing return type,
5007 // so handle the same immediate-context substitution failure here.
5008 if (Trap.hasErrorOccurred())
5010 }
5011
5014 Result = FinishTemplateArgumentDeduction(
5015 FunctionTemplate, Deduced, NumExplicitlySpecified, Specialization, Info,
5016 /*OriginalCallArgs=*/nullptr, /*PartialOverloading=*/false,
5017 /*PartialOrdering=*/true, IsAddressOfFunction);
5018 });
5019 // Taking the address of a function template forms its function type, and
5020 // substituting into that type can require instantiating a trailing return
5021 // type whose expression selects a deleted function. That is a deduction
5022 // failure, not a hard error:
5023 //
5024 // C++ [temp.deduct.funcaddr]p1:
5025 // [...] If there is a target, the function template's function type and
5026 // the target type are used as the types of P and A, and the deduction is
5027 // done as described in [temp.deduct.type].
5028 //
5029 // C++ [temp.deduct.general]p7:
5030 // [...] The substitution occurs in all types and expressions that are
5031 // used in the deduction substitution loci. The expressions include [...]
5032 // general expressions (i.e., non-constant expressions) inside sizeof,
5033 // decltype, and other contexts that allow non-constant expressions. [...]
5034 //
5035 // C++ [dcl.fct.def.delete]p2:
5036 // A construct that designates a deleted function implicitly or
5037 // explicitly, other than to declare it [...], is ill-formed.
5038 // [Note: [...] It applies even for references in expressions that are not
5039 // potentially evaluated. - end note]
5040 //
5041 // C++ [temp.deduct.general]p8:
5042 // If a substitution results in an invalid type or expression, type
5043 // deduction fails. [...] Invalid types and expressions can result in a
5044 // deduction failure only in the immediate context of the deduction
5045 // substitution loci. [...]
5046 //
5047 // This substitution is in that immediate context, so treat diagnostics
5048 // recorded by the SFINAE trap as deduction failure instead of replaying
5049 // them as hard errors.
5050 if (Trap.hasErrorOccurred()) {
5051 if (Specialization)
5052 Specialization->setInvalidDecl(true);
5054 }
5056 return Result;
5057
5058 // If the function has a deduced return type, deduce it now, so we can check
5059 // that the deduced function type matches the requested type.
5060 if (HasDeducedReturnType && IsAddressOfFunction &&
5061 Specialization->getReturnType()->isUndeducedType() &&
5064
5065 // [C++26][expr.const]/p17
5066 // An expression or conversion is immediate-escalating if it is not initially
5067 // in an immediate function context and it is [...]
5068 // a potentially-evaluated id-expression that denotes an immediate function.
5069 if (IsAddressOfFunction && getLangOpts().CPlusPlus20 &&
5070 Specialization->isImmediateEscalating() && PotentiallyEvaluated &&
5072 Info.getLocation()))
5074
5075 // Adjust the exception specification of the argument to match the
5076 // substituted and resolved type we just formed. (Calling convention and
5077 // noreturn can't be dependent, so we don't actually need this for them
5078 // right now.)
5079 QualType SpecializationType = Specialization->getType();
5080 if (!IsAddressOfFunction) {
5081 ArgFunctionType = adjustCCAndNoReturn(ArgFunctionType, SpecializationType,
5082 /*AdjustExceptionSpec*/true);
5083
5084 // Revert placeholder types in the return type back to undeduced types so
5085 // that the comparison below compares the declared return types.
5086 if (HasDeducedReturnType) {
5087 SpecializationType = SubstAutoType(SpecializationType, QualType());
5088 ArgFunctionType = SubstAutoType(ArgFunctionType, QualType());
5089 }
5090 }
5091
5092 // If the requested function type does not match the actual type of the
5093 // specialization with respect to arguments of compatible pointer to function
5094 // types, template argument deduction fails.
5095 if (!ArgFunctionType.isNull()) {
5096 if (IsAddressOfFunction ? !isSameOrCompatibleFunctionType(
5097 SpecializationType, ArgFunctionType)
5098 : !Context.hasSameFunctionTypeIgnoringExceptionSpec(
5099 SpecializationType, ArgFunctionType)) {
5100 Info.FirstArg = TemplateArgument(SpecializationType);
5101 Info.SecondArg = TemplateArgument(ArgFunctionType);
5103 }
5104 }
5105
5107}
5108
5110 FunctionTemplateDecl *ConversionTemplate, QualType ObjectType,
5111 Expr::Classification ObjectClassification, QualType A,
5113 if (ConversionTemplate->isInvalidDecl())
5115
5116 CXXConversionDecl *ConversionGeneric
5117 = cast<CXXConversionDecl>(ConversionTemplate->getTemplatedDecl());
5118
5119 QualType P = ConversionGeneric->getConversionType();
5120 bool IsReferenceP = P->isReferenceType();
5121 bool IsReferenceA = A->isReferenceType();
5122
5123 // C++0x [temp.deduct.conv]p2:
5124 // If P is a reference type, the type referred to by P is used for
5125 // type deduction.
5126 if (const ReferenceType *PRef = P->getAs<ReferenceType>())
5127 P = PRef->getPointeeType();
5128
5129 // C++0x [temp.deduct.conv]p4:
5130 // [...] If A is a reference type, the type referred to by A is used
5131 // for type deduction.
5132 if (const ReferenceType *ARef = A->getAs<ReferenceType>()) {
5133 A = ARef->getPointeeType();
5134 // We work around a defect in the standard here: cv-qualifiers are also
5135 // removed from P and A in this case, unless P was a reference type. This
5136 // seems to mostly match what other compilers are doing.
5137 if (!IsReferenceP) {
5138 A = A.getUnqualifiedType();
5139 P = P.getUnqualifiedType();
5140 }
5141
5142 // C++ [temp.deduct.conv]p3:
5143 //
5144 // If A is not a reference type:
5145 } else {
5146 assert(!A->isReferenceType() && "Reference types were handled above");
5147
5148 // - If P is an array type, the pointer type produced by the
5149 // array-to-pointer standard conversion (4.2) is used in place
5150 // of P for type deduction; otherwise,
5151 if (P->isArrayType())
5152 P = Context.getArrayDecayedType(P);
5153 // - If P is a function type, the pointer type produced by the
5154 // function-to-pointer standard conversion (4.3) is used in
5155 // place of P for type deduction; otherwise,
5156 else if (P->isFunctionType())
5157 P = Context.getPointerType(P);
5158 // - If P is a cv-qualified type, the top level cv-qualifiers of
5159 // P's type are ignored for type deduction.
5160 else
5161 P = P.getUnqualifiedType();
5162
5163 // C++0x [temp.deduct.conv]p4:
5164 // If A is a cv-qualified type, the top level cv-qualifiers of A's
5165 // type are ignored for type deduction. If A is a reference type, the type
5166 // referred to by A is used for type deduction.
5167 A = A.getUnqualifiedType();
5168 }
5169
5170 // Unevaluated SFINAE context.
5173 SFINAETrap Trap(*this, Info);
5174
5175 // C++ [temp.deduct.conv]p1:
5176 // Template argument deduction is done by comparing the return
5177 // type of the template conversion function (call it P) with the
5178 // type that is required as the result of the conversion (call it
5179 // A) as described in 14.8.2.4.
5180 TemplateParameterList *TemplateParams
5181 = ConversionTemplate->getTemplateParameters();
5183 Deduced.resize(TemplateParams->size());
5184
5185 // C++0x [temp.deduct.conv]p4:
5186 // In general, the deduction process attempts to find template
5187 // argument values that will make the deduced A identical to
5188 // A. However, there are two cases that allow a difference:
5189 unsigned TDF = 0;
5190 // - If the original A is a reference type, A can be more
5191 // cv-qualified than the deduced A (i.e., the type referred to
5192 // by the reference)
5193 if (IsReferenceA)
5195 // - The deduced A can be another pointer or pointer to member
5196 // type that can be converted to A via a qualification
5197 // conversion.
5198 //
5199 // (C++0x [temp.deduct.conv]p6 clarifies that this only happens when
5200 // both P and A are pointers or member pointers. In this case, we
5201 // just ignore cv-qualifiers completely).
5202 if ((P->isPointerType() && A->isPointerType()) ||
5204 TDF |= TDF_IgnoreQualifiers;
5205
5207 if (ConversionGeneric->isExplicitObjectMemberFunction()) {
5208 QualType ParamType = ConversionGeneric->getParamDecl(0)->getType();
5211 *this, TemplateParams, getFirstInnerIndex(ConversionTemplate),
5212 ParamType, ObjectType, ObjectClassification,
5213 /*Arg=*/nullptr, Info, Deduced, OriginalCallArgs,
5214 /*Decomposed*/ false, 0, /*TDF*/ 0);
5216 return Result;
5217 }
5218
5220 *this, TemplateParams, P, A, Info, Deduced, TDF,
5221 PartialOrderingKind::None, /*DeducedFromArrayBound=*/false,
5222 /*HasDeducedAnyParam=*/nullptr);
5224 return Result;
5225
5226 // Create an Instantiation Scope for finalizing the operator.
5227 LocalInstantiationScope InstScope(*this);
5228 // Finish template argument deduction.
5229 FunctionDecl *ConversionSpecialized = nullptr;
5232 Result = FinishTemplateArgumentDeduction(
5233 ConversionTemplate, Deduced, 0, ConversionSpecialized, Info,
5234 &OriginalCallArgs, /*PartialOverloading=*/false,
5235 /*PartialOrdering=*/false, /*ForOverloadSetAddressResolution*/ false);
5236 });
5237 Specialization = cast_or_null<CXXConversionDecl>(ConversionSpecialized);
5238 return Result;
5239}
5240
5243 TemplateArgumentListInfo *ExplicitTemplateArgs,
5246 bool IsAddressOfFunction) {
5247 return DeduceTemplateArguments(FunctionTemplate, ExplicitTemplateArgs,
5248 QualType(), Specialization, Info,
5249 IsAddressOfFunction);
5250}
5251
5252namespace {
5253 struct DependentAuto { bool IsPack; };
5254
5255 /// Substitute the 'auto' specifier or deduced template specialization type
5256 /// specifier within a type for a given replacement type.
5257 class SubstituteDeducedTypeTransform :
5258 public TreeTransform<SubstituteDeducedTypeTransform> {
5259 DeducedKind DK;
5260 QualType Replacement;
5261 bool UseTypeSugar;
5263
5264 public:
5265 SubstituteDeducedTypeTransform(Sema &SemaRef, DependentAuto DA)
5266 : TreeTransform<SubstituteDeducedTypeTransform>(SemaRef),
5267 DK(DA.IsPack ? DeducedKind::DeducedAsPack
5269 UseTypeSugar(true) {}
5270
5271 SubstituteDeducedTypeTransform(Sema &SemaRef, QualType Replacement,
5272 bool UseTypeSugar = true)
5273 : TreeTransform<SubstituteDeducedTypeTransform>(SemaRef),
5274 DK(Replacement.isNull() ? DeducedKind::Undeduced
5275 : DeducedKind::Deduced),
5276 Replacement(Replacement), UseTypeSugar(UseTypeSugar) {
5277 assert((!Replacement.isNull() || UseTypeSugar) &&
5278 "An undeduced auto type is never type sugar");
5279 }
5280
5281 QualType TransformDesugared(TypeLocBuilder &TLB, DeducedTypeLoc TL) {
5282 assert(isa<TemplateTypeParmType>(Replacement) &&
5283 "unexpected unsugared replacement kind");
5284 QualType Result = Replacement;
5285 TemplateTypeParmTypeLoc NewTL = TLB.push<TemplateTypeParmTypeLoc>(Result);
5286 NewTL.setNameLoc(TL.getNameLoc());
5287 return Result;
5288 }
5289
5290 QualType TransformAutoType(TypeLocBuilder &TLB, AutoTypeLoc TL) {
5291 // If we're building the type pattern to deduce against, don't wrap the
5292 // substituted type in an AutoType. Certain template deduction rules
5293 // apply only when a template type parameter appears directly (and not if
5294 // the parameter is found through desugaring). For instance:
5295 // auto &&lref = lvalue;
5296 // must transform into "rvalue reference to T" not "rvalue reference to
5297 // auto type deduced as T" in order for [temp.deduct.call]p3 to apply.
5298 //
5299 // FIXME: Is this still necessary?
5300 if (!UseTypeSugar)
5301 return TransformDesugared(TLB, TL);
5302
5303 QualType Result = SemaRef.Context.getAutoType(
5304 DK, Replacement, TL.getTypePtr()->getKeyword(),
5305 TL.getTypePtr()->getTypeConstraintConcept(),
5306 TL.getTypePtr()->getTypeConstraintArguments());
5307 auto NewTL = TLB.push<AutoTypeLoc>(Result);
5308 NewTL.copy(TL);
5309 return Result;
5310 }
5311
5312 QualType TransformDeducedTemplateSpecializationType(
5313 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5314 if (!UseTypeSugar)
5315 return TransformDesugared(TLB, TL);
5316
5318 DK, Replacement, TL.getTypePtr()->getKeyword(),
5319 TL.getTypePtr()->getTemplateName());
5320 auto NewTL = TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5321 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
5322 NewTL.setNameLoc(TL.getNameLoc());
5323 NewTL.setQualifierLoc(TL.getQualifierLoc());
5324 return Result;
5325 }
5326
5327 QualType TransformAtomicType(TypeLocBuilder &TLB, AtomicTypeLoc TL) {
5328 // When building the function parameter for placeholder type deduction
5329 // (Replacement is the invented template parameter), dig through _Atomic
5330 // around an auto placeholder so deduction matches the non-atomic
5331 // argument. The _Atomic wrapper is re-applied by the final substitution
5332 // pass, which uses a concrete Replacement and falls through to the
5333 // default transform.
5334 //
5335 // This handles only the simple case where _Atomic wraps auto directly
5336 // (e.g. _Atomic(auto)), which is what the C standard currently permits.
5337 // If more complex forms such as _Atomic(auto*) are ever allowed, the
5338 // correct fix would be to treat _Atomic as a qualifier inside
5339 // DeduceTemplateArgumentsByTypeMatch instead.
5340 if (isa_and_nonnull<TemplateTypeParmType>(Replacement) &&
5342 return getDerived().TransformType(TLB, TL.getValueLoc());
5343 return inherited::TransformAtomicType(TLB, TL);
5344 }
5345
5346 ExprResult TransformLambdaExpr(LambdaExpr *E) {
5347 // Lambdas never need to be transformed.
5348 return E;
5349 }
5350 bool TransformExceptionSpec(SourceLocation Loc,
5351 FunctionProtoType::ExceptionSpecInfo &ESI,
5352 SmallVectorImpl<QualType> &Exceptions,
5353 bool &Changed) {
5354 if (ESI.Type == EST_Uninstantiated) {
5355 ESI.instantiate();
5356 Changed = true;
5357 }
5358 return inherited::TransformExceptionSpec(Loc, ESI, Exceptions, Changed);
5359 }
5360
5361 QualType Apply(TypeLoc TL) {
5362 // Create some scratch storage for the transformed type locations.
5363 // FIXME: We're just going to throw this information away. Don't build it.
5364 TypeLocBuilder TLB;
5365 TLB.reserve(TL.getFullDataSize());
5366 return TransformType(TLB, TL);
5367 }
5368 };
5369
5370} // namespace
5371
5372static bool CheckDeducedPlaceholderConstraints(Sema &S, const AutoType &Type,
5374 QualType Deduced) {
5375 ConstraintSatisfaction Satisfaction;
5377 cast<ConceptDecl>(Type.getTypeConstraintConcept().getAsTemplateDecl());
5378 TemplateArgumentListInfo TemplateArgs(TypeLoc.getLAngleLoc(),
5379 TypeLoc.getRAngleLoc());
5380 TemplateArgs.addArgument(
5383 Deduced, TypeLoc.getNameLoc())));
5384 for (unsigned I = 0, C = TypeLoc.getNumArgs(); I != C; ++I)
5385 TemplateArgs.addArgument(TypeLoc.getArgLoc(I));
5386
5388 if (S.CheckTemplateArgumentList(Concept, TypeLoc.getNameLoc(), TemplateArgs,
5389 /*DefaultArgs=*/{},
5390 /*PartialTemplateArgs=*/false, CTAI))
5391 return true;
5393 /*Final=*/true);
5395 Concept, AssociatedConstraint(Concept->getConstraintExpr()), MLTAL,
5396 TypeLoc.getLocalSourceRange(), Satisfaction))
5397 return true;
5398 if (!Satisfaction.IsSatisfied) {
5399 std::string Buf;
5400 llvm::raw_string_ostream OS(Buf);
5401 OS << "'" << Concept->getName();
5402 if (TypeLoc.hasExplicitTemplateArgs()) {
5403 printTemplateArgumentList(OS, Type.getTypeConstraintArguments(),
5405 Type.getTypeConstraintConcept()
5406 .getAsTemplateDecl()
5407 ->getTemplateParameters());
5408 }
5409 OS << "'";
5410 S.Diag(TypeLoc.getConceptNameLoc(),
5411 diag::err_placeholder_constraints_not_satisfied)
5412 << Deduced << Buf << TypeLoc.getLocalSourceRange();
5413 S.DiagnoseUnsatisfiedConstraint(Satisfaction);
5414 return true;
5415 }
5416 return false;
5417}
5418
5421 TemplateDeductionInfo &Info, bool DependentDeduction,
5422 bool IgnoreConstraints,
5423 TemplateSpecCandidateSet *FailedTSC) {
5424 assert(DependentDeduction || Info.getDeducedDepth() == 0);
5425 if (Init->containsErrors())
5427
5428 const AutoType *AT = Type.getType()->getContainedAutoType();
5429 assert(AT);
5430
5431 if (Init->getType()->isNonOverloadPlaceholderType() || AT->isDecltypeAuto()) {
5432 ExprResult NonPlaceholder = CheckPlaceholderExpr(Init);
5433 if (NonPlaceholder.isInvalid())
5435 Init = NonPlaceholder.get();
5436 }
5437
5438 DependentAuto DependentResult = {
5439 /*.IsPack = */ (bool)Type.getAs<PackExpansionTypeLoc>()};
5440
5441 if (!DependentDeduction &&
5442 (Type.getType()->isDependentType() || Init->isTypeDependent() ||
5443 Init->containsUnexpandedParameterPack())) {
5444 Result = SubstituteDeducedTypeTransform(*this, DependentResult).Apply(Type);
5445 assert(!Result.isNull() && "substituting DependentTy can't fail");
5447 }
5448
5449 auto *InitList = dyn_cast<InitListExpr>(Init);
5450 bool IsArrayType = Type.getType()->isArrayType();
5451 if (!getLangOpts().CPlusPlus && (InitList || IsArrayType)) {
5452 Diag(Init->getBeginLoc(), diag::err_auto_init_list_from_c)
5453 << (int)AT->getKeyword() << IsArrayType;
5455 }
5456
5457 // Emit a warning if 'auto*' is used in pedantic and in C23 mode.
5458 if (getLangOpts().C23 && Type.getType()->isPointerType()) {
5459 Diag(Type.getBeginLoc(), diag::ext_c23_auto_non_plain_identifier);
5460 }
5461
5462 // Deduce type of TemplParam in Func(Init)
5464 Deduced.resize(1);
5465
5466 SmallVector<OriginalCallArg, 4> OriginalCallArgs;
5467
5468 QualType DeducedType;
5469 // If this is a 'decltype(auto)' specifier, do the decltype dance.
5470 if (AT->isDecltypeAuto()) {
5471 if (InitList) {
5472 Diag(Init->getBeginLoc(), diag::err_decltype_auto_initializer_list);
5474 }
5475
5476 DeducedType = getDecltypeForExpr(Init);
5477 assert(!DeducedType.isNull());
5478 } else {
5479 LocalInstantiationScope InstScope(*this);
5480
5481 // Build template<class TemplParam> void Func(FuncParam);
5482 SourceLocation Loc = Init->getExprLoc();
5484 Context, nullptr, SourceLocation(), Loc, Info.getDeducedDepth(), 0,
5485 nullptr, false, false, false);
5486 QualType TemplArg = QualType(TemplParam->getTypeForDecl(), 0);
5487 NamedDecl *TemplParamPtr = TemplParam;
5489 Context, Loc, Loc, TemplParamPtr, Loc, nullptr);
5490
5491 if (InitList) {
5492 // Notionally, we substitute std::initializer_list<T> for 'auto' and
5493 // deduce against that. Such deduction only succeeds if removing
5494 // cv-qualifiers and references results in std::initializer_list<T>.
5495 if (!Type.getType().getNonReferenceType()->getAs<AutoType>())
5497
5498 SourceRange DeducedFromInitRange;
5499 for (Expr *Init : InitList->inits()) {
5500 // Resolving a core issue: a braced-init-list containing any designators
5501 // is a non-deduced context.
5505 *this, TemplateParamsSt.get(), 0, TemplArg, Init->getType(),
5506 Init->Classify(getASTContext()), Init, Info, Deduced,
5507 OriginalCallArgs,
5508 /*Decomposed=*/true,
5509 /*ArgIdx=*/0, /*TDF=*/0);
5512 Diag(Info.getLocation(), diag::err_auto_inconsistent_deduction)
5513 << Info.FirstArg << Info.SecondArg << DeducedFromInitRange
5514 << Init->getSourceRange();
5516 }
5517 return TDK;
5518 }
5519
5520 if (DeducedFromInitRange.isInvalid() &&
5521 Deduced[0].getKind() != TemplateArgument::Null)
5522 DeducedFromInitRange = Init->getSourceRange();
5523 }
5524 } else {
5525 if (!getLangOpts().CPlusPlus && Init->refersToBitField() &&
5526 AT->getKeyword() == AutoTypeKeyword::GNUAutoType) {
5527 Diag(Loc, diag::err_auto_bitfield);
5529 }
5530 QualType FuncParam =
5531 SubstituteDeducedTypeTransform(*this, TemplArg).Apply(Type);
5532 assert(!FuncParam.isNull() &&
5533 "substituting template parameter for 'auto' failed");
5535 *this, TemplateParamsSt.get(), 0, FuncParam, Init->getType(),
5536 Init->Classify(getASTContext()), Init, Info, Deduced,
5537 OriginalCallArgs,
5538 /*Decomposed=*/false, /*ArgIdx=*/0, /*TDF=*/0, FailedTSC);
5540 return TDK;
5541 }
5542
5543 // Could be null if somehow 'auto' appears in a non-deduced context.
5546 DeducedType = Deduced[0].getAsType();
5547
5548 if (InitList) {
5549 DeducedType = BuildStdInitializerList(DeducedType, Loc);
5550 if (DeducedType.isNull())
5552 }
5553 }
5554
5555 if (!Result.isNull()) {
5556 if (!Context.hasSameType(DeducedType, Result)) {
5557 Info.FirstArg = Result;
5558 Info.SecondArg = DeducedType;
5560 }
5561 DeducedType = Context.getCommonSugaredType(Result, DeducedType);
5562 }
5563
5564 if (AT->isConstrained() && !IgnoreConstraints &&
5566 *this, *AT, Type.getContainedAutoTypeLoc(), DeducedType))
5568
5569 Result = SubstituteDeducedTypeTransform(*this, DeducedType).Apply(Type);
5570 if (Result.isNull())
5572
5573 // Check that the deduced argument type is compatible with the original
5574 // argument type per C++ [temp.deduct.call]p4.
5575 QualType DeducedA = InitList ? Deduced[0].getAsType() : Result;
5576 for (const OriginalCallArg &OriginalArg : OriginalCallArgs) {
5577 assert((bool)InitList == OriginalArg.DecomposedParam &&
5578 "decomposed non-init-list in auto deduction?");
5579 if (auto TDK =
5580 CheckOriginalCallArgDeduction(*this, Info, OriginalArg, DeducedA);
5582 Result = QualType();
5583 return TDK;
5584 }
5585 }
5586
5588}
5589
5591 QualType TypeToReplaceAuto) {
5592 assert(TypeToReplaceAuto != Context.DependentTy);
5593 return SubstituteDeducedTypeTransform(*this, TypeToReplaceAuto)
5594 .TransformType(TypeWithAuto);
5595}
5596
5598 QualType TypeToReplaceAuto) {
5599 assert(TypeToReplaceAuto != Context.DependentTy);
5600 return SubstituteDeducedTypeTransform(*this, TypeToReplaceAuto)
5601 .TransformType(TypeWithAuto);
5602}
5603
5605 return SubstituteDeducedTypeTransform(
5606 *this,
5607 DependentAuto{/*IsPack=*/isa<PackExpansionType>(TypeWithAuto)})
5608 .TransformType(TypeWithAuto);
5609}
5610
5613 return SubstituteDeducedTypeTransform(
5614 *this, DependentAuto{/*IsPack=*/isa<PackExpansionType>(
5615 TypeWithAuto->getType())})
5616 .TransformType(TypeWithAuto);
5617}
5618
5620 QualType TypeToReplaceAuto) {
5621 return SubstituteDeducedTypeTransform(*this, TypeToReplaceAuto,
5622 /*UseTypeSugar*/ false)
5623 .TransformType(TypeWithAuto);
5624}
5625
5627 QualType TypeToReplaceAuto) {
5628 return SubstituteDeducedTypeTransform(*this, TypeToReplaceAuto,
5629 /*UseTypeSugar*/ false)
5630 .TransformType(TypeWithAuto);
5631}
5632
5634 const Expr *Init) {
5636 Diag(VDecl->getLocation(),
5637 VDecl->isInitCapture()
5638 ? diag::err_init_capture_deduction_failure_from_init_list
5639 : diag::err_auto_var_deduction_failure_from_init_list)
5640 << VDecl->getDeclName() << VDecl->getType() << Init->getSourceRange();
5641 else
5642 Diag(VDecl->getLocation(),
5643 VDecl->isInitCapture() ? diag::err_init_capture_deduction_failure
5644 : diag::err_auto_var_deduction_failure)
5645 << VDecl->getDeclName() << VDecl->getType() << Init->getType()
5646 << Init->getSourceRange();
5647}
5648
5650 bool Diagnose) {
5651 assert(FD->getReturnType()->isUndeducedType());
5652
5653 // For a lambda's conversion operator, deduce any 'auto' or 'decltype(auto)'
5654 // within the return type from the call operator's type.
5656 CXXRecordDecl *Lambda = cast<CXXMethodDecl>(FD)->getParent();
5657 FunctionDecl *CallOp = Lambda->getLambdaCallOperator();
5658
5659 // For a generic lambda, instantiate the call operator if needed.
5660 if (auto *Args = FD->getTemplateSpecializationArgs()) {
5662 CallOp->getDescribedFunctionTemplate(), Args, Loc);
5663 if (!CallOp || CallOp->isInvalidDecl())
5664 return true;
5665
5666 // We might need to deduce the return type by instantiating the definition
5667 // of the operator() function.
5668 if (CallOp->getReturnType()->isUndeducedType()) {
5670 InstantiateFunctionDefinition(Loc, CallOp);
5671 });
5672 }
5673 }
5674
5675 if (CallOp->isInvalidDecl())
5676 return true;
5677 assert(!CallOp->getReturnType()->isUndeducedType() &&
5678 "failed to deduce lambda return type");
5679
5680 // Build the new return type from scratch.
5681 CallingConv RetTyCC = FD->getReturnType()
5682 ->getPointeeType()
5683 ->castAs<FunctionType>()
5684 ->getCallConv();
5686 CallOp->getType()->castAs<FunctionProtoType>(), RetTyCC);
5687 if (FD->getReturnType()->getAs<PointerType>())
5688 RetType = Context.getPointerType(RetType);
5689 else {
5690 assert(FD->getReturnType()->getAs<BlockPointerType>());
5691 RetType = Context.getBlockPointerType(RetType);
5692 }
5693 Context.adjustDeducedFunctionResultType(FD, RetType);
5694 return false;
5695 }
5696
5700 });
5701 }
5702
5703 bool StillUndeduced = FD->getReturnType()->isUndeducedType();
5704 if (StillUndeduced && Diagnose && !FD->isInvalidDecl()) {
5705 Diag(Loc, diag::err_auto_fn_used_before_defined) << FD;
5706 Diag(FD->getLocation(), diag::note_callee_decl) << FD;
5707 }
5708
5709 return StillUndeduced;
5710}
5711
5713 SourceLocation Loc) {
5714 assert(FD->isImmediateEscalating());
5715
5717 CXXRecordDecl *Lambda = cast<CXXMethodDecl>(FD)->getParent();
5718 FunctionDecl *CallOp = Lambda->getLambdaCallOperator();
5719
5720 // For a generic lambda, instantiate the call operator if needed.
5721 if (auto *Args = FD->getTemplateSpecializationArgs()) {
5723 CallOp->getDescribedFunctionTemplate(), Args, Loc);
5724 if (!CallOp || CallOp->isInvalidDecl())
5725 return true;
5727 Loc, [&] { InstantiateFunctionDefinition(Loc, CallOp); });
5728 }
5729 return CallOp->isInvalidDecl();
5730 }
5731
5734 Loc, [&] { InstantiateFunctionDefinition(Loc, FD); });
5735 }
5736 return false;
5737}
5738
5740 const CXXMethodDecl *Method,
5741 QualType RawType,
5742 bool IsOtherRvr) {
5743 // C++20 [temp.func.order]p3.1, p3.2:
5744 // - The type X(M) is "rvalue reference to cv A" if the optional
5745 // ref-qualifier of M is && or if M has no ref-qualifier and the
5746 // positionally-corresponding parameter of the other transformed template
5747 // has rvalue reference type; if this determination depends recursively
5748 // upon whether X(M) is an rvalue reference type, it is not considered to
5749 // have rvalue reference type.
5750 //
5751 // - Otherwise, X(M) is "lvalue reference to cv A".
5752 assert(Method && !Method->isExplicitObjectMemberFunction() &&
5753 "expected a member function with no explicit object parameter");
5754
5755 RawType = Context.getQualifiedType(RawType, Method->getMethodQualifiers());
5756 if (Method->getRefQualifier() == RQ_RValue ||
5757 (IsOtherRvr && Method->getRefQualifier() == RQ_None))
5758 return Context.getRValueReferenceType(RawType);
5759 return Context.getLValueReferenceType(RawType);
5760}
5761
5764 QualType A, ArrayRef<TemplateArgument> DeducedArgs, bool CheckConsistency) {
5765 MultiLevelTemplateArgumentList MLTAL(FTD, DeducedArgs,
5766 /*Final=*/true);
5768 S,
5769 ArgIdx ? ::getPackIndexForParam(S, FTD, MLTAL, *ArgIdx) : std::nullopt);
5770 bool IsIncompleteSubstitution = false;
5771 // FIXME: A substitution can be incomplete on a non-structural part of the
5772 // type. Use the canonical type for now, until the TemplateInstantiator can
5773 // deal with that.
5774
5775 // Workaround: Implicit deduction guides use InjectedClassNameTypes, whereas
5776 // the explicit guides don't. The substitution doesn't transform these types,
5777 // so let it transform their specializations instead.
5778 bool IsDeductionGuide = isa<CXXDeductionGuideDecl>(FTD->getTemplatedDecl());
5779 if (IsDeductionGuide) {
5780 if (auto *Injected = P->getAsCanonical<InjectedClassNameType>())
5781 P = Injected->getDecl()->getCanonicalTemplateSpecializationType(
5782 S.Context);
5783 }
5784 QualType InstP = S.SubstType(P.getCanonicalType(), MLTAL, FTD->getLocation(),
5785 FTD->getDeclName(), &IsIncompleteSubstitution);
5786 if (InstP.isNull() && !IsIncompleteSubstitution)
5788 if (!CheckConsistency)
5790 if (IsIncompleteSubstitution)
5792
5793 // [temp.deduct.call]/4 - Check we produced a consistent deduction.
5794 // This handles just the cases that can appear when partial ordering.
5795 if (auto *PA = dyn_cast<PackExpansionType>(A);
5796 PA && !isa<PackExpansionType>(InstP))
5797 A = PA->getPattern();
5800 if (IsDeductionGuide) {
5801 if (auto *Injected = T1->getAsCanonical<InjectedClassNameType>())
5802 T1 = Injected->getDecl()->getCanonicalTemplateSpecializationType(
5803 S.Context);
5804 if (auto *Injected = T2->getAsCanonical<InjectedClassNameType>())
5805 T2 = Injected->getDecl()->getCanonicalTemplateSpecializationType(
5806 S.Context);
5807 }
5808 if (!S.Context.hasSameType(T1, T2))
5811}
5812
5813template <class T>
5815 Sema &S, FunctionTemplateDecl *FTD,
5818 Sema::ContextRAII SavedContext(S, getAsDeclContextOrEnclosing(FTD));
5819
5820 // C++26 [temp.deduct.type]p2:
5821 // [...] or if any template argument remains neither deduced nor
5822 // explicitly specified, template argument deduction fails.
5823 bool IsIncomplete = false;
5824 Sema::CheckTemplateArgumentInfo CTAI(/*PartialOrdering=*/true);
5826 S, FTD, FTD->getTemplateParameters(), /*IsDeduced=*/true, Deduced,
5827 Info, CTAI,
5828 /*CurrentInstantiationScope=*/nullptr,
5829 /*NumAlreadyConverted=*/0, &IsIncomplete);
5831 return Result;
5832
5833 // Form the template argument list from the deduced template arguments.
5834 TemplateArgumentList *SugaredDeducedArgumentList =
5836 TemplateArgumentList *CanonicalDeducedArgumentList =
5838
5839 Info.reset(SugaredDeducedArgumentList, CanonicalDeducedArgumentList);
5840
5841 // Substitute the deduced template arguments into the argument
5842 // and verify that the instantiated argument is both valid
5843 // and equivalent to the parameter.
5844 LocalInstantiationScope InstScope(S);
5845 return CheckDeductionConsistency(S, FTD, CTAI.SugaredConverted);
5846}
5847
5848/// Determine whether the function template \p FT1 is at least as
5849/// specialized as \p FT2.
5853 ArrayRef<QualType> Args1, ArrayRef<QualType> Args2, bool Args1Offset) {
5854 FunctionDecl *FD1 = FT1->getTemplatedDecl();
5855 FunctionDecl *FD2 = FT2->getTemplatedDecl();
5856 const FunctionProtoType *Proto1 = FD1->getType()->getAs<FunctionProtoType>();
5857 const FunctionProtoType *Proto2 = FD2->getType()->getAs<FunctionProtoType>();
5858 assert(Proto1 && Proto2 && "Function templates must have prototypes");
5859
5860 // C++26 [temp.deduct.partial]p3:
5861 // The types used to determine the ordering depend on the context in which
5862 // the partial ordering is done:
5863 // - In the context of a function call, the types used are those function
5864 // parameter types for which the function call has arguments.
5865 // - In the context of a call to a conversion operator, the return types
5866 // of the conversion function templates are used.
5867 // - In other contexts (14.6.6.2) the function template's function type
5868 // is used.
5869
5870 if (TPOC == TPOC_Other) {
5871 // We wouldn't be partial ordering these candidates if these didn't match.
5872 assert(Proto1->getMethodQuals() == Proto2->getMethodQuals() &&
5873 Proto1->getRefQualifier() == Proto2->getRefQualifier() &&
5874 Proto1->isVariadic() == Proto2->isVariadic() &&
5875 "shouldn't partial order functions with different qualifiers in a "
5876 "context where the function type is used");
5877
5878 assert(Args1.empty() && Args2.empty() &&
5879 "Only call context should have arguments");
5880 Args1 = Proto1->getParamTypes();
5881 Args2 = Proto2->getParamTypes();
5882 }
5883
5884 TemplateParameterList *TemplateParams = FT2->getTemplateParameters();
5886 TemplateDeductionInfo Info(Loc);
5887
5888 bool HasDeducedAnyParamFromReturnType = false;
5889 if (TPOC != TPOC_Call) {
5891 S, TemplateParams, Proto2->getReturnType(), Proto1->getReturnType(),
5893 /*DeducedFromArrayBound=*/false,
5894 &HasDeducedAnyParamFromReturnType) !=
5896 return false;
5897 }
5898
5899 llvm::SmallBitVector HasDeducedParam;
5900 if (TPOC != TPOC_Conversion) {
5901 HasDeducedParam.resize(Args2.size());
5902 if (DeduceTemplateArguments(S, TemplateParams, Args2, Args1, Info, Deduced,
5904 /*HasDeducedAnyParam=*/nullptr,
5905 &HasDeducedParam) !=
5907 return false;
5908 }
5909
5910 SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());
5913 Sema::SFINAETrap Trap(S, Info);
5915 S, Info.getLocation(), FT2, DeducedArgs,
5917 if (Inst.isInvalid())
5918 return false;
5919
5920 bool AtLeastAsSpecialized;
5922 AtLeastAsSpecialized =
5923 ::FinishTemplateArgumentDeduction(
5924 S, FT2, Deduced, Info,
5925 [&](Sema &S, FunctionTemplateDecl *FTD,
5926 ArrayRef<TemplateArgument> DeducedArgs) {
5927 // As a provisional fix for a core issue that does not
5928 // exist yet, which may be related to CWG2160, only check the
5929 // consistency of parameters and return types which participated
5930 // in deduction. We will still try to substitute them though.
5931 if (TPOC != TPOC_Call) {
5932 if (auto TDR = ::CheckDeductionConsistency(
5933 S, FTD, /*ArgIdx=*/std::nullopt,
5934 Proto2->getReturnType(), Proto1->getReturnType(),
5935 DeducedArgs,
5936 /*CheckConsistency=*/HasDeducedAnyParamFromReturnType);
5937 TDR != TemplateDeductionResult::Success)
5938 return TDR;
5939 }
5940
5941 if (TPOC == TPOC_Conversion)
5942 return TemplateDeductionResult::Success;
5943
5944 return ::DeduceForEachType(
5945 S, TemplateParams, Args2, Args1, Info, Deduced,
5946 PartialOrderingKind::Call, /*FinishingDeduction=*/true,
5947 [&](Sema &S, TemplateParameterList *, int ParamIdx,
5948 UnsignedOrNone ArgIdx, QualType P, QualType A,
5949 TemplateDeductionInfo &Info,
5950 SmallVectorImpl<DeducedTemplateArgument> &Deduced,
5951 PartialOrderingKind) {
5952 if (ArgIdx && *ArgIdx >= static_cast<unsigned>(Args1Offset))
5953 ArgIdx = *ArgIdx - Args1Offset;
5954 else
5955 ArgIdx = std::nullopt;
5956 return ::CheckDeductionConsistency(
5957 S, FTD, ArgIdx, P, A, DeducedArgs,
5958 /*CheckConsistency=*/HasDeducedParam[ParamIdx]);
5959 });
5961 });
5962 if (!AtLeastAsSpecialized || Trap.hasErrorOccurred())
5963 return false;
5964
5965 // C++0x [temp.deduct.partial]p11:
5966 // In most cases, all template parameters must have values in order for
5967 // deduction to succeed, but for partial ordering purposes a template
5968 // parameter may remain without a value provided it is not used in the
5969 // types being used for partial ordering. [ Note: a template parameter used
5970 // in a non-deduced context is considered used. -end note]
5971 unsigned ArgIdx = 0, NumArgs = Deduced.size();
5972 for (; ArgIdx != NumArgs; ++ArgIdx)
5973 if (Deduced[ArgIdx].isNull())
5974 break;
5975
5976 if (ArgIdx == NumArgs) {
5977 // All template arguments were deduced. FT1 is at least as specialized
5978 // as FT2.
5979 return true;
5980 }
5981
5982 // Figure out which template parameters were used.
5983 llvm::SmallBitVector UsedParameters(TemplateParams->size());
5984 switch (TPOC) {
5985 case TPOC_Call:
5986 for (unsigned I = 0, N = Args2.size(); I != N; ++I)
5987 ::MarkUsedTemplateParameters(S.Context, Args2[I], /*OnlyDeduced=*/false,
5988 TemplateParams->getDepth(), UsedParameters);
5989 break;
5990
5991 case TPOC_Conversion:
5992 ::MarkUsedTemplateParameters(S.Context, Proto2->getReturnType(),
5993 /*OnlyDeduced=*/false,
5994 TemplateParams->getDepth(), UsedParameters);
5995 break;
5996
5997 case TPOC_Other:
5998 // We do not deduce template arguments from the exception specification
5999 // when determining the primary template of a function template
6000 // specialization or when taking the address of a function template.
6001 // Therefore, we do not mark template parameters in the exception
6002 // specification as used during partial ordering to prevent the following
6003 // from being ambiguous:
6004 //
6005 // template<typename T, typename U>
6006 // void f(U) noexcept(noexcept(T())); // #1
6007 //
6008 // template<typename T>
6009 // void f(T*) noexcept; // #2
6010 //
6011 // template<>
6012 // void f<int>(int*) noexcept; // explicit specialization of #2
6013 //
6014 // Although there is no corresponding wording in the standard, this seems
6015 // to be the intended behavior given the definition of
6016 // 'deduction substitution loci' in [temp.deduct].
6018 S.Context,
6019 S.Context.getFunctionTypeWithExceptionSpec(FD2->getType(), EST_None),
6020 /*OnlyDeduced=*/false, TemplateParams->getDepth(), UsedParameters);
6021 break;
6022 }
6023
6024 for (; ArgIdx != NumArgs; ++ArgIdx)
6025 // If this argument had no value deduced but was used in one of the types
6026 // used for partial ordering, then deduction fails.
6027 if (Deduced[ArgIdx].isNull() && UsedParameters[ArgIdx])
6028 return false;
6029
6030 return true;
6031}
6032
6034
6035// This a speculative fix for CWG1432 (Similar to the fix for CWG1395) that
6036// there is no wording or even resolution for this issue.
6039 const TemplateSpecializationType *TST1,
6040 const TemplateSpecializationType *TST2) {
6041 ArrayRef<TemplateArgument> As1 = TST1->template_arguments(),
6042 As2 = TST2->template_arguments();
6043 const TemplateArgument &TA1 = As1.back(), &TA2 = As2.back();
6044 // C++26 [temp.deduct.partial]p11:
6045 // If, after considering the above, function template F is at least as
6046 // specialized as function template G and vice-versa, and if G has a
6047 // trailing function parameter pack for which F does not have a
6048 // corresponding parameter, and if F does not have a trailing function
6049 // parameter pack, then F is more specialized than G.
6050 bool IsPack1 = TA1.getKind() == TemplateArgument::Pack;
6051 bool IsPack2 = TA2.getKind() == TemplateArgument::Pack;
6052 if (IsPack1 != IsPack2)
6055 if (!IsPack1 || As1.size() != As2.size())
6057
6058 unsigned PackSize1 = TA1.pack_size(), PackSize2 = TA2.pack_size();
6059 bool IsPackExpansion1 =
6060 PackSize1 && TA1.pack_elements().back().isPackExpansion();
6061 bool IsPackExpansion2 =
6062 PackSize2 && TA2.pack_elements().back().isPackExpansion();
6063 if (PackSize1 == PackSize2 && IsPackExpansion1 == IsPackExpansion2)
6065 if (PackSize1 > PackSize2 && IsPackExpansion1)
6067 if (PackSize1 < PackSize2 && IsPackExpansion2)
6070}
6071
6074 TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1,
6075 QualType RawObj1Ty, QualType RawObj2Ty, bool Reversed,
6076 bool PartialOverloading) {
6079 const FunctionDecl *FD1 = FT1->getTemplatedDecl();
6080 const FunctionDecl *FD2 = FT2->getTemplatedDecl();
6081 bool ShouldConvert1 = false;
6082 bool ShouldConvert2 = false;
6083 bool Args1Offset = false;
6084 bool Args2Offset = false;
6085 QualType Obj1Ty;
6086 QualType Obj2Ty;
6087 if (TPOC == TPOC_Call) {
6088 const FunctionProtoType *Proto1 =
6089 FD1->getType()->castAs<FunctionProtoType>();
6090 const FunctionProtoType *Proto2 =
6091 FD2->getType()->castAs<FunctionProtoType>();
6092
6093 // - In the context of a function call, the function parameter types are
6094 // used.
6095 const CXXMethodDecl *Method1 = dyn_cast<CXXMethodDecl>(FD1);
6096 const CXXMethodDecl *Method2 = dyn_cast<CXXMethodDecl>(FD2);
6097 // C++20 [temp.func.order]p3
6098 // [...] Each function template M that is a member function is
6099 // considered to have a new first parameter of type
6100 // X(M), described below, inserted in its function parameter list.
6101 //
6102 // Note that we interpret "that is a member function" as
6103 // "that is a member function with no expicit object argument".
6104 // Otherwise the ordering rules for methods with expicit objet arguments
6105 // against anything else make no sense.
6106
6107 bool NonStaticMethod1 = Method1 && !Method1->isStatic(),
6108 NonStaticMethod2 = Method2 && !Method2->isStatic();
6109
6110 auto Params1Begin = Proto1->param_type_begin(),
6111 Params2Begin = Proto2->param_type_begin();
6112
6113 size_t NumComparedArguments = NumCallArguments1;
6114
6115 if (auto OO = FD1->getOverloadedOperator();
6116 (NonStaticMethod1 && NonStaticMethod2) ||
6117 (OO != OO_None && OO != OO_Call && OO != OO_Subscript)) {
6118 ShouldConvert1 =
6119 NonStaticMethod1 && !Method1->hasCXXExplicitFunctionObjectParameter();
6120 ShouldConvert2 =
6121 NonStaticMethod2 && !Method2->hasCXXExplicitFunctionObjectParameter();
6122 NumComparedArguments += 1;
6123
6124 if (ShouldConvert1) {
6125 bool IsRValRef2 =
6126 ShouldConvert2
6127 ? Method2->getRefQualifier() == RQ_RValue
6128 : Proto2->param_type_begin()[0]->isRValueReferenceType();
6129 // Compare 'this' from Method1 against first parameter from Method2.
6130 Obj1Ty = GetImplicitObjectParameterType(this->Context, Method1,
6131 RawObj1Ty, IsRValRef2);
6132 Args1.push_back(Obj1Ty);
6133 Args1Offset = true;
6134 }
6135 if (ShouldConvert2) {
6136 bool IsRValRef1 =
6137 ShouldConvert1
6138 ? Method1->getRefQualifier() == RQ_RValue
6139 : Proto1->param_type_begin()[0]->isRValueReferenceType();
6140 // Compare 'this' from Method2 against first parameter from Method1.
6141 Obj2Ty = GetImplicitObjectParameterType(this->Context, Method2,
6142 RawObj2Ty, IsRValRef1);
6143 Args2.push_back(Obj2Ty);
6144 Args2Offset = true;
6145 }
6146 } else {
6147 if (NonStaticMethod1 && Method1->hasCXXExplicitFunctionObjectParameter())
6148 Params1Begin += 1;
6149 if (NonStaticMethod2 && Method2->hasCXXExplicitFunctionObjectParameter())
6150 Params2Begin += 1;
6151 }
6152 Args1.insert(Args1.end(), Params1Begin, Proto1->param_type_end());
6153 Args2.insert(Args2.end(), Params2Begin, Proto2->param_type_end());
6154
6155 // C++ [temp.func.order]p5:
6156 // The presence of unused ellipsis and default arguments has no effect on
6157 // the partial ordering of function templates.
6158 Args1.resize(std::min(Args1.size(), NumComparedArguments));
6159 Args2.resize(std::min(Args2.size(), NumComparedArguments));
6160
6161 if (Reversed)
6162 std::reverse(Args2.begin(), Args2.end());
6163 } else {
6164 assert(!Reversed && "Only call context could have reversed arguments");
6165 }
6166 bool Better1 = isAtLeastAsSpecializedAs(*this, Loc, FT1, FT2, TPOC, Args1,
6167 Args2, Args2Offset);
6168 bool Better2 = isAtLeastAsSpecializedAs(*this, Loc, FT2, FT1, TPOC, Args2,
6169 Args1, Args1Offset);
6170 // C++ [temp.deduct.partial]p10:
6171 // F is more specialized than G if F is at least as specialized as G and G
6172 // is not at least as specialized as F.
6173 if (Better1 != Better2) // We have a clear winner
6174 return Better1 ? FT1 : FT2;
6175
6176 if (!Better1 && !Better2) // Neither is better than the other
6177 return nullptr;
6178
6179 // C++ [temp.deduct.partial]p11:
6180 // ... and if G has a trailing function parameter pack for which F does not
6181 // have a corresponding parameter, and if F does not have a trailing
6182 // function parameter pack, then F is more specialized than G.
6183
6184 SmallVector<QualType> Param1;
6185 Param1.reserve(FD1->param_size() + ShouldConvert1);
6186 if (ShouldConvert1)
6187 Param1.push_back(Obj1Ty);
6188 for (const auto &P : FD1->parameters())
6189 Param1.push_back(P->getType());
6190
6191 SmallVector<QualType> Param2;
6192 Param2.reserve(FD2->param_size() + ShouldConvert2);
6193 if (ShouldConvert2)
6194 Param2.push_back(Obj2Ty);
6195 for (const auto &P : FD2->parameters())
6196 Param2.push_back(P->getType());
6197
6198 unsigned NumParams1 = Param1.size();
6199 unsigned NumParams2 = Param2.size();
6200
6201 bool Variadic1 =
6202 FD1->param_size() && FD1->parameters().back()->isParameterPack();
6203 bool Variadic2 =
6204 FD2->param_size() && FD2->parameters().back()->isParameterPack();
6205 if (Variadic1 != Variadic2) {
6206 if (Variadic1 && NumParams1 > NumParams2)
6207 return FT2;
6208 if (Variadic2 && NumParams2 > NumParams1)
6209 return FT1;
6210 }
6211
6212 // Skip this tie breaker if we are performing overload resolution with partial
6213 // arguments, as this breaks some assumptions about how closely related the
6214 // candidates are.
6215 for (int i = 0, e = std::min(NumParams1, NumParams2);
6216 !PartialOverloading && i < e; ++i) {
6217 QualType T1 = Param1[i].getCanonicalType();
6218 QualType T2 = Param2[i].getCanonicalType();
6219 auto *TST1 = dyn_cast<TemplateSpecializationType>(T1);
6220 auto *TST2 = dyn_cast<TemplateSpecializationType>(T2);
6221 if (!TST1 || !TST2)
6222 continue;
6223 switch (getMoreSpecializedTrailingPackTieBreaker(TST1, TST2)) {
6225 return FT1;
6227 return FT2;
6229 continue;
6230 }
6231 llvm_unreachable(
6232 "unknown MoreSpecializedTrailingPackTieBreakerResult value");
6233 }
6234
6235 if (!Context.getLangOpts().CPlusPlus20)
6236 return nullptr;
6237
6238 // Match GCC on not implementing [temp.func.order]p6.2.1.
6239
6240 // C++20 [temp.func.order]p6:
6241 // If deduction against the other template succeeds for both transformed
6242 // templates, constraints can be considered as follows:
6243
6244 // C++20 [temp.func.order]p6.1:
6245 // If their template-parameter-lists (possibly including template-parameters
6246 // invented for an abbreviated function template ([dcl.fct])) or function
6247 // parameter lists differ in length, neither template is more specialized
6248 // than the other.
6251 if (TPL1->size() != TPL2->size() || NumParams1 != NumParams2)
6252 return nullptr;
6253
6254 // C++20 [temp.func.order]p6.2.2:
6255 // Otherwise, if the corresponding template-parameters of the
6256 // template-parameter-lists are not equivalent ([temp.over.link]) or if the
6257 // function parameters that positionally correspond between the two
6258 // templates are not of the same type, neither template is more specialized
6259 // than the other.
6260 if (!TemplateParameterListsAreEqual(TPL1, TPL2, false,
6262 return nullptr;
6263
6264 // [dcl.fct]p5:
6265 // Any top-level cv-qualifiers modifying a parameter type are deleted when
6266 // forming the function type.
6267 for (unsigned i = 0; i < NumParams1; ++i)
6268 if (!Context.hasSameUnqualifiedType(Param1[i], Param2[i]))
6269 return nullptr;
6270
6271 // C++20 [temp.func.order]p6.3:
6272 // Otherwise, if the context in which the partial ordering is done is
6273 // that of a call to a conversion function and the return types of the
6274 // templates are not the same, then neither template is more specialized
6275 // than the other.
6276 if (TPOC == TPOC_Conversion &&
6277 !Context.hasSameType(FD1->getReturnType(), FD2->getReturnType()))
6278 return nullptr;
6279
6281 FT1->getAssociatedConstraints(AC1);
6282 FT2->getAssociatedConstraints(AC2);
6283 bool AtLeastAsConstrained1, AtLeastAsConstrained2;
6284 if (IsAtLeastAsConstrained(FT1, AC1, FT2, AC2, AtLeastAsConstrained1))
6285 return nullptr;
6286 if (IsAtLeastAsConstrained(FT2, AC2, FT1, AC1, AtLeastAsConstrained2))
6287 return nullptr;
6288 if (AtLeastAsConstrained1 == AtLeastAsConstrained2)
6289 return nullptr;
6290 return AtLeastAsConstrained1 ? FT1 : FT2;
6291}
6292
6295 TemplateSpecCandidateSet &FailedCandidates,
6296 SourceLocation Loc, const PartialDiagnostic &NoneDiag,
6297 const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag,
6298 bool Complain, QualType TargetType) {
6299 if (SpecBegin == SpecEnd) {
6300 if (Complain) {
6301 Diag(Loc, NoneDiag);
6302 FailedCandidates.NoteCandidates(*this, Loc);
6303 }
6304 return SpecEnd;
6305 }
6306
6307 if (SpecBegin + 1 == SpecEnd)
6308 return SpecBegin;
6309
6310 // Find the function template that is better than all of the templates it
6311 // has been compared to.
6312 UnresolvedSetIterator Best = SpecBegin;
6313 FunctionTemplateDecl *BestTemplate
6314 = cast<FunctionDecl>(*Best)->getPrimaryTemplate();
6315 assert(BestTemplate && "Not a function template specialization?");
6316 for (UnresolvedSetIterator I = SpecBegin + 1; I != SpecEnd; ++I) {
6317 FunctionTemplateDecl *Challenger
6318 = cast<FunctionDecl>(*I)->getPrimaryTemplate();
6319 assert(Challenger && "Not a function template specialization?");
6320 if (declaresSameEntity(getMoreSpecializedTemplate(BestTemplate, Challenger,
6321 Loc, TPOC_Other, 0),
6322 Challenger)) {
6323 Best = I;
6324 BestTemplate = Challenger;
6325 }
6326 }
6327
6328 // Make sure that the "best" function template is more specialized than all
6329 // of the others.
6330 bool Ambiguous = false;
6331 for (UnresolvedSetIterator I = SpecBegin; I != SpecEnd; ++I) {
6332 FunctionTemplateDecl *Challenger
6333 = cast<FunctionDecl>(*I)->getPrimaryTemplate();
6334 if (I != Best &&
6335 !declaresSameEntity(getMoreSpecializedTemplate(BestTemplate, Challenger,
6336 Loc, TPOC_Other, 0),
6337 BestTemplate)) {
6338 Ambiguous = true;
6339 break;
6340 }
6341 }
6342
6343 if (!Ambiguous) {
6344 // We found an answer. Return it.
6345 return Best;
6346 }
6347
6348 // Diagnose the ambiguity.
6349 if (Complain) {
6350 Diag(Loc, AmbigDiag);
6351
6352 // FIXME: Can we order the candidates in some sane way?
6353 for (UnresolvedSetIterator I = SpecBegin; I != SpecEnd; ++I) {
6354 PartialDiagnostic PD = CandidateDiag;
6355 const auto *FD = cast<FunctionDecl>(*I);
6357 FD->getPrimaryTemplate()->getTemplateParameters(),
6358 *FD->getTemplateSpecializationArgs());
6359 if (!TargetType.isNull())
6360 HandleFunctionTypeMismatch(PD, FD->getType(), TargetType);
6361 Diag((*I)->getLocation(), PD);
6362 }
6363 }
6364
6365 return SpecEnd;
6366}
6367
6369 FunctionDecl *FD2) {
6370 assert(!FD1->getDescribedTemplate() && !FD2->getDescribedTemplate() &&
6371 "not for function templates");
6372 assert(!FD1->isFunctionTemplateSpecialization() ||
6374 assert(!FD2->isFunctionTemplateSpecialization() ||
6376
6377 FunctionDecl *F1 = FD1;
6378 if (FunctionDecl *P = FD1->getTemplateInstantiationPattern(false))
6379 F1 = P;
6380
6381 FunctionDecl *F2 = FD2;
6382 if (FunctionDecl *P = FD2->getTemplateInstantiationPattern(false))
6383 F2 = P;
6384
6386 F1->getAssociatedConstraints(AC1);
6387 F2->getAssociatedConstraints(AC2);
6388 bool AtLeastAsConstrained1, AtLeastAsConstrained2;
6389 if (IsAtLeastAsConstrained(F1, AC1, F2, AC2, AtLeastAsConstrained1))
6390 return nullptr;
6391 if (IsAtLeastAsConstrained(F2, AC2, F1, AC1, AtLeastAsConstrained2))
6392 return nullptr;
6393 if (AtLeastAsConstrained1 == AtLeastAsConstrained2)
6394 return nullptr;
6395 return AtLeastAsConstrained1 ? FD1 : FD2;
6396}
6397
6398/// Determine whether one template specialization, P1, is at least as
6399/// specialized than another, P2.
6400///
6401/// \tparam TemplateLikeDecl The kind of P2, which must be a
6402/// TemplateDecl or {Class,Var}TemplatePartialSpecializationDecl.
6403/// \param T1 The injected-class-name of P1 (faked for a variable template).
6404/// \param T2 The injected-class-name of P2 (faked for a variable template).
6405/// \param Template The primary template of P2, in case it is a partial
6406/// specialization, the same as P2 otherwise.
6407template <typename TemplateLikeDecl>
6409 TemplateLikeDecl *P2,
6411 TemplateDeductionInfo &Info) {
6412 // C++ [temp.class.order]p1:
6413 // For two class template partial specializations, the first is at least as
6414 // specialized as the second if, given the following rewrite to two
6415 // function templates, the first function template is at least as
6416 // specialized as the second according to the ordering rules for function
6417 // templates (14.6.6.2):
6418 // - the first function template has the same template parameters as the
6419 // first partial specialization and has a single function parameter
6420 // whose type is a class template specialization with the template
6421 // arguments of the first partial specialization, and
6422 // - the second function template has the same template parameters as the
6423 // second partial specialization and has a single function parameter
6424 // whose type is a class template specialization with the template
6425 // arguments of the second partial specialization.
6426 //
6427 // Rather than synthesize function templates, we merely perform the
6428 // equivalent partial ordering by performing deduction directly on
6429 // the template arguments of the class template partial
6430 // specializations. This computation is slightly simpler than the
6431 // general problem of function template partial ordering, because
6432 // class template partial specializations are more constrained. We
6433 // know that every template parameter is deducible from the class
6434 // template partial specialization's template arguments, for
6435 // example.
6437
6438 // Determine whether P1 is at least as specialized as P2.
6439 Deduced.resize(P2->getTemplateParameters()->size());
6441 S, P2->getTemplateParameters(), T2, T1, Info, Deduced, TDF_None,
6442 PartialOrderingKind::Call, /*DeducedFromArrayBound=*/false,
6443 /*HasDeducedAnyParam=*/nullptr) != TemplateDeductionResult::Success)
6444 return false;
6445
6446 SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());
6449 Sema::SFINAETrap Trap(S, Info);
6450 Sema::InstantiatingTemplate Inst(S, Info.getLocation(), P2, DeducedArgs);
6451 if (Inst.isInvalid())
6452 return false;
6453
6455 Ps = cast<TemplateSpecializationType>(T2)->template_arguments(),
6456 As = cast<TemplateSpecializationType>(T1)->template_arguments();
6457
6460 Result = ::FinishTemplateArgumentDeduction(
6461 S, P2, P2->getTemplateParameters(), Template,
6462 /*IsPartialOrdering=*/true, Ps, As, Deduced, Info,
6463 /*CopyDeducedArgs=*/false);
6464 });
6466}
6467
6468namespace {
6469// A dummy class to return nullptr instead of P2 when performing "more
6470// specialized than primary" check.
6471struct GetP2 {
6472 template <typename T1, typename T2,
6473 std::enable_if_t<std::is_same_v<T1, T2>, bool> = true>
6474 T2 *operator()(T1 *, T2 *P2) {
6475 return P2;
6476 }
6477 template <typename T1, typename T2,
6478 std::enable_if_t<!std::is_same_v<T1, T2>, bool> = true>
6479 T1 *operator()(T1 *, T2 *) {
6480 return nullptr;
6481 }
6482};
6483
6484// The assumption is that two template argument lists have the same size.
6485struct TemplateArgumentListAreEqual {
6486 ASTContext &Ctx;
6487 TemplateArgumentListAreEqual(ASTContext &Ctx) : Ctx(Ctx) {}
6488
6489 template <typename T1, typename T2,
6490 std::enable_if_t<std::is_same_v<T1, T2>, bool> = true>
6491 bool operator()(T1 *PS1, T2 *PS2) {
6492 ArrayRef<TemplateArgument> Args1 = PS1->getTemplateArgs().asArray(),
6493 Args2 = PS2->getTemplateArgs().asArray();
6494
6495 for (unsigned I = 0, E = Args1.size(); I < E; ++I) {
6496 // We use profile, instead of structural comparison of the arguments,
6497 // because canonicalization can't do the right thing for dependent
6498 // expressions.
6499 llvm::FoldingSetNodeID IDA, IDB;
6500 Args1[I].Profile(IDA, Ctx);
6501 Args2[I].Profile(IDB, Ctx);
6502 if (IDA != IDB)
6503 return false;
6504 }
6505 return true;
6506 }
6507
6508 template <typename T1, typename T2,
6509 std::enable_if_t<!std::is_same_v<T1, T2>, bool> = true>
6510 bool operator()(T1 *Spec, T2 *Primary) {
6511 ArrayRef<TemplateArgument> Args1 = Spec->getTemplateArgs().asArray(),
6512 Args2 = Primary->getInjectedTemplateArgs(Ctx);
6513
6514 for (unsigned I = 0, E = Args1.size(); I < E; ++I) {
6515 // We use profile, instead of structural comparison of the arguments,
6516 // because canonicalization can't do the right thing for dependent
6517 // expressions.
6518 llvm::FoldingSetNodeID IDA, IDB;
6519 Args1[I].Profile(IDA, Ctx);
6520 // Unlike the specialization arguments, the injected arguments are not
6521 // always canonical.
6522 Ctx.getCanonicalTemplateArgument(Args2[I]).Profile(IDB, Ctx);
6523 if (IDA != IDB)
6524 return false;
6525 }
6526 return true;
6527 }
6528};
6529} // namespace
6530
6531/// Returns the more specialized template specialization between T1/P1 and
6532/// T2/P2.
6533/// - If IsMoreSpecialThanPrimaryCheck is true, T1/P1 is the partial
6534/// specialization and T2/P2 is the primary template.
6535/// - otherwise, both T1/P1 and T2/P2 are the partial specialization.
6536///
6537/// \param T1 the type of the first template partial specialization
6538///
6539/// \param T2 if IsMoreSpecialThanPrimaryCheck is true, the type of the second
6540/// template partial specialization; otherwise, the type of the
6541/// primary template.
6542///
6543/// \param P1 the first template partial specialization
6544///
6545/// \param P2 if IsMoreSpecialThanPrimaryCheck is true, the second template
6546/// partial specialization; otherwise, the primary template.
6547///
6548/// \returns - If IsMoreSpecialThanPrimaryCheck is true, returns P1 if P1 is
6549/// more specialized, returns nullptr if P1 is not more specialized.
6550/// - otherwise, returns the more specialized template partial
6551/// specialization. If neither partial specialization is more
6552/// specialized, returns NULL.
6553template <typename TemplateLikeDecl, typename PrimaryDel>
6554static TemplateLikeDecl *
6555getMoreSpecialized(Sema &S, QualType T1, QualType T2, TemplateLikeDecl *P1,
6556 PrimaryDel *P2, TemplateDeductionInfo &Info) {
6557 constexpr bool IsMoreSpecialThanPrimaryCheck =
6558 !std::is_same_v<TemplateLikeDecl, PrimaryDel>;
6559
6560 TemplateDecl *P2T;
6561 if constexpr (IsMoreSpecialThanPrimaryCheck)
6562 P2T = P2;
6563 else
6564 P2T = P2->getSpecializedTemplate();
6565
6566 bool Better1 = isAtLeastAsSpecializedAs(S, T1, T2, P2, P2T, Info);
6567 if (IsMoreSpecialThanPrimaryCheck && !Better1)
6568 return nullptr;
6569
6570 bool Better2 = isAtLeastAsSpecializedAs(S, T2, T1, P1,
6571 P1->getSpecializedTemplate(), Info);
6572 if (IsMoreSpecialThanPrimaryCheck && !Better2)
6573 return P1;
6574
6575 // C++ [temp.deduct.partial]p10:
6576 // F is more specialized than G if F is at least as specialized as G and G
6577 // is not at least as specialized as F.
6578 if (Better1 != Better2) // We have a clear winner
6579 return Better1 ? P1 : GetP2()(P1, P2);
6580
6581 if (!Better1 && !Better2)
6582 return nullptr;
6583
6588 return P1;
6590 return GetP2()(P1, P2);
6592 break;
6593 }
6594
6595 if (!S.Context.getLangOpts().CPlusPlus20)
6596 return nullptr;
6597
6598 // Match GCC on not implementing [temp.func.order]p6.2.1.
6599
6600 // C++20 [temp.func.order]p6:
6601 // If deduction against the other template succeeds for both transformed
6602 // templates, constraints can be considered as follows:
6603
6604 TemplateParameterList *TPL1 = P1->getTemplateParameters();
6605 TemplateParameterList *TPL2 = P2->getTemplateParameters();
6606 if (TPL1->size() != TPL2->size())
6607 return nullptr;
6608
6609 // C++20 [temp.func.order]p6.2.2:
6610 // Otherwise, if the corresponding template-parameters of the
6611 // template-parameter-lists are not equivalent ([temp.over.link]) or if the
6612 // function parameters that positionally correspond between the two
6613 // templates are not of the same type, neither template is more specialized
6614 // than the other.
6615 if (!S.TemplateParameterListsAreEqual(TPL1, TPL2, false,
6617 return nullptr;
6618
6619 if (!TemplateArgumentListAreEqual(S.getASTContext())(P1, P2))
6620 return nullptr;
6621
6623 P1->getAssociatedConstraints(AC1);
6624 P2->getAssociatedConstraints(AC2);
6625 bool AtLeastAsConstrained1, AtLeastAsConstrained2;
6626 if (S.IsAtLeastAsConstrained(P1, AC1, P2, AC2, AtLeastAsConstrained1) ||
6627 (IsMoreSpecialThanPrimaryCheck && !AtLeastAsConstrained1))
6628 return nullptr;
6629 if (S.IsAtLeastAsConstrained(P2, AC2, P1, AC1, AtLeastAsConstrained2))
6630 return nullptr;
6631 if (AtLeastAsConstrained1 == AtLeastAsConstrained2)
6632 return nullptr;
6633 return AtLeastAsConstrained1 ? P1 : GetP2()(P1, P2);
6634}
6635
6647
6650 ClassTemplateDecl *Primary = Spec->getSpecializedTemplate();
6653
6655 getMoreSpecialized(*this, PartialT, PrimaryT, Spec, Primary, Info);
6656 if (MaybeSpec)
6657 Info.clearSFINAEDiagnostic();
6658 return MaybeSpec;
6659}
6660
6665 // Pretend the variable template specializations are class template
6666 // specializations and form a fake injected class name type for comparison.
6667 assert(PS1->getSpecializedTemplate() == PS2->getSpecializedTemplate() &&
6668 "the partial specializations being compared should specialize"
6669 " the same template.");
6671 QualType PT1 = Context.getCanonicalTemplateSpecializationType(
6673 QualType PT2 = Context.getCanonicalTemplateSpecializationType(
6675
6676 TemplateDeductionInfo Info(Loc);
6677 return getMoreSpecialized(*this, PT1, PT2, PS1, PS2, Info);
6678}
6679
6682 VarTemplateDecl *Primary = Spec->getSpecializedTemplate();
6683 TemplateName Name(Primary->getCanonicalDecl());
6684
6685 SmallVector<TemplateArgument, 8> PrimaryCanonArgs(
6687 Context.canonicalizeTemplateArguments(PrimaryCanonArgs);
6688
6689 QualType PrimaryT = Context.getCanonicalTemplateSpecializationType(
6690 ElaboratedTypeKeyword::None, Name, PrimaryCanonArgs);
6691 QualType PartialT = Context.getCanonicalTemplateSpecializationType(
6693
6695 getMoreSpecialized(*this, PartialT, PrimaryT, Spec, Primary, Info);
6696 if (MaybeSpec)
6697 Info.clearSFINAEDiagnostic();
6698 return MaybeSpec;
6699}
6700
6703 const DefaultArguments &DefaultArgs, SourceLocation ArgLoc,
6704 bool PartialOrdering, bool *StrictPackMatch) {
6705 // C++1z [temp.arg.template]p4: (DR 150)
6706 // A template template-parameter P is at least as specialized as a
6707 // template template-argument A if, given the following rewrite to two
6708 // function templates...
6709
6710 // Rather than synthesize function templates, we merely perform the
6711 // equivalent partial ordering by performing deduction directly on
6712 // the template parameter lists of the template template parameters.
6713 //
6715
6719 if (Inst.isInvalid())
6720 return false;
6721
6723
6724 // Given an invented class template X with the template parameter list of
6725 // A (including default arguments):
6726 // - Each function template has a single function parameter whose type is
6727 // a specialization of X with template arguments corresponding to the
6728 // template parameters from the respective function template
6730
6731 // Check P's arguments against A's parameter list. This will fill in default
6732 // template arguments as needed. AArgs are already correct by construction.
6733 // We can't just use CheckTemplateIdType because that will expand alias
6734 // templates.
6736 {
6738 P->getRAngleLoc());
6739 for (unsigned I = 0, N = P->size(); I != N; ++I) {
6740 // Unwrap packs that getInjectedTemplateArgs wrapped around pack
6741 // expansions, to form an "as written" argument list.
6742 TemplateArgument Arg = PArgs[I];
6743 if (Arg.getKind() == TemplateArgument::Pack) {
6744 assert(Arg.pack_size() == 1 && Arg.pack_begin()->isPackExpansion());
6745 Arg = *Arg.pack_begin();
6746 }
6748 Arg, QualType(), P->getParam(I)->getLocation()));
6749 }
6750 PArgs.clear();
6751
6752 // C++1z [temp.arg.template]p3:
6753 // If the rewrite produces an invalid type, then P is not at least as
6754 // specialized as A.
6756 /*PartialOrdering=*/false, /*MatchingTTP=*/true);
6757 CTAI.SugaredConverted = std::move(PArgs);
6758 if (CheckTemplateArgumentList(AArg, ArgLoc, PArgList, DefaultArgs,
6759 /*PartialTemplateArgs=*/false, CTAI,
6760 /*UpdateArgsWithConversions=*/true,
6761 /*ConstraintsNotSatisfied=*/nullptr))
6762 return false;
6763 PArgs = std::move(CTAI.SugaredConverted);
6764 if (StrictPackMatch)
6765 *StrictPackMatch |= CTAI.StrictPackMatch;
6766 }
6767
6768 // Determine whether P1 is at least as specialized as P2.
6769 TemplateDeductionInfo Info(ArgLoc, A->getDepth());
6771 Deduced.resize(A->size());
6772
6773 // ... the function template corresponding to P is at least as specialized
6774 // as the function template corresponding to A according to the partial
6775 // ordering rules for function templates.
6776
6777 // Provisional resolution for CWG2398: Regarding temp.arg.template]p4, when
6778 // applying the partial ordering rules for function templates on
6779 // the rewritten template template parameters:
6780 // - In a deduced context, the matching of packs versus fixed-size needs to
6781 // be inverted between Ps and As. On non-deduced context, matching needs to
6782 // happen both ways, according to [temp.arg.template]p3, but this is
6783 // currently implemented as a special case elsewhere.
6785 *this, A, AArgs, PArgs, Info, Deduced,
6786 /*NumberOfArgumentsMustMatch=*/false, /*PartialOrdering=*/true,
6788 /*HasDeducedAnyParam=*/nullptr)) {
6790 if (StrictPackMatch && Info.hasStrictPackMatch())
6791 *StrictPackMatch = true;
6792 break;
6793
6795 Diag(AArg->getLocation(), diag::err_template_param_list_different_arity)
6796 << (A->size() > P->size()) << /*isTemplateTemplateParameter=*/true
6798 return false;
6800 Diag(AArg->getLocation(), diag::err_non_deduced_mismatch)
6801 << Info.FirstArg << Info.SecondArg;
6802 return false;
6805 diag::err_inconsistent_deduction)
6806 << Info.FirstArg << Info.SecondArg;
6807 return false;
6809 return false;
6810
6811 // None of these should happen for a plain deduction.
6826 llvm_unreachable("Unexpected Result");
6827 }
6828
6831 TDK = ::FinishTemplateArgumentDeduction(
6832 *this, AArg, AArg->getTemplateParameters(), AArg, PartialOrdering,
6833 AArgs, PArgs, Deduced, Info, /*CopyDeducedArgs=*/false);
6834 });
6835 switch (TDK) {
6837 return true;
6838
6839 // It doesn't seem possible to get a non-deduced mismatch when partial
6840 // ordering TTPs, except with an invalid template parameter list which has
6841 // a parameter after a pack.
6843 assert(PArg->isInvalidDecl() && "Unexpected NonDeducedMismatch");
6844 return false;
6845
6846 // Substitution failures should have already been diagnosed.
6850 return false;
6851
6852 // None of these should happen when just converting deduced arguments.
6867 llvm_unreachable("Unexpected Result");
6868 }
6869 llvm_unreachable("Unexpected TDK");
6870}
6871
6872namespace {
6873struct MarkUsedTemplateParameterVisitor : DynamicRecursiveASTVisitor {
6874 llvm::SmallBitVector &Used;
6875 unsigned Depth;
6876 bool VisitDeclRefTypes = true;
6877
6878 MarkUsedTemplateParameterVisitor(llvm::SmallBitVector &Used, unsigned Depth,
6879 bool VisitDeclRefTypes = true)
6880 : Used(Used), Depth(Depth), VisitDeclRefTypes(VisitDeclRefTypes) {}
6881
6882 bool VisitTemplateTypeParmType(TemplateTypeParmType *T) override {
6883 if (T->getDepth() == Depth)
6884 Used[T->getIndex()] = true;
6885 return true;
6886 }
6887
6888 bool TraverseTemplateName(TemplateName Template,
6889 bool TraverseQualifier) override {
6890 if (auto *TTP = llvm::dyn_cast_or_null<TemplateTemplateParmDecl>(
6891 Template.getAsTemplateDecl()))
6892 if (TTP->getDepth() == Depth)
6893 Used[TTP->getIndex()] = true;
6895 TraverseQualifier);
6896 return true;
6897 }
6898
6899 bool VisitDeclRefExpr(DeclRefExpr *E) override {
6900 if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(E->getDecl()))
6901 if (NTTP->getDepth() == Depth)
6902 Used[NTTP->getIndex()] = true;
6903 if (VisitDeclRefTypes)
6905 return true;
6906 }
6907
6908 bool VisitDependentTemplateIdExpr(DependentTemplateIdExpr *E) override {
6909 TemplateTemplateParmDecl *TTP = E->getParameter();
6910 if (TTP->getDepth() == Depth)
6911 Used[TTP->getIndex()] = true;
6912 return true;
6913 }
6914
6915 bool TraverseSizeOfPackExpr(SizeOfPackExpr *SOPE) override {
6916 return TraverseDecl(SOPE->getPack());
6917 }
6918};
6919}
6920
6921/// Mark the template parameters that are used by the given
6922/// expression.
6923static void
6925 const Expr *E,
6926 bool OnlyDeduced,
6927 unsigned Depth,
6928 llvm::SmallBitVector &Used) {
6929 if (!OnlyDeduced) {
6930 MarkUsedTemplateParameterVisitor(Used, Depth)
6931 .TraverseStmt(const_cast<Expr *>(E));
6932 return;
6933 }
6934
6935 // We can deduce from a pack expansion.
6936 if (const PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(E))
6937 E = Expansion->getPattern();
6938
6940
6941 if (const auto *DTI = dyn_cast<DependentTemplateIdExpr>(E)) {
6942 Used[DTI->getParameter()->getIndex()] = true;
6943 for (const auto &TLoc : DTI->template_arguments())
6944 MarkUsedTemplateParameters(Ctx, TLoc.getArgument(), OnlyDeduced, Depth,
6945 Used);
6946 return;
6947 }
6948
6950 if (!NTTP)
6951 return;
6952 if (NTTP.getDepth() == Depth)
6953 Used[NTTP.getIndex()] = true;
6954
6955 // In C++17 mode, additional arguments may be deduced from the type of a
6956 // non-type argument.
6957 if (Ctx.getLangOpts().CPlusPlus17)
6958 MarkUsedTemplateParameters(Ctx, NTTP.getType(), OnlyDeduced, Depth, Used);
6959}
6960
6961/// Mark the template parameters that are used by the given
6962/// nested name specifier.
6964 bool OnlyDeduced, unsigned Depth,
6965 llvm::SmallBitVector &Used) {
6967 return;
6968 MarkUsedTemplateParameters(Ctx, QualType(NNS.getAsType(), 0), OnlyDeduced,
6969 Depth, Used);
6970}
6971
6972/// Mark the template parameters that are used by the given
6973/// template name.
6974static void
6976 TemplateName Name,
6977 bool OnlyDeduced,
6978 unsigned Depth,
6979 llvm::SmallBitVector &Used) {
6980 if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
6982 = dyn_cast<TemplateTemplateParmDecl>(Template)) {
6983 if (TTP->getDepth() == Depth)
6984 Used[TTP->getIndex()] = true;
6985 }
6986 return;
6987 }
6988
6990 MarkUsedTemplateParameters(Ctx, QTN->getQualifier(), OnlyDeduced,
6991 Depth, Used);
6993 MarkUsedTemplateParameters(Ctx, DTN->getQualifier(), OnlyDeduced,
6994 Depth, Used);
6995}
6996
6997/// Mark the template parameters that are used by the given
6998/// type.
6999static void
7001 bool OnlyDeduced,
7002 unsigned Depth,
7003 llvm::SmallBitVector &Used) {
7004 if (T.isNull())
7005 return;
7006
7007 // Non-dependent types have nothing deducible
7008 if (!T->isDependentType())
7009 return;
7010
7011 T = Ctx.getCanonicalType(T);
7012 switch (T->getTypeClass()) {
7013 case Type::Pointer:
7016 OnlyDeduced,
7017 Depth,
7018 Used);
7019 break;
7020
7021 case Type::BlockPointer:
7024 OnlyDeduced,
7025 Depth,
7026 Used);
7027 break;
7028
7029 case Type::LValueReference:
7030 case Type::RValueReference:
7033 OnlyDeduced,
7034 Depth,
7035 Used);
7036 break;
7037
7038 case Type::MemberPointer: {
7039 const MemberPointerType *MemPtr = cast<MemberPointerType>(T.getTypePtr());
7040 MarkUsedTemplateParameters(Ctx, MemPtr->getPointeeType(), OnlyDeduced,
7041 Depth, Used);
7043 QualType(MemPtr->getQualifier().getAsType(), 0),
7044 OnlyDeduced, Depth, Used);
7045 break;
7046 }
7047
7048 case Type::DependentSizedArray:
7050 cast<DependentSizedArrayType>(T)->getSizeExpr(),
7051 OnlyDeduced, Depth, Used);
7052 // Fall through to check the element type
7053 [[fallthrough]];
7054
7055 case Type::ConstantArray:
7056 case Type::IncompleteArray:
7057 case Type::ArrayParameter:
7059 cast<ArrayType>(T)->getElementType(),
7060 OnlyDeduced, Depth, Used);
7061 break;
7062 case Type::Vector:
7063 case Type::ExtVector:
7065 cast<VectorType>(T)->getElementType(),
7066 OnlyDeduced, Depth, Used);
7067 break;
7068
7069 case Type::DependentVector: {
7070 const auto *VecType = cast<DependentVectorType>(T);
7071 MarkUsedTemplateParameters(Ctx, VecType->getElementType(), OnlyDeduced,
7072 Depth, Used);
7073 MarkUsedTemplateParameters(Ctx, VecType->getSizeExpr(), OnlyDeduced, Depth,
7074 Used);
7075 break;
7076 }
7077 case Type::DependentSizedExtVector: {
7078 const DependentSizedExtVectorType *VecType
7080 MarkUsedTemplateParameters(Ctx, VecType->getElementType(), OnlyDeduced,
7081 Depth, Used);
7082 MarkUsedTemplateParameters(Ctx, VecType->getSizeExpr(), OnlyDeduced,
7083 Depth, Used);
7084 break;
7085 }
7086
7087 case Type::DependentAddressSpace: {
7088 const DependentAddressSpaceType *DependentASType =
7090 MarkUsedTemplateParameters(Ctx, DependentASType->getPointeeType(),
7091 OnlyDeduced, Depth, Used);
7093 DependentASType->getAddrSpaceExpr(),
7094 OnlyDeduced, Depth, Used);
7095 break;
7096 }
7097
7098 case Type::ConstantMatrix: {
7100 MarkUsedTemplateParameters(Ctx, MatType->getElementType(), OnlyDeduced,
7101 Depth, Used);
7102 break;
7103 }
7104
7105 case Type::DependentSizedMatrix: {
7107 MarkUsedTemplateParameters(Ctx, MatType->getElementType(), OnlyDeduced,
7108 Depth, Used);
7109 MarkUsedTemplateParameters(Ctx, MatType->getRowExpr(), OnlyDeduced, Depth,
7110 Used);
7111 MarkUsedTemplateParameters(Ctx, MatType->getColumnExpr(), OnlyDeduced,
7112 Depth, Used);
7113 break;
7114 }
7115
7116 case Type::FunctionProto: {
7118 MarkUsedTemplateParameters(Ctx, Proto->getReturnType(), OnlyDeduced, Depth,
7119 Used);
7120 for (unsigned I = 0, N = Proto->getNumParams(); I != N; ++I) {
7121 // C++17 [temp.deduct.type]p5:
7122 // The non-deduced contexts are: [...]
7123 // -- A function parameter pack that does not occur at the end of the
7124 // parameter-declaration-list.
7125 if (!OnlyDeduced || I + 1 == N ||
7126 !Proto->getParamType(I)->getAs<PackExpansionType>()) {
7127 MarkUsedTemplateParameters(Ctx, Proto->getParamType(I), OnlyDeduced,
7128 Depth, Used);
7129 } else {
7130 // FIXME: C++17 [temp.deduct.call]p1:
7131 // When a function parameter pack appears in a non-deduced context,
7132 // the type of that pack is never deduced.
7133 //
7134 // We should also track a set of "never deduced" parameters, and
7135 // subtract that from the list of deduced parameters after marking.
7136 }
7137 }
7138 if (auto *E = Proto->getNoexceptExpr())
7139 MarkUsedTemplateParameters(Ctx, E, OnlyDeduced, Depth, Used);
7140 break;
7141 }
7142
7143 case Type::TemplateTypeParm: {
7144 const TemplateTypeParmType *TTP = cast<TemplateTypeParmType>(T);
7145 if (TTP->getDepth() == Depth)
7146 Used[TTP->getIndex()] = true;
7147 break;
7148 }
7149
7150 case Type::SubstTemplateTypeParmPack: {
7151 const SubstTemplateTypeParmPackType *Subst
7153 if (Subst->getReplacedParameter()->getDepth() == Depth)
7154 Used[Subst->getIndex()] = true;
7155 MarkUsedTemplateParameters(Ctx, Subst->getArgumentPack(), OnlyDeduced,
7156 Depth, Used);
7157 break;
7158 }
7159 case Type::SubstBuiltinTemplatePack: {
7160 MarkUsedTemplateParameters(Ctx, cast<SubstPackType>(T)->getArgumentPack(),
7161 OnlyDeduced, Depth, Used);
7162 break;
7163 }
7164
7165 case Type::InjectedClassName:
7167 ->getDecl()
7168 ->getCanonicalTemplateSpecializationType(Ctx);
7169 [[fallthrough]];
7170
7171 case Type::TemplateSpecialization: {
7172 const TemplateSpecializationType *Spec
7174
7175 TemplateName Name = Spec->getTemplateName();
7176 if (OnlyDeduced && Name.getAsDependentTemplateName())
7177 break;
7178
7179 MarkUsedTemplateParameters(Ctx, Name, OnlyDeduced, Depth, Used);
7180
7181 // C++0x [temp.deduct.type]p9:
7182 // If the template argument list of P contains a pack expansion that is
7183 // not the last template argument, the entire template argument list is a
7184 // non-deduced context.
7185 if (OnlyDeduced &&
7186 hasPackExpansionBeforeEnd(Spec->template_arguments()))
7187 break;
7188
7189 for (const auto &Arg : Spec->template_arguments())
7190 MarkUsedTemplateParameters(Ctx, Arg, OnlyDeduced, Depth, Used);
7191 break;
7192 }
7193
7194 case Type::Complex:
7195 if (!OnlyDeduced)
7197 cast<ComplexType>(T)->getElementType(),
7198 OnlyDeduced, Depth, Used);
7199 break;
7200
7201 case Type::Atomic:
7202 if (!OnlyDeduced)
7204 cast<AtomicType>(T)->getValueType(),
7205 OnlyDeduced, Depth, Used);
7206 break;
7207
7208 case Type::DependentName:
7209 if (!OnlyDeduced)
7211 cast<DependentNameType>(T)->getQualifier(),
7212 OnlyDeduced, Depth, Used);
7213 break;
7214
7215 case Type::TypeOf:
7216 if (!OnlyDeduced)
7217 MarkUsedTemplateParameters(Ctx, cast<TypeOfType>(T)->getUnmodifiedType(),
7218 OnlyDeduced, Depth, Used);
7219 break;
7220
7221 case Type::TypeOfExpr:
7222 if (!OnlyDeduced)
7224 cast<TypeOfExprType>(T)->getUnderlyingExpr(),
7225 OnlyDeduced, Depth, Used);
7226 break;
7227
7228 case Type::Decltype:
7229 if (!OnlyDeduced)
7231 cast<DecltypeType>(T)->getUnderlyingExpr(),
7232 OnlyDeduced, Depth, Used);
7233 break;
7234
7235 case Type::PackIndexing:
7236 if (!OnlyDeduced) {
7238 OnlyDeduced, Depth, Used);
7240 OnlyDeduced, Depth, Used);
7241 }
7242 break;
7243
7244 case Type::UnaryTransform:
7245 if (!OnlyDeduced) {
7246 auto *UTT = cast<UnaryTransformType>(T);
7247 auto Next = UTT->getUnderlyingType();
7248 if (Next.isNull())
7249 Next = UTT->getBaseType();
7250 MarkUsedTemplateParameters(Ctx, Next, OnlyDeduced, Depth, Used);
7251 }
7252 break;
7253
7254 case Type::PackExpansion:
7256 cast<PackExpansionType>(T)->getPattern(),
7257 OnlyDeduced, Depth, Used);
7258 break;
7259
7260 case Type::Auto:
7261 case Type::DeducedTemplateSpecialization:
7263 cast<DeducedType>(T)->getDeducedType(),
7264 OnlyDeduced, Depth, Used);
7265 break;
7266 case Type::DependentBitInt:
7268 cast<DependentBitIntType>(T)->getNumBitsExpr(),
7269 OnlyDeduced, Depth, Used);
7270 break;
7271
7272 case Type::HLSLAttributedResource:
7274 Ctx, cast<HLSLAttributedResourceType>(T)->getWrappedType(), OnlyDeduced,
7275 Depth, Used);
7276 if (cast<HLSLAttributedResourceType>(T)->hasContainedType())
7278 Ctx, cast<HLSLAttributedResourceType>(T)->getContainedType(),
7279 OnlyDeduced, Depth, Used);
7280 break;
7281
7282 // None of these types have any template parameters in them.
7283 case Type::Builtin:
7284 case Type::VariableArray:
7285 case Type::FunctionNoProto:
7286 case Type::Record:
7287 case Type::Enum:
7288 case Type::ObjCInterface:
7289 case Type::ObjCObject:
7290 case Type::ObjCObjectPointer:
7291 case Type::UnresolvedUsing:
7292 case Type::Pipe:
7293 case Type::BitInt:
7294 case Type::HLSLInlineSpirv:
7295 case Type::OverflowBehavior:
7296#define TYPE(Class, Base)
7297#define ABSTRACT_TYPE(Class, Base)
7298#define DEPENDENT_TYPE(Class, Base)
7299#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:
7300#include "clang/AST/TypeNodes.inc"
7301 break;
7302 }
7303}
7304
7305/// Mark the template parameters that are used by this
7306/// template argument.
7307static void
7310 bool OnlyDeduced,
7311 unsigned Depth,
7312 llvm::SmallBitVector &Used) {
7313 switch (TemplateArg.getKind()) {
7319 break;
7320
7322 MarkUsedTemplateParameters(Ctx, TemplateArg.getAsType(), OnlyDeduced,
7323 Depth, Used);
7324 break;
7325
7329 TemplateArg.getAsTemplateOrTemplatePattern(),
7330 OnlyDeduced, Depth, Used);
7331 break;
7332
7334 MarkUsedTemplateParameters(Ctx, TemplateArg.getAsExpr(), OnlyDeduced,
7335 Depth, Used);
7336 break;
7337
7339 for (const auto &P : TemplateArg.pack_elements())
7340 MarkUsedTemplateParameters(Ctx, P, OnlyDeduced, Depth, Used);
7341 break;
7342 }
7343}
7344
7345void
7346Sema::MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,
7347 unsigned Depth,
7348 llvm::SmallBitVector &Used) {
7349 ::MarkUsedTemplateParameters(Context, E, OnlyDeduced, Depth, Used);
7350}
7351
7353 const Expr *E, unsigned Depth, llvm::SmallBitVector &Used) {
7354 MarkUsedTemplateParameterVisitor(Used, Depth, /*VisitDeclRefTypes=*/false)
7355 .TraverseStmt(const_cast<Expr *>(E));
7356}
7357
7358void
7360 bool OnlyDeduced, unsigned Depth,
7361 llvm::SmallBitVector &Used) {
7362 // C++0x [temp.deduct.type]p9:
7363 // If the template argument list of P contains a pack expansion that is not
7364 // the last template argument, the entire template argument list is a
7365 // non-deduced context.
7366 if (OnlyDeduced &&
7367 hasPackExpansionBeforeEnd(TemplateArgs.asArray()))
7368 return;
7369
7370 for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
7371 ::MarkUsedTemplateParameters(Context, TemplateArgs[I], OnlyDeduced,
7372 Depth, Used);
7373}
7374
7376 bool OnlyDeduced, unsigned Depth,
7377 llvm::SmallBitVector &Used) {
7378 if (OnlyDeduced && hasPackExpansionBeforeEnd(TemplateArgs))
7379 return;
7380
7381 for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
7382 ::MarkUsedTemplateParameters(Context, TemplateArgs[I], OnlyDeduced, Depth,
7383 Used);
7384}
7385
7387 ArrayRef<TemplateArgumentLoc> TemplateArgs, unsigned Depth,
7388 llvm::SmallBitVector &Used) {
7389 for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
7391 /*OnlyDeduced=*/false, Depth, Used);
7392}
7393
7396 llvm::SmallBitVector &Deduced) {
7397 TemplateParameterList *TemplateParams
7398 = FunctionTemplate->getTemplateParameters();
7399 Deduced.clear();
7400 Deduced.resize(TemplateParams->size());
7401
7402 FunctionDecl *Function = FunctionTemplate->getTemplatedDecl();
7403 for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I)
7404 ::MarkUsedTemplateParameters(Ctx, Function->getParamDecl(I)->getType(),
7405 true, TemplateParams->getDepth(), Deduced);
7406}
7407
7410 QualType T) {
7411 if (!T->isDependentType())
7412 return false;
7413
7414 TemplateParameterList *TemplateParams
7415 = FunctionTemplate->getTemplateParameters();
7416 llvm::SmallBitVector Deduced(TemplateParams->size());
7417 ::MarkUsedTemplateParameters(S.Context, T, true, TemplateParams->getDepth(),
7418 Deduced);
7419
7420 return Deduced.any();
7421}
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Provides definitions for the various language-specific address spaces.
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
Defines the ExceptionSpecificationType enumeration and various utility functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
TokenType getType() const
Returns the token's type, e.g.
FormatToken * Next
The next token in the unwrapped line.
Result
Implement __builtin_bit_cast and related operations.
#define X(type, name)
Definition Value.h:97
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the clang::LangOptions interface.
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
static AccessResult DeduceTemplateArguments(Sema &S, FriendTemplateDecl *FTD, DeclContext *DC, const TemplateSpecializationType *TST, ArrayRef< TemplateParameterList * > TPLs, TemplateSpecCandidateSet *FailedTSC, MultiLevelTemplateArgumentList &DeducedArgs)
static TemplateDeductionResult DeduceNullPtrTemplateArgument(Sema &S, TemplateParameterList *TemplateParams, NonTypeOrVarTemplateParmDecl NTTP, QualType NullPtrType, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
Deduce the value of the given non-type template parameter from the given null pointer template argume...
static bool ConvertDeducedTemplateArgument(Sema &S, NamedDecl *Param, DeducedTemplateArgument Arg, NamedDecl *Template, TemplateDeductionInfo &Info, bool IsDeduced, Sema::CheckTemplateArgumentInfo &CTAI)
Convert the given deduced template argument and add it to the set of fully-converted template argumen...
static TemplateDeductionResult DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams, ArrayRef< TemplateArgument > Ps, ArrayRef< TemplateArgument > As, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool NumberOfArgumentsMustMatch, bool PartialOrdering, PackFold PackFold, bool *HasDeducedAnyParam)
static TemplateDeductionResult DeduceTemplateSpecArguments(Sema &S, TemplateParameterList *TemplateParams, const QualType P, QualType A, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
static TemplateDeductionResult DeduceTemplateArgumentsByTypeMatch(Sema &S, TemplateParameterList *TemplateParams, QualType Param, QualType Arg, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, unsigned TDF, PartialOrderingKind POK, bool DeducedFromArrayBound, bool *HasDeducedAnyParam)
Deduce the template arguments by comparing the parameter type and the argument type (C++ [temp....
static TemplateDeductionResult CheckDeductionConsistency(Sema &S, FunctionTemplateDecl *FTD, UnsignedOrNone ArgIdx, QualType P, QualType A, ArrayRef< TemplateArgument > DeducedArgs, bool CheckConsistency)
static PartialOrderingKind degradeCallPartialOrderingKind(PartialOrderingKind POK)
When propagating a partial ordering kind into a NonCall context, this is used to downgrade a 'Call' i...
static MoreSpecializedTrailingPackTieBreakerResult getMoreSpecializedTrailingPackTieBreaker(const TemplateSpecializationType *TST1, const TemplateSpecializationType *TST2)
static TemplateLikeDecl * getMoreSpecialized(Sema &S, QualType T1, QualType T2, TemplateLikeDecl *P1, PrimaryDel *P2, TemplateDeductionInfo &Info)
Returns the more specialized template specialization between T1/P1 and T2/P2.
static DeducedTemplateArgument checkDeducedTemplateArguments(ASTContext &Context, const DeducedTemplateArgument &X, const DeducedTemplateArgument &Y, bool AggregateCandidateDeduction=false)
Verify that the given, deduced template arguments are compatible.
static const Expr * unwrapExpressionForDeduction(const Expr *E)
static bool isSameDeclaration(Decl *X, Decl *Y)
Determine whether two declaration pointers refer to the same declaration.
static TemplateDeductionResult DeduceForEachType(Sema &S, TemplateParameterList *TemplateParams, ArrayRef< QualType > Params, ArrayRef< QualType > Args, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, PartialOrderingKind POK, bool FinishingDeduction, T &&DeductFunc)
static void AddFriendTemplateDeductionCandidate(Sema &S, TemplateDecl *TD, TemplateDeductionInfo &Info, TemplateDeductionResult Result, TemplateSpecCandidateSet *FailedTSC)
static TemplateDeductionResult DeduceTemplateBases(Sema &S, const CXXRecordDecl *RD, TemplateParameterList *TemplateParams, QualType P, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
Attempt to deduce the template arguments by checking the base types according to (C++20 [temp....
static bool hasTemplateArgumentForDeduction(ArrayRef< TemplateArgument > &Args, unsigned &ArgIdx)
Determine whether there is a template argument to be used for deduction.
static DeclContext * getAsDeclContextOrEnclosing(Decl *D)
static bool hasInconsistentOrSupersetQualifiersOf(QualType ParamType, QualType ArgType)
Determine whether the parameter has qualifiers that the argument lacks.
static void MarkUsedTemplateParameters(ASTContext &Ctx, const TemplateArgument &TemplateArg, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)
Mark the template parameters that are used by this template argument.
static UnsignedOrNone getPackIndexForParam(Sema &S, FunctionTemplateDecl *FunctionTemplate, const MultiLevelTemplateArgumentList &Args, unsigned ParamIdx)
Find the pack index for a particular parameter index in an instantiation of a function template with ...
static QualType GetTypeOfFunction(Sema &S, const OverloadExpr::FindResult &R, FunctionDecl *Fn)
Gets the type of a function for template-argument-deducton purposes when it's considered as part of a...
static bool hasPackExpansionBeforeEnd(ArrayRef< TemplateArgument > Args)
Determine whether the given set of template arguments has a pack expansion that is not the last templ...
static bool isSimpleTemplateIdType(QualType T)
Determine whether the given type T is a simple-template-id type.
PartialOrderingKind
The kind of PartialOrdering we're performing template argument deduction for (C++11 [temp....
static NonTypeOrVarTemplateParmDecl getNTTParameterFromExpr(const Expr *E, UnsignedOrNone Depth)
If the given expression is of a form that names a non-type template parameter, return the declaration...
MoreSpecializedTrailingPackTieBreakerResult
static TemplateParameter makeTemplateParameter(Decl *D)
Helper function to build a TemplateParameter when we don't know its type statically.
static TemplateDeductionResult CheckOriginalCallArgDeduction(Sema &S, TemplateDeductionInfo &Info, Sema::OriginalCallArg OriginalArg, QualType DeducedA)
Check whether the deduced argument type for a call to a function template matches the actual argument...
static bool AdjustFunctionParmAndArgTypesForDeduction(Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex, QualType &ParamType, QualType &ArgType, Expr::Classification ArgClassification, Expr *Arg, unsigned &TDF, TemplateSpecCandidateSet *FailedTSC=nullptr)
Perform the adjustments to the parameter and argument types described in C++ [temp....
static TemplateDeductionResult DeduceTemplateArgumentsFromCallArgument(Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex, QualType ParamType, QualType ArgType, Expr::Classification ArgClassification, Expr *Arg, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, SmallVectorImpl< Sema::OriginalCallArg > &OriginalCallArgs, bool DecomposedParam, unsigned ArgIdx, unsigned TDF, TemplateSpecCandidateSet *FailedTSC=nullptr)
Perform template argument deduction per [temp.deduct.call] for a single parameter / argument pair.
static bool isAtLeastAsSpecializedAs(Sema &S, SourceLocation Loc, FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, TemplatePartialOrderingContext TPOC, ArrayRef< QualType > Args1, ArrayRef< QualType > Args2, bool Args1Offset)
Determine whether the function template FT1 is at least as specialized as FT2.
static QualType GetImplicitObjectParameterType(ASTContext &Context, const CXXMethodDecl *Method, QualType RawType, bool IsOtherRvr)
static TemplateDeductionResult DeduceFromInitializerList(Sema &S, TemplateParameterList *TemplateParams, QualType AdjustedParamType, InitListExpr *ILE, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, SmallVectorImpl< Sema::OriginalCallArg > &OriginalCallArgs, unsigned ArgIdx, unsigned TDF)
Attempt template argument deduction from an initializer list deemed to be an argument in a function c...
static unsigned getFirstInnerIndex(FunctionTemplateDecl *FTD)
Get the index of the first template parameter that was originally from the innermost template-paramet...
static TemplateDeductionResult CheckDeducedTemplateArgumentList(Sema &S, TemplateDecl *Template, ArrayRef< TemplateArgumentLoc > Ps, ArrayRef< TemplateArgument > As, const MultiLevelTemplateArgumentList &MLTAL, TemplateDeductionInfo &Info)
PackFold
What directions packs are allowed to match non-packs.
static QualType getTypeOfTemplateArgumentValue(TemplateDeductionInfo &Info, const TemplateArgument &A)
C++26 [temp.deduct.type]p13: When the value of the argument corresponding to a constant template para...
static TemplateDeductionResult ConvertDeducedTemplateArguments(Sema &S, NamedDecl *Template, TemplateParameterList *TemplateParams, bool IsDeduced, SmallVectorImpl< DeducedTemplateArgument > &Deduced, TemplateDeductionInfo &Info, Sema::CheckTemplateArgumentInfo &CTAI, LocalInstantiationScope *CurrentInstantiationScope, unsigned NumAlreadyConverted, bool *IsIncomplete)
static QualType ResolveOverloadForDeduction(Sema &S, TemplateParameterList *TemplateParams, Expr *Arg, QualType ParamType, bool ParamWasReference, TemplateSpecCandidateSet *FailedTSC=nullptr)
Apply the deduction rules for overload sets.
static bool IsPossiblyOpaquelyQualifiedType(QualType T)
Determines whether the given type is an opaque type that might be more qualified when instantiated.
static TemplateDeductionResult CheckDeducedArgumentConstraints(Sema &S, NamedDecl *Template, ArrayRef< TemplateArgument > SugaredDeducedArgs, ArrayRef< TemplateArgument > CanonicalDeducedArgs, TemplateDeductionInfo &Info)
static const TemplateSpecializationType * getLastTemplateSpecType(QualType QT)
Deduce the template arguments by comparing the template parameter type (which is a template-id) with ...
static TemplateDeductionResult instantiateExplicitSpecifierDeferred(Sema &S, FunctionDecl *Specialization, const MultiLevelTemplateArgumentList &SubstArgs, TemplateDeductionInfo &Info, FunctionTemplateDecl *FunctionTemplate, ArrayRef< TemplateArgument > DeducedArgs)
static bool CheckDeducedPlaceholderConstraints(Sema &S, const AutoType &Type, AutoTypeLoc TypeLoc, QualType Deduced)
static TemplateDeductionResult DeduceNonTypeTemplateArgument(Sema &S, TemplateParameterList *TemplateParams, const NonTypeOrVarTemplateParmDecl NTTP, const DeducedTemplateArgument &NewDeduced, QualType ValueType, TemplateDeductionInfo &Info, bool PartialOrdering, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool *HasDeducedAnyParam)
Deduce the value of the given non-type template parameter as the given deduced template argument.
static bool IsPossiblyOpaquelyQualifiedTypeInternal(const Type *T)
static bool hasDeducibleTemplateParameters(Sema &S, FunctionTemplateDecl *FunctionTemplate, QualType T)
static bool isForwardingReference(QualType Param, unsigned FirstInnerIndex)
Determine whether a type denotes a forwarding reference.
static TemplateDeductionResult FinishTemplateArgumentDeduction(Sema &S, NamedDecl *Entity, TemplateParameterList *EntityTPL, TemplateDecl *Template, bool PartialOrdering, ArrayRef< TemplateArgumentLoc > Ps, ArrayRef< TemplateArgument > As, SmallVectorImpl< DeducedTemplateArgument > &Deduced, TemplateDeductionInfo &Info, bool CopyDeducedArgs)
Complete template argument deduction.
static bool isParameterPack(Expr *PackExpression)
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TemplateNameKind enum.
Defines the clang::TypeLoc interface and its subclasses.
Allows QualTypes to be sorted and hence used in maps and sets.
static const TemplateArgument & getArgument(const TemplateArgument &A)
C Language Family Type Representation.
const TemplateTemplateParmDecl * getTemplate() const
const NonTypeTemplateParmDecl * getNTTP() const
NonTypeOrVarTemplateParmDecl(const NamedDecl *Template)
TemplateParameter asTemplateParam() const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:245
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
unsigned getIntWidth(QualType T) const
QualType getAutoType(DeducedKind DK, QualType DeducedAsType, AutoTypeKeyword Keyword, TemplateName TypeConstraintConcept=TemplateName(), ArrayRef< TemplateArgument > TypeConstraintArgs={}) const
C++11 deduced auto type.
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const
Retrieve the "canonical" template argument.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const IncompleteArrayType * getAsIncompleteArrayType(QualType T) const
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
CanQualType DependentTy
CanQualType NullPtrTy
const LangOptions & getLangOpts() const
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
CanQualType BoolTy
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
CanQualType IntTy
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
LangAS getDefaultOpenCLPointeeAddrSpace()
Returns default address space based on OpenCL version and enabled features.
CanQualType OverloadTy
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType UnsignedIntTy
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getAdjustedParameterType(QualType T) const
Perform adjustment on the parameter type of a function.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y, bool IgnoreDeduced=false) const
Determine whether the given template names refer to the same template.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
CanQualType getCanonicalTagType(const TagDecl *TD) const
bool isSameTemplateArgument(const TemplateArgument &Arg1, const TemplateArgument &Arg2) const
Determine whether the given template arguments Arg1 and Arg2 are equivalent.
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getUnqualifiedArrayType(QualType T, Qualifiers &Quals) const
Return this type as a completely-unqualified array type, capturing the qualifiers in Quals.
TemplateName getDeducedTemplateName(TemplateName Underlying, DefaultArguments DefaultArgs) const
Represents a TemplateName which had some of its default arguments deduced.
QualType getDeducedTemplateSpecializationType(DeducedKind DK, QualType DeducedAsType, ElaboratedTypeKeyword Keyword, TemplateName Template) const
C++17 deduced class template specialization type.
const DependentSizedArrayType * getAsDependentSizedArrayType(QualType T) const
PtrTy get() const
Definition Ownership.h:171
bool isInvalid() const
Definition Ownership.h:167
TypeLoc getValueLoc() const
Definition TypeLoc.h:2692
A fixed int type of a specified bitwidth.
Definition TypeBase.h:8304
Pointer to a block type.
Definition TypeBase.h:3653
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2977
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Definition DeclCXX.h:3013
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2150
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
Definition DeclCXX.cpp:2719
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this method.
Definition DeclCXX.h:2343
bool isStatic() const
Definition DeclCXX.cpp:2417
The null pointer literal (C++11 [lex.nullptr])
Definition ExprCXX.h:773
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
base_class_range bases()
Definition DeclCXX.h:609
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
Definition DeclCXX.cpp:1744
Declaration of a class template.
CanQualType getCanonicalInjectedSpecializationType(const ASTContext &Ctx) const
Retrieve the canonical template specialization type of the injected-class-name for this class templat...
CanQualType getCanonicalInjectedSpecializationType(const ASTContext &Ctx) const
Retrieves the canonical injected specialization type for this partial specialization.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
Complex values, per C99 6.2.5p11.
Definition TypeBase.h:3362
Declaration of a C++20 concept.
const TypeClass * getTypePtr() const
Definition TypeLoc.h:433
Represents a concrete matrix type with constant number of rows and columns.
Definition TypeBase.h:4490
unsigned getNumColumns() const
Returns the number of columns in the matrix.
Definition TypeBase.h:4512
unsigned getNumRows() const
Returns the number of rows in the matrix.
Definition TypeBase.h:4509
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition ASTConcept.h:47
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1468
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2122
ValueDecl * getDecl()
Definition Expr.h:1362
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
Definition DeclBase.cpp:285
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:550
bool isInvalidDecl() const
Definition DeclBase.h:598
SourceLocation getLocation() const
Definition DeclBase.h:449
DeclContext * getDeclContext()
Definition DeclBase.h:458
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:997
Kind getKind() const
Definition DeclBase.h:452
Captures a template argument whose value has been deduced via c++ template argument deduction.
Definition Template.h:339
void setDeducedFromArrayBound(bool Deduced)
Specify whether the given non-type template argument was deduced from an array bound.
Definition Template.h:366
bool wasDeducedFromArrayBound() const
For a non-type template argument, determine whether the template argument was deduced from an array b...
Definition Template.h:362
SourceLocation getElaboratedKeywordLoc() const
Definition TypeLoc.h:2540
NestedNameSpecifierLoc getQualifierLoc() const
Definition TypeLoc.h:2552
Represents an extended address space qualifier where the input address space value is dependent.
Definition TypeBase.h:4159
QualType getPointeeType() const
Definition TypeBase.h:4171
Represents an extended vector type where either the type or size is dependent.
Definition TypeBase.h:4199
Represents a matrix type where the type and the number of rows and columns is dependent on a template...
Definition TypeBase.h:4582
TemplateTemplateParmDecl * getParameter() const
Definition ExprCXX.h:3510
Represents a vector type where either the type or size is dependent.
Definition TypeBase.h:4325
virtual bool TraverseTemplateName(TemplateName Template, bool TraverseQualifier=true)
virtual bool TraverseType(QualType T, bool TraverseQualifier=true)
RAII object that enters a new expression evaluation context.
Store information needed for an explicit specifier.
Definition DeclCXX.h:1949
bool isInvalid() const
Determine if the explicit specifier is invalid.
Definition DeclCXX.h:1978
const Expr * getExpr() const
Definition DeclCXX.h:1958
The return type of classify().
Definition Expr.h:340
bool isLValue() const
Definition Expr.h:391
This represents one expression.
Definition Expr.h:113
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition Expr.h:178
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, bool AllowRelaxedEval=false) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
QualType getType() const
Definition Expr.h:145
ExtVectorType - Extended vector type.
Definition TypeBase.h:4365
Stores a list of template parameters and the associated requires-clause (if any) for a TemplateDecl a...
Declaration of a friend template.
Represents a function declaration or definition.
Definition Decl.h:2059
const ParmVarDecl * getParamDecl(unsigned i) const
Definition Decl.h:2932
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
Definition Decl.cpp:4252
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition Decl.cpp:4240
bool hasCXXExplicitFunctionObjectParameter() const
Definition Decl.cpp:3915
QualType getReturnType() const
Definition Decl.h:2980
ArrayRef< ParmVarDecl * > parameters() const
Definition Decl.h:2905
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
Definition Decl.cpp:4311
void getAssociatedConstraints(SmallVectorImpl< AssociatedConstraint > &ACs) const
Get the associated-constraints of this function declaration.
Definition Decl.h:2883
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
Definition Decl.cpp:4376
bool isImmediateEscalating() const
Definition Decl.cpp:3356
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition Decl.cpp:4177
size_t param_size() const
Definition Decl.h:2921
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5416
param_type_iterator param_type_begin() const
Definition TypeBase.h:5860
const ExtParameterInfo * getExtParameterInfosOrNull() const
Return a pointer to the beginning of the array of extra parameter information, if present,...
Definition TypeBase.h:5898
unsigned getNumParams() const
Definition TypeBase.h:5694
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
Definition TypeBase.h:5836
Qualifiers getMethodQuals() const
Definition TypeBase.h:5842
QualType getParamType(unsigned i) const
Definition TypeBase.h:5696
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
Definition TypeBase.h:5729
bool isVariadic() const
Whether this function prototype is variadic.
Definition TypeBase.h:5820
ExtProtoInfo getExtProtoInfo() const
Definition TypeBase.h:5705
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
Definition TypeBase.h:5781
param_type_iterator param_type_end() const
Definition TypeBase.h:5864
ArrayRef< QualType > getParamTypes() const
Definition TypeBase.h:5701
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
Definition TypeBase.h:5850
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4612
QualType getReturnType() const
Definition TypeBase.h:4952
Describes an C or C++ initializer list.
Definition Expr.h:5356
unsigned getNumInits() const
Definition Expr.h:5389
unsigned getNumInitsWithEmbedExpanded() const
getNumInits but if the list has an EmbedExpr inside includes full length of embedded data.
Definition Expr.h:5393
ArrayRef< Expr * > inits() const
Definition Expr.h:5409
An lvalue reference type, per C++11 [dcl.ref].
Definition TypeBase.h:3715
A stack-allocated class that identifies which local variable declaration instantiations are present i...
Definition Template.h:377
NamedDecl * getPartiallySubstitutedPack(const TemplateArgument **ExplicitArgs=nullptr, unsigned *NumExplicitArgs=nullptr) const
Retrieve the partially-substitued template parameter pack.
void ResetPartiallySubstitutedPack()
Reset the partially-substituted pack when it is no longer of interest.
Definition Template.h:565
Represents a matrix type, as defined in the Matrix Types clang extensions.
Definition TypeBase.h:4435
QualType getElementType() const
Returns type of the elements being stored in the matrix.
Definition TypeBase.h:4454
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3751
NestedNameSpecifier getQualifier() const
Definition TypeBase.h:3783
QualType getPointeeType() const
Definition TypeBase.h:3769
Data structure that captures multiple levels of template argument lists for use in template instantia...
Definition Template.h:76
void addOuterTemplateArguments(Decl *AssociatedDecl, ArgList Args, bool Final)
Add a new outmost level to the multi-level template argument list.
Definition Template.h:218
void addOuterRetainedLevels(unsigned Num)
Definition Template.h:272
void replaceInnermostTemplateArguments(Decl *AssociatedDecl, ArgList Args, bool Final=false)
Replaces the current 'innermost' level with the provided argument list.
Definition Template.h:245
This represents a decl that may have a name.
Definition Decl.h:275
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
Definition Decl.h:488
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:341
Class that aids in the construction of nested-name-specifiers along with source-location information ...
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Represents a pointer to an Objective C object.
Definition TypeBase.h:8087
A reference to an overloaded function set, either an UnresolvedLookupExpr or an UnresolvedMemberExpr.
Definition ExprCXX.h:3143
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
Definition ExprCXX.h:3295
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
Definition ExprCXX.h:3204
SourceLocation getNameLoc() const
Gets the location of the name.
Definition ExprCXX.h:3256
decls_iterator decls_begin() const
Definition ExprCXX.h:3236
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const
Copies the template arguments into the given structure.
Definition ExprCXX.h:3325
decls_iterator decls_end() const
Definition ExprCXX.h:3239
Represents a C++11 pack expansion that produces a sequence of expressions.
Definition ExprCXX.h:4417
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
Definition Attr.h:279
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3403
QualType getPointeeType() const
Definition TypeBase.h:3413
A (possibly-)qualified type.
Definition TypeBase.h:938
bool hasQualifiers() const
Determine whether this type has any qualifiers.
Definition TypeBase.h:8535
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1005
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition TypeBase.h:8446
LangAS getAddressSpace() const
Return the address space of this type.
Definition TypeBase.h:8572
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition TypeBase.h:8486
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
Definition TypeBase.h:8631
QualType getCanonicalType() const
Definition TypeBase.h:8498
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8540
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
Definition Type.cpp:1841
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
Definition TypeBase.h:8492
Represents a template name as written in source code.
The collection of all-type qualifiers we support.
Definition TypeBase.h:332
unsigned getCVRQualifiers() const
Definition TypeBase.h:489
void removeCVRQualifiers(unsigned mask)
Definition TypeBase.h:496
GC getObjCGCAttr() const
Definition TypeBase.h:520
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
Definition TypeBase.h:362
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
Definition TypeBase.h:355
@ OCL_None
There is no lifetime qualification on this type.
Definition TypeBase.h:351
void removeObjCLifetime()
Definition TypeBase.h:552
bool isStrictSupersetOf(Qualifiers Other) const
Determine whether this set of qualifiers is a strict superset of another set of qualifiers,...
Definition Type.cpp:57
bool hasConst() const
Definition TypeBase.h:458
bool hasNonTrivialObjCLifetime() const
True if the lifetime is neither None or ExplicitNone.
Definition TypeBase.h:560
bool compatiblyIncludes(Qualifiers other, const ASTContext &Ctx) const
Determines if these qualifiers compatibly include another set.
Definition TypeBase.h:728
bool hasAddressSpace() const
Definition TypeBase.h:571
void removeObjCGCAttr()
Definition TypeBase.h:524
void removeAddressSpace()
Definition TypeBase.h:597
bool hasObjCGCAttr() const
Definition TypeBase.h:519
void setCVRQualifiers(unsigned mask)
Definition TypeBase.h:492
bool hasObjCLifetime() const
Definition TypeBase.h:545
ObjCLifetime getObjCLifetime() const
Definition TypeBase.h:546
Qualifiers withoutObjCLifetime() const
Definition TypeBase.h:534
LangAS getAddressSpace() const
Definition TypeBase.h:572
void setObjCLifetime(ObjCLifetime type)
Definition TypeBase.h:549
An rvalue reference type, per C++11 [dcl.ref].
Definition TypeBase.h:3733
ArrayRef< TemplateArgument > getInjectedTemplateArgs(const ASTContext &Context) const
Retrieve the "injected" template arguments that correspond to the template parameters of this templat...
Base for LValueReferenceType and RValueReferenceType.
Definition TypeBase.h:3678
QualType getPointeeType() const
Definition TypeBase.h:3700
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Definition SemaBase.cpp:61
RAII object used to change the argument pack substitution index within a Sema object.
Definition Sema.h:13894
RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...
Definition Sema.h:8604
A RAII object to temporarily push a declaration context.
Definition Sema.h:3632
A helper class for building up ExtParameterInfos.
Definition Sema.h:13263
const FunctionProtoType::ExtParameterInfo * getPointerOrNull(unsigned numParams)
Return a pointer (suitable for setting in an ExtProtoInfo) to the ExtParameterInfo array we've built ...
Definition Sema.h:13282
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12678
bool hasErrorOccurred() const
Determine whether any SFINAE errors have been trapped.
Definition Sema.h:12712
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:863
bool TryFunctionConversion(QualType FromType, QualType ToType, QualType &ResultTy) const
Same as IsFunctionConversion, but if this would return true, it sets ResultTy to ToType.
QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13292
TemplateDeductionResult DeduceTemplateArgumentsFromType(TemplateDecl *TD, QualType FromType, sema::TemplateDeductionInfo &Info)
Deduce the template arguments of the given template from FromType.
QualType ReplaceAutoType(QualType TypeWithAuto, QualType Replacement)
Completely replace the auto in TypeWithAuto by Replacement.
SemaCUDA & CUDA()
Definition Sema.h:1499
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
ClassTemplatePartialSpecializationDecl * getMoreSpecializedPartialSpecialization(ClassTemplatePartialSpecializationDecl *PS1, ClassTemplatePartialSpecializationDecl *PS2, SourceLocation Loc)
Returns the more specialized class template partial specialization according to the rules of partial ...
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
Definition Sema.h:7076
FunctionDecl * getMoreConstrainedFunction(FunctionDecl *FD1, FunctionDecl *FD2)
Returns the more constrained function according to the rules of partial ordering by constraints (C++ ...
FunctionDecl * InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD, const TemplateArgumentList *Args, SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC=CodeSynthesisContext::ExplicitTemplateArgumentSubstitution)
Instantiate (or find existing instantiation of) a function template with a given set of template argu...
QualType BuildStdInitializerList(QualType Element, SourceLocation Loc)
Looks for the std::initializer_list template and instantiates it with Element, or emits an error if i...
TemplateDeductionResult FinishTemplateArgumentDeduction(FunctionTemplateDecl *FunctionTemplate, SmallVectorImpl< DeducedTemplateArgument > &Deduced, unsigned NumExplicitlySpecified, FunctionDecl *&Specialization, sema::TemplateDeductionInfo &Info, SmallVectorImpl< OriginalCallArg > const *OriginalCallArgs, bool PartialOverloading, bool PartialOrdering, bool ForOverloadSetAddressResolution, llvm::function_ref< bool(bool)> CheckNonDependent=[](bool) { return false;})
Finish template argument deduction for a function template, checking the deduced template arguments f...
@ CTAK_DeducedFromArrayBound
The template argument was deduced from an array bound via template argument deduction.
Definition Sema.h:12200
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
Definition Sema.h:12192
@ CTAK_Deduced
The template argument was deduced via template argument deduction.
Definition Sema.h:12196
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
ASTContext & Context
Definition Sema.h:1332
bool IsQualificationConversion(QualType FromType, QualType ToType, bool CStyle, bool &ObjCLifetimeConversion)
IsQualificationConversion - Determines whether the conversion from an rvalue of type FromType to ToTy...
void MarkUsedTemplateParametersForSubsumptionParameterMapping(const Expr *E, unsigned Depth, llvm::SmallBitVector &Used)
Mark which template parameters are named in a given expression.
QualType BuildFunctionType(QualType T, MutableArrayRef< QualType > ParamTypes, SourceLocation Loc, DeclarationName Entity, const FunctionProtoType::ExtProtoInfo &EPI)
Build a function type.
ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)
ASTContext & getASTContext() const
Definition Sema.h:935
UnresolvedSetIterator getMostSpecialized(UnresolvedSetIterator SBegin, UnresolvedSetIterator SEnd, TemplateSpecCandidateSet &FailedCandidates, SourceLocation Loc, const PartialDiagnostic &NoneDiag, const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag, bool Complain=true, QualType TargetType=QualType())
Retrieve the most specialized of the given function template specializations.
TypeSourceInfo * SubstType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, bool AllowDeducedTST=false)
Perform substitution on the type T with a given set of template arguments.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
Definition Sema.cpp:778
bool isTemplateTemplateParameterAtLeastAsSpecializedAs(TemplateParameterList *PParam, TemplateDecl *PArg, TemplateDecl *AArg, const DefaultArguments &DefaultArgs, SourceLocation ArgLoc, bool PartialOrdering, bool *StrictPackMatch)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Definition Sema.h:1236
bool SubstTemplateArguments(ArrayRef< TemplateArgumentLoc > Args, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Outputs)
bool CheckConstraintSatisfaction(ConstrainedDeclOrNestedRequirement Entity, ArrayRef< AssociatedConstraint > AssociatedConstraints, const MultiLevelTemplateArgumentList &TemplateArgLists, SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction, const ConceptReference *TopLevelConceptId=nullptr, Expr **ConvertedExpr=nullptr)
Check whether the given list of constraint expressions are satisfied (as if in a 'conjunction') given...
@ TPL_TemplateParamsEquivalent
We are determining whether the template-parameters are equivalent according to C++ [temp....
Definition Sema.h:12396
bool CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, CheckTemplateArgumentInfo &CTAI, CheckTemplateArgumentKind CTAK)
Check that the given template argument corresponds to the given template parameter.
bool isSameOrCompatibleFunctionType(QualType Param, QualType Arg)
Compare types for equality with respect to possibly compatible function types (noreturn adjustment,...
const LangOptions & getLangOpts() const
Definition Sema.h:928
UnsignedOrNone getNumArgumentsInExpansion(QualType T, const MultiLevelTemplateArgumentList &TemplateArgs)
Determine the number of arguments in the given pack expansion type.
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
ExplicitSpecifier instantiateExplicitSpecifier(const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES)
TemplateDeductionResult SubstituteExplicitTemplateArguments(FunctionTemplateDecl *FunctionTemplate, TemplateArgumentListInfo &ExplicitTemplateArgs, SmallVectorImpl< DeducedTemplateArgument > &Deduced, SmallVectorImpl< QualType > &ParamTypes, QualType *FunctionType, sema::TemplateDeductionInfo &Info)
Substitute the explicitly-provided template arguments into the given function template according to C...
bool SubstParmTypes(SourceLocation Loc, ArrayRef< ParmVarDecl * > Params, const FunctionProtoType::ExtParameterInfo *ExtParamInfos, const MultiLevelTemplateArgumentList &TemplateArgs, SmallVectorImpl< QualType > &ParamTypes, SmallVectorImpl< ParmVarDecl * > *OutParams, ExtParameterInfoBuilder &ParamInfos)
Substitute the given template arguments into the given set of parameters, producing the set of parame...
FunctionDecl * resolveAddressOfSingleOverloadCandidate(Expr *E, DeclAccessPair &FoundResult)
Given an expression that refers to an overloaded function, try to resolve that function to a single f...
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1472
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
SuppressedDiagnosticsMap SuppressedDiagnostics
Definition Sema.h:12749
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, SourceLocation Loc={}, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition Sema.h:8337
FunctionDecl * ResolveSingleFunctionTemplateSpecialization(OverloadExpr *ovl, bool Complain=false, DeclAccessPair *Found=nullptr, TemplateSpecCandidateSet *FailedTSC=nullptr, bool ForTypeDeduction=false)
Given an expression that refers to an overloaded function, try to resolve that overloaded function ex...
QualType getDecltypeForExpr(Expr *E)
getDecltypeForExpr - Given an expr, will return the decltype for that expression, according to the ru...
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
Decl * SubstDecl(Decl *D, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs)
TemplateArgumentLoc SubstDefaultTemplateArgumentIfAvailable(TemplateDecl *Template, SourceLocation TemplateKWLoc, SourceLocation TemplateNameLoc, SourceLocation RAngleLoc, Decl *Param, ArrayRef< TemplateArgument > SugaredConverted, ArrayRef< TemplateArgument > CanonicalConverted, bool &HasDefaultArg)
If the given template parameter has a default template argument, substitute into that default templat...
TypeSourceInfo * SubstAutoTypeSourceInfoDependent(TypeSourceInfo *TypeWithAuto)
TypeSourceInfo * ReplaceAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
TemplateParameterList * SubstTemplateParams(TemplateParameterList *Params, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraints=true)
bool isSFINAEContext() const
Definition Sema.h:13932
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
Definition Sema.h:15738
bool isStdInitializerList(QualType Ty, QualType *Element)
Tests whether Ty is an instance of std::initializer_list and, if it is and Element is not NULL,...
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
void MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced, unsigned Depth, llvm::SmallBitVector &Used)
Mark which template parameters are used in a given expression.
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6887
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
Definition Sema.h:6856
QualType getLambdaConversionFunctionResultType(const FunctionProtoType *CallOpType, CallingConv CC)
Get the return type to use for a lambda's conversion function(s) to function pointer type,...
static QualType getTypeOfConstantTemplateParameter(const TemplateArgument &Arg)
Determine the declared type of the constant template parameter that Arg names, if any.
QualType getCompletedType(Expr *E)
Get the type of expression E, triggering instantiation to complete the type if necessary – that is,...
TypeSourceInfo * SubstAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
bool IsAtLeastAsConstrained(const NamedDecl *D1, MutableArrayRef< AssociatedConstraint > AC1, const NamedDecl *D2, MutableArrayRef< AssociatedConstraint > AC2, bool &Result)
Check whether the given declaration's associated constraints are at least as constrained than another...
void DiagnoseAutoDeductionFailure(const VarDecl *VDecl, const Expr *Init)
TemplateArgumentLoc getIdentityTemplateArgumentLoc(NamedDecl *Param, SourceLocation Location)
Get a template argument mapping the given template parameter to itself, e.g.
bool CheckIfFunctionSpecializationIsImmediate(FunctionDecl *FD, SourceLocation Loc)
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
bool CheckFunctionTemplateConstraints(SourceLocation PointOfInstantiation, FunctionDecl *Decl, ArrayRef< TemplateArgument > TemplateArgs, ConstraintSatisfaction &Satisfaction)
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
Definition Sema.cpp:647
bool isMoreSpecializedThanPrimary(ClassTemplatePartialSpecializationDecl *T, sema::TemplateDeductionInfo &Info)
bool IsFunctionConversion(QualType FromType, QualType ToType) const
Determine whether the conversion from FromType to ToType is a valid conversion of ExtInfo/ExtProtoInf...
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
bool CheckTemplateArgumentList(TemplateDecl *Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, const DefaultArguments &DefaultArgs, bool PartialTemplateArgs, CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions=true, bool *ConstraintsNotSatisfied=nullptr)
Check that the given template arguments can be provided to the given template, converting the argumen...
void adjustMemberFunctionCC(QualType &T, bool HasThisPointer, bool IsCtorOrDtor, SourceLocation Loc)
Adjust the calling convention of a method to be the ABI default if it wasn't specified explicitly.
ExprResult BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc)
Given a non-type template argument that refers to a declaration and the type of its corresponding non...
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
Definition Sema.h:6564
TemplateDeductionResult DeduceAutoType(TypeLoc AutoTypeLoc, Expr *Initializer, QualType &Result, sema::TemplateDeductionInfo &Info, bool DependentDeduction=false, bool IgnoreConstraints=false, TemplateSpecCandidateSet *FailedTSC=nullptr)
Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
QualType adjustCCAndNoReturn(QualType ArgFunctionType, QualType FunctionType, bool AdjustExceptionSpec=false)
Adjust the type ArgFunctionType to match the calling convention, noreturn, and optionally the excepti...
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
FunctionTemplateDecl * getMoreSpecializedTemplate(FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1, QualType RawObj1Ty={}, QualType RawObj2Ty={}, bool Reversed=false, bool PartialOverloading=false)
Returns the more specialized function template according to the rules of function template partial or...
void MarkDeducedTemplateParameters(const FunctionTemplateDecl *FunctionTemplate, llvm::SmallBitVector &Deduced)
Definition Sema.h:13135
NamedDecl * getPack() const
Retrieve the parameter pack.
Definition ExprCXX.h:4563
Encodes a location in the source.
A trivial tuple used to represent a source range.
bool isInvalid() const
SourceLocation getEnd() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const
Produce a unique representation of the given statement.
A convenient class for passing around template argument information.
void addArgument(const TemplateArgumentLoc &Loc)
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
Represents a template argument.
QualType getParamTypeForDecl() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
pack_iterator pack_end() const
Iterator referencing one past the last argument of a template argument pack.
const TemplateArgument * pack_iterator
Iterator that traverses the elements of a template argument pack.
pack_iterator pack_begin() const
Iterator referencing the first argument of a template argument pack.
QualType getNonTypeTemplateArgumentType() const
If this is a non-type template argument, get its type.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const
Used to insert TemplateArguments into FoldingSets.
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
QualType getNullPtrType() const
Retrieve the type for null non-type template argument.
static TemplateArgument CreatePackCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument pack by copying the given set of template arguments.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
TemplateArgument getPackExpansionPattern() const
When the template argument is a pack expansion, returns the pattern of the pack expansion.
bool isNull() const
Determine whether this template argument has no value.
static TemplateArgument getEmptyPack()
unsigned pack_size() const
The number of template arguments in the given template argument pack.
bool structurallyEquals(const TemplateArgument &Other) const
Determines whether two template arguments are superficially the same.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
bool isPackExpansion() const
Determine whether this template argument is a pack expansion.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
The base class of all kinds of template declarations (e.g., class, function, etc.).
void getAssociatedConstraints(llvm::SmallVectorImpl< AssociatedConstraint > &AC) const
Get the total constraint-expression associated with this template, including constraint-expressions d...
bool isTypeAlias() const
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
ArrayRef< TemplateArgument > getInjectedTemplateArgs(const ASTContext &Context)
Get the template argument list of the template parameter list.
unsigned getDepth() const
Get the depth of this template parameter list in the set of template parameter lists.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
void getAssociatedConstraints(llvm::SmallVectorImpl< AssociatedConstraint > &AC) const
All associated constraints derived from this template parameter list, including the requires clause a...
ArrayRef< NamedDecl * > asArray()
SourceLocation getTemplateLoc() const
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
void NoteCandidates(Sema &S, SourceLocation Loc)
NoteCandidates - When no template specialization match is found, prints diagnostic messages containin...
TemplateSpecCandidate & addCandidate()
Add a new candidate with NumConversions conversion sequence slots to the overload set.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
TemplateNameKind templateParameterKind() const
unsigned getIndex() const
Get the index of the template parameter within its parameter list.
unsigned getDepth() const
Get the nesting depth of the template parameter.
bool isExpandedParameterPack() const
Whether this parameter is a template template parameter pack that has a known list of different templ...
Declaration of a template type parameter.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, int D, int P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
A semantic tree transformation that allows one to transform one abstract syntax tree into another.
const Type * getTypeForDecl() const
Definition Decl.h:3677
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
void reserve(size_t Requested)
Ensures that this buffer has at least as much capacity as described.
Base wrapper for a particular "section" of type source info.
Definition TypeLoc.h:59
QualType getType() const
Get the type for which this source info wrapper provides information.
Definition TypeLoc.h:133
SourceRange getLocalSourceRange() const
Get the local source range.
Definition TypeLoc.h:160
unsigned getFullDataSize() const
Returns the size of the type source info data block.
Definition TypeLoc.h:165
void copy(TypeLoc other)
Copies the other type loc into this one.
Definition TypeLoc.cpp:169
A container of type source information.
Definition TypeBase.h:8417
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8428
SourceLocation getNameLoc() const
Definition TypeLoc.h:547
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:551
The base class of the type hierarchy.
Definition TypeBase.h:1879
bool isVoidType() const
Definition TypeBase.h:9068
const TemplateSpecializationType * getAsNonAliasTemplateSpecializationType() const
Look through sugar for an instance of TemplateSpecializationType which is not a type alias,...
Definition Type.cpp:2092
bool isPlaceholderType() const
Test for a type which does not represent an actual type-system type but is instead used as a placehol...
Definition TypeBase.h:9044
bool isRValueReferenceType() const
Definition TypeBase.h:8715
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
bool isArrayType() const
Definition TypeBase.h:8782
bool isFunctionPointerType() const
Definition TypeBase.h:8750
bool isPointerType() const
Definition TypeBase.h:8683
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9366
bool isReferenceType() const
Definition TypeBase.h:8707
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:885
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
Definition TypeBase.h:2980
bool isLValueReferenceType() const
Definition TypeBase.h:8711
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2863
QualType getCanonicalTypeInternal() const
Definition TypeBase.h:3200
bool isMemberPointerType() const
Definition TypeBase.h:8764
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
Definition Type.cpp:5630
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
Definition TypeBase.h:9215
bool isFunctionType() const
Definition TypeBase.h:8679
bool isMemberFunctionPointerType() const
Definition TypeBase.h:8768
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:3002
bool isAnyPointerType() const
Definition TypeBase.h:8691
TypeClass getTypeClass() const
Definition TypeBase.h:2449
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9299
bool isRecordType() const
Definition TypeBase.h:8810
The iterator over UnresolvedSets.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:713
QualType getType() const
Definition Decl.h:724
QualType getType() const
Definition Value.cpp:238
Represents a variable declaration or definition.
Definition Decl.h:933
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Definition Decl.h:1603
Declaration of a variable template.
VarTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the variable template specialization.
VarTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
Represents a GCC generic vector type.
Definition TypeBase.h:4273
Provides information about an attempted template argument deduction, whose success or failure was des...
void setExplicitArgs(TemplateArgumentList *NewDeducedSugared, TemplateArgumentList *NewDeducedCanonical)
Provide an initial template argument list that contains the explicitly-specified arguments.
TemplateArgumentList * takeCanonical()
TemplateArgumentList * takeSugared()
Take ownership of the deduced template argument lists.
SourceLocation getLocation() const
Returns the location at which template argument is occurring.
void clearSFINAEDiagnostic()
Discard any SFINAE diagnostics.
TemplateArgument SecondArg
The second template argument to which the template argument deduction failure refers.
TemplateParameter Param
The template parameter to which a template argument deduction failure refers.
diag_iterator diag_end() const
Returns an iterator at the end of the sequence of suppressed diagnostics.
void reset(TemplateArgumentList *NewDeducedSugared, TemplateArgumentList *NewDeducedCanonical)
Provide a new template argument list that contains the results of template argument deduction.
unsigned getDeducedDepth() const
The depth of template parameters for which deduction is being performed.
diag_iterator diag_begin() const
Returns an iterator at the beginning of the sequence of suppressed diagnostics.
TemplateArgument FirstArg
The first template argument to which the template argument deduction failure refers.
ConstraintSatisfaction AssociatedConstraintsSatisfaction
The constraint satisfaction details resulting from the associated constraints satisfaction tests.
unsigned CallArgIndex
The index of the function argument that caused a deduction failure.
__inline void unsigned int _2
Top level wrappers for InstallAPI frontend operations.
@ OO_None
Not an overloaded operator.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
Definition Sema.h:824
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ CPlusPlus20
@ CPlusPlus
@ CPlusPlus11
@ CPlusPlus14
@ GNUAutoType
__auto_type (GNU extension)
Definition TypeBase.h:1846
bool isTargetAddressSpace(LangAS AS)
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
Definition Template.h:50
@ Both
Look for allocation functions in both the global scope and in the scope of the allocated class.
Definition Sema.h:793
@ RQ_None
No ref-qualifier was provided.
Definition TypeBase.h:1801
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
Definition TypeBase.h:1807
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
Definition Parser.h:61
NamedDecl * getAsNamedDecl(TemplateParameter P)
bool isPackProducingBuiltinTemplateName(TemplateName N)
@ AS_public
Definition Specifiers.h:128
UnsignedOrNone getExpandedPackSize(const NamedDecl *Param)
Check whether the template parameter is a pack expansion, and if so, determine the number of paramete...
unsigned toTargetAddressSpace(LangAS AS)
bool isLambdaCallOperator(const CXXMethodDecl *MD)
Definition ASTLambda.h:28
@ Result
The result type of a method or function.
Definition TypeBase.h:906
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
Definition Parser.h:81
ActionResult< CXXBaseSpecifier * > BaseResult
Definition Ownership.h:252
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
@ FunctionTemplate
The name was classified as a function template name.
Definition Sema.h:581
@ Concept
The name was classified as a concept name.
Definition Sema.h:585
bool isLambdaConversionOperator(CXXConversionDecl *C)
Definition ASTLambda.h:69
DeducedKind
Definition TypeBase.h:1811
@ Deduced
The normal deduced case.
Definition TypeBase.h:1818
@ Undeduced
Not deduced yet. This is for example an 'auto' which was just parsed.
Definition TypeBase.h:1813
@ DeducedAsPack
Same as above, but additionally this represents a case where the deduced entity itself is a pack.
Definition TypeBase.h:1834
@ DeducedAsDependent
This is a special case where the initializer is dependent, so we can't deduce a type yet.
Definition TypeBase.h:1828
@ TNK_Var_template
The name refers to a variable template whose specialization produces a variable.
@ TNK_Concept_template
The name refers to a concept.
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
TPOC
The context in which partial ordering of function templates occurs.
Definition Template.h:310
@ TPOC_Conversion
Partial ordering of function templates for a call to a conversion function.
Definition Template.h:316
@ TPOC_Other
Partial ordering of function templates in other contexts, e.g., taking the address of a function temp...
Definition Template.h:321
@ TPOC_Call
Partial ordering of function templates for a function call.
Definition Template.h:312
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Definition DeclBase.h:1307
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
TemplateDeductionResult
Describes the result of template argument deduction.
Definition Sema.h:374
@ MiscellaneousDeductionFailure
Deduction failed; that's all we know.
Definition Sema.h:424
@ NonDependentConversionFailure
Checking non-dependent argument conversions failed.
Definition Sema.h:419
@ ConstraintsNotSatisfied
The deduced arguments did not satisfy the constraints associated with the template.
Definition Sema.h:422
@ Underqualified
Template argument deduction failed due to inconsistent cv-qualifiers on a template parameter type tha...
Definition Sema.h:395
@ InstantiationDepth
Template argument deduction exceeded the maximum template instantiation depth (which has already been...
Definition Sema.h:381
@ InvalidExplicitArguments
The explicitly-specified template arguments were not valid template arguments for the given template.
Definition Sema.h:417
@ CUDATargetMismatch
CUDA Target attributes do not match.
Definition Sema.h:426
@ TooFewArguments
When performing template argument deduction for a function template, there were too few call argument...
Definition Sema.h:414
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
Definition Sema.h:384
@ Invalid
The declaration was invalid; do nothing.
Definition Sema.h:378
@ Success
Template argument deduction was successful.
Definition Sema.h:376
@ SubstitutionFailure
Substitution of the deduced template argument values resulted in an error.
Definition Sema.h:398
@ IncompletePack
Template argument deduction did not deduce a value for every expansion of an expanded template parame...
Definition Sema.h:387
@ DeducedMismatch
After substituting deduced template arguments, a dependent parameter type did not match the correspon...
Definition Sema.h:401
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
Definition Sema.h:390
@ TooManyArguments
When performing template argument deduction for a function template, there were too many call argumen...
Definition Sema.h:411
@ AlreadyDiagnosed
Some error which was already diagnosed.
Definition Sema.h:428
@ DeducedMismatchNested
After substituting deduced template arguments, an element of a dependent parameter type did not match...
Definition Sema.h:405
@ NonDeducedMismatch
A non-depnedent component of the parameter did not match the corresponding component of the argument.
Definition Sema.h:408
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:282
U cast(CodeGen::Address addr)
Definition Address.h:327
@ Noexcept
Condition in a noexcept(bool) specifier.
Definition Sema.h:840
@ PackIndex
Index of a pack indexing expression or specifier.
Definition Sema.h:845
@ None
No keyword precedes the qualified type name.
Definition TypeBase.h:6035
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
@ EST_Uninstantiated
not instantiated yet
@ EST_None
no exception specification
TemplateDeductionFlags
Various flags that control template argument deduction.
@ TDF_None
No template argument deduction flags, which indicates the strictest results for template argument ded...
@ TDF_DerivedClass
Within template argument deduction from a function call, we are matching in a case where we can perfo...
@ TDF_TopLevelParameterTypeList
Whether we are performing template argument deduction for parameters and arguments in a top-level tem...
@ TDF_IgnoreQualifiers
Within template argument deduction from a function call, we are matching in a case where we ignore cv...
@ TDF_ParamWithReferenceType
Within template argument deduction from a function call, we are matching with a parameter type for wh...
@ TDF_SkipNonDependent
Allow non-dependent types to differ, e.g., when performing template argument deduction from a functio...
@ TDF_AllowCompatibleFunctionType
Within template argument deduction from overload resolution per C++ [over.over] allow matching functi...
@ TDF_ArgWithReferenceType
Within template argument deduction for a conversion function, we are matching with an argument type f...
#define true
Definition stdbool.h:25
A pack that we're currently deducing.
SmallVector< DeducedTemplateArgument, 4 > New
DeducedTemplateArgument Saved
DeducedTemplateArgument DeferredDeduction
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5475
Extra information about a function prototype.
Definition TypeBase.h:5501
const ExtParameterInfo * ExtParameterInfos
Definition TypeBase.h:5506
bool StrictPackMatch
Is set to true when, in the context of TTP matching, a pack parameter matches non-pack arguments.
Definition Sema.h:12227
bool MatchingTTP
If true, assume these template arguments are the injected template arguments for a template template ...
Definition Sema.h:12223
bool PartialOrdering
The check is being performed in the context of partial ordering.
Definition Sema.h:12216
SmallVector< TemplateArgument, 4 > SugaredConverted
The checked, converted argument will be added to the end of these vectors.
Definition Sema.h:12213
SmallVector< TemplateArgument, 4 > CanonicalConverted
Definition Sema.h:12213
@ ExplicitTemplateArgumentSubstitution
We are substituting explicit template arguments provided for a function template.
Definition Sema.h:13364
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
Definition Sema.h:13371
A stack object to be created when performing template instantiation.
Definition Sema.h:13537
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
Definition Sema.h:13690
brief A function argument from which we performed template argument
Definition Sema.h:12848
Location information for a TemplateArgument.
TemplateSpecCandidate - This is a generalization of OverloadCandidate which keeps track of template a...
void set(DeclAccessPair Found, Decl *Spec, DeductionFailureInfo Info)