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