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