================
@@ -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();
----------------
fscheidl wrote:
Done
https://github.com/llvm/llvm-project/pull/183504
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits