diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index 5a8e1ed445f3a..99d02fdc99e92 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -1707,10 +1707,12 @@ clang::getReplacedTemplateParameter(Decl *D, unsigned Index) { case Decl::Kind::CXXConstructor: case Decl::Kind::CXXDestructor: case Decl::Kind::CXXMethod: - case Decl::Kind::Function: - return getReplacedTemplateParameter( - cast(D)->getTemplateSpecializationInfo()->getTemplate(), - Index); + case Decl::Kind::Function: { + const FunctionTemplateSpecializationInfo *Info = + cast(D)->getTemplateSpecializationInfo(); + return {Info->getTemplate()->getTemplateParameters()->getParam(Index), + Info->TemplateArguments->asArray()[Index]}; + } default: llvm_unreachable("Unhandled templated declaration kind"); } diff --git a/clang/test/SemaTemplate/GH188759.cpp b/clang/test/SemaTemplate/GH188759.cpp new file mode 100644 index 0000000000000..f0d579d1fc3e5 --- /dev/null +++ b/clang/test/SemaTemplate/GH188759.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++26 %s + +namespace t1 { + template struct integer_sequence {}; + template struct array {}; + template test_apdus> void runBlobs() { + [](integer_sequence) { // expected-note {{requested here}} + int x{operator0()...}; + // expected-error@-1 {{use of undeclared identifier 'operator0'}} + }(integer_sequence<1>{}); + } + template void runBlobs<2, {}>(); // expected-note {{requested here}} +} // namespace t1