[clang] [Clang] support friend declarations with a dependent nested-name-specifier (PR #191268)

Matheus Izvekov via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 29 09:30:23 PDT 2026


================
@@ -274,6 +276,110 @@ struct AccessTarget : public AccessedEntity {
 
 }
 
+static bool CanDeduceTemplateArguments(Sema &S, TemplateParameterList *TPL,
+                                       TemplateDecl *TD,
+                                       ArrayRef<TemplateArgument> PatternArgs,
+                                       ArrayRef<TemplateArgument> Args,
+                                       SourceLocation Loc) {
+  auto Equal =
+      llvm::equal(PatternArgs, Args,
+                  [](const TemplateArgument &LHS, const TemplateArgument &RHS) {
+                    return LHS.structurallyEquals(RHS);
+                  });
+  if (Equal)
+    return true;
+
+  EnterExpressionEvaluationContext Unevaluated(
+      S, Sema::ExpressionEvaluationContext::Unevaluated);
+  TemplateDeductionInfo Info(Loc);
+  Sema::SFINAETrap Trap(S, Info);
+  LocalInstantiationScope InstantiationScope(S);
+  SmallVector<DeducedTemplateArgument, 4> Deduced(TPL->size());
+  if (S.DeduceTemplateArguments(TPL, PatternArgs, Args, Info, Deduced,
+                                /*NumberOfArgumentsMustMatch=*/false) !=
+      TemplateDeductionResult::Success)
+    return false;
+
+  SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());
+  Sema::InstantiatingTemplate Inst(S, Info.getLocation(), TD, DeducedArgs);
+  if (Inst.isInvalid())
+    return false;
+
+  if (S.FinishTemplateArgumentDeduction(
+          TD, TPL, PatternArgs, Args, Deduced, Info,
+          /*CopyDeducedArgs=*/false) != TemplateDeductionResult::Success)
+    return false;
----------------
mizvekov wrote:

We usually wrap FinishTemplateArgument in a `runWithSufficientStackSpace` widget to avoid crashes with long instantiation stacks.

https://github.com/llvm/llvm-project/pull/191268


More information about the cfe-commits mailing list