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