================
@@ -1486,41 +1507,64 @@ enum CXGetTemplateArgumentStatus {
 static int clang_Cursor_getTemplateArgument(CXCursor C, unsigned I,
                                             TemplateArgument *TA) {
   CXCursorKind kind = clang_getCursorKind(C);
-  if (kind != CXCursor_FunctionDecl && kind != CXCursor_StructDecl &&
-      kind != CXCursor_ClassDecl &&
-      kind != CXCursor_ClassTemplatePartialSpecialization) {
+  if (kind != CXCursor_FunctionDecl && kind != CXCursor_CXXMethod &&
+      kind != CXCursor_StructDecl && kind != CXCursor_ClassDecl &&
+      kind != CXCursor_ClassTemplatePartialSpecialization &&
+      kind != CXCursor_VarDecl &&
+      kind != CXCursor_VarTemplatePartialSpecialization) {
     return -1;
   }
 
-  if (const auto *FD =
-          llvm::dyn_cast_if_present<clang::FunctionDecl>(getCursorDecl(C))) {
+  const TemplateArgumentList *TAL = nullptr;
+  const Decl *D = getCursorDecl(C);
+
+  if (const auto *FD = dyn_cast_if_present<FunctionDecl>(D)) {
 
     const FunctionTemplateSpecializationInfo *SpecInfo =
         FD->getTemplateSpecializationInfo();
     if (!SpecInfo) {
       return CXGetTemplateArgumentStatus_NullTemplSpecInfo;
     }
 
-    if (I >= SpecInfo->TemplateArguments->size()) {
-      return CXGetTemplateArgumentStatus_InvalidIndex;
-    }
+    TAL = SpecInfo->TemplateArguments;
+  }
 
-    *TA = SpecInfo->TemplateArguments->get(I);
-    return 0;
+  if (!TAL) {
+    if (const auto *SD =
+            dyn_cast_if_present<ClassTemplateSpecializationDecl>(D)) {
+      TAL = &SD->getTemplateArgs();
+    }
   }
 
-  if (const auto *SD =
-          llvm::dyn_cast_if_present<clang::ClassTemplateSpecializationDecl>(
-              getCursorDecl(C))) {
-    if (I >= SD->getTemplateArgs().size()) {
-      return CXGetTemplateArgumentStatus_InvalidIndex;
+  if (!TAL) {
+    if (const auto *VD =
+            dyn_cast_if_present<VarTemplateSpecializationDecl>(D)) {
+      TAL = &VD->getTemplateArgs();
     }
+  }
 
-    *TA = SD->getTemplateArgs()[I];
-    return 0;
+  if (!TAL)
+    return CXGetTemplateArgumentStatus_BadDeclCast;
+
+  unsigned current = 0;
+  for (unsigned i = 0; i < TAL->size(); i++) {
----------------
fscheidl wrote:

Done. Also fixed variable naming in a different loop to match the coding style.

https://github.com/llvm/llvm-project/pull/183504
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to