diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 53040aa0f9074..028afba2de6cd 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -186,6 +186,9 @@ Bug Fixes to C++ Support - Fix for crash when using a erroneous type in a return statement. Fixes (`#63244 `_) and (`#79745 `_) +- Fixed an out-of-bounds error caused by building a recovery expression for ill-formed + function calls while substituting into constraints. + (`#58548 `_) - Fix incorrect code generation caused by the object argument of ``static operator()`` and ``static operator[]`` calls not being evaluated. Fixes (`#67976 `_) diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 940bcccb9e261..6a04d68b4f041 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -7623,7 +7623,8 @@ void Sema::AddTemplateOverloadCandidate( // functions. In such a case, the candidate functions generated from each // function template are combined with the set of non-template candidate // functions. - TemplateDeductionInfo Info(CandidateSet.getLocation()); + TemplateDeductionInfo Info(CandidateSet.getLocation(), + FunctionTemplate->getTemplateDepth()); FunctionDecl *Specialization = nullptr; ConversionSequenceList Conversions; if (TemplateDeductionResult Result = DeduceTemplateArguments( diff --git a/clang/test/SemaTemplate/concepts-recovery-expr.cpp b/clang/test/SemaTemplate/concepts-recovery-expr.cpp index 2f9d432ebac0e..b338f3bc271bf 100644 --- a/clang/test/SemaTemplate/concepts-recovery-expr.cpp +++ b/clang/test/SemaTemplate/concepts-recovery-expr.cpp @@ -180,3 +180,30 @@ void StaticMemOVCUse() { // expected-note@#SMEMOVC3 {{candidate template ignored: constraints not satisfied}} // expected-note@#SMEMOVC3REQ{{because substituted constraint expression is ill-formed: constraint depends on a previously diagnosed expression}} } + +namespace GH58548 { + +template struct formatter; // #primary-template +template struct basic_format_context {}; + +template +concept has_format_function = + format(basic_format_context()); + +template + requires has_format_function +struct formatter { + template + CharType format(basic_format_context); +}; + +template int handle_replacement_field(Ctx arg) { + formatter ctx; // expected-error {{implicit instantiation of undefined template}} + return 0; +} + +int x = handle_replacement_field(0); +// expected-note@-1 {{template specialization 'GH58548::handle_replacement_field' requested here}} +// expected-note@#primary-template {{is declared here}} + +} // GH58548