[llvm-branch-commits] [clang] def143a - [clang] fix getReplacedTemplateParameter for function template specializations (#189559)

Cullen Rhodes via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Sun Apr 12 23:12:08 PDT 2026


Author: Matheus Izvekov
Date: 2026-04-13T06:12:00Z
New Revision: def143a6c624dc9b991ebfdfec5c36a7084171eb

URL: https://github.com/llvm/llvm-project/commit/def143a6c624dc9b991ebfdfec5c36a7084171eb
DIFF: https://github.com/llvm/llvm-project/commit/def143a6c624dc9b991ebfdfec5c36a7084171eb.diff

LOG: [clang] fix getReplacedTemplateParameter for function template specializations (#189559)

(cherry picked from commit 2b439327026d45bf53e59159c8e40fccf87930b6)

Added: 
    clang/test/SemaTemplate/GH188759.cpp

Modified: 
    clang/lib/AST/DeclTemplate.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp
index ed20c720ce06c..4e77a2c4686eb 100644
--- a/clang/lib/AST/DeclTemplate.cpp
+++ b/clang/lib/AST/DeclTemplate.cpp
@@ -1713,10 +1713,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<FunctionDecl>(D)->getTemplateSpecializationInfo()->getTemplate(),
-        Index);
+  case Decl::Kind::Function: {
+    const FunctionTemplateSpecializationInfo *Info =
+        cast<FunctionDecl>(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 <int> struct integer_sequence {};
+  template <int> struct array {};
+  template <int ARRAY_SIZE, array<ARRAY_SIZE> test_apdus> void runBlobs() {
+    []<int... INDEX>(integer_sequence<INDEX...>) { // expected-note {{requested here}}
+      int x{operator0<test_apdus, INDEX>()...};
+      // expected-error at -1 {{use of undeclared identifier 'operator0'}}
+    }(integer_sequence<1>{});
+  }
+  template void runBlobs<2, {}>(); // expected-note {{requested here}}
+} // namespace t1


        


More information about the llvm-branch-commits mailing list