From: Argyrios Kyrtzidis Date: Tue, 15 Nov 2016 20:51:46 +0000 (+0000) Subject: [libclang] Generalize clang_getNumTemplateArguments and clang_getTemplateArgumentAsTy... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=92a8e1a9b41aa414e5c5bde966942057ecd5c9d5;p=clang [libclang] Generalize clang_getNumTemplateArguments and clang_getTemplateArgumentAsType to other kind of specializations. Patch by Emilio Cobos Álvarez! https://reviews.llvm.org/D26663 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@287024 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 8197cf72a8..df6cc6baf7 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -3516,11 +3516,8 @@ enum CXRefQualifierKind { }; /** - * \brief Returns the number of template arguments for given class template - * specialization, or -1 if type \c T is not a class template specialization. - * - * Variadic argument packs count as only one argument, and can not be inspected - * further. + * \brief Returns the number of template arguments for given template + * specialization, or -1 if type \c T is not a template specialization. */ CINDEX_LINKAGE int clang_Type_getNumTemplateArguments(CXType T); diff --git a/test/Index/print-type.cpp b/test/Index/print-type.cpp index 44fc11c365..b17d5189c5 100644 --- a/test/Index/print-type.cpp +++ b/test/Index/print-type.cpp @@ -56,6 +56,11 @@ auto autoBlob = new Blob(); auto autoFunction(){return int();} decltype(auto) autoInt = 5; +template +using TypeAlias = outer::Qux; + +struct TypeAliasUser { TypeAlias foo; }; + // RUN: c-index-test -test-print-type %s -std=c++14 | FileCheck %s // CHECK: Namespace=outer:1:11 (Definition) [type=] [typekind=Invalid] [isPOD=0] // CHECK: ClassTemplate=Foo:4:8 (Definition) [type=] [typekind=Invalid] [isPOD=0] @@ -99,7 +104,7 @@ decltype(auto) autoInt = 5; // CHECK: TemplateRef=Baz:9:8 [type=] [typekind=Invalid] [isPOD=0] // CHECK: IntegerLiteral= [type=int] [typekind=Int] [isPOD=1] // CHECK: TemplateRef=Foo:4:8 [type=] [typekind=Invalid] [isPOD=0] -// CHECK: FieldDecl=qux:28:29 (Definition) [type=Qux >] [typekind=Unexposed] [canonicaltype=outer::Qux >] [canonicaltypekind=Record] [templateargs/1=] [isPOD=1] +// CHECK: FieldDecl=qux:28:29 (Definition) [type=Qux >] [typekind=Unexposed] [canonicaltype=outer::Qux >] [canonicaltypekind=Record] [templateargs/3= [type=int] [typekind=Int] [type=char *] [typekind=Pointer] [type=Foo] [typekind=Unexposed]] [isPOD=1] // CHECK: TemplateRef=Qux:12:8 [type=] [typekind=Invalid] [isPOD=0] // CHECK: TemplateRef=Foo:4:8 [type=] [typekind=Invalid] [isPOD=0] // CHECK: FunctionTemplate=tbar:35:3 [type=T (int)] [typekind=FunctionProto] [canonicaltype=type-parameter-0-0 (int)] [canonicaltypekind=FunctionProto] [resulttype=T] [resulttypekind=Unexposed] [isPOD=0] @@ -148,3 +153,7 @@ decltype(auto) autoInt = 5; // CHECK: UnexposedExpr= [type=int] [typekind=Int] [isPOD=1] // CHECK: VarDecl=autoInt:57:16 (Definition) [type=int] [typekind=Auto] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1] // CHECK: IntegerLiteral= [type=int] [typekind=Int] [isPOD=1] +// CHECK: TypeAliasTemplateDecl=TypeAlias:60:1 (Definition) [type=] [typekind=Invalid] [isPOD=0] +// CHECK: TemplateTypeParameter=T:59:20 (Definition) [type=T] [typekind=Unexposed] [canonicaltype=type-parameter-0-0] [canonicaltypekind=Unexposed] [isPOD=0] +// CHECK: FieldDecl=foo:62:39 (Definition) [type=TypeAlias] [typekind=Unexposed] [canonicaltype=outer::Qux] [canonicaltypekind=Record] [templateargs/1= [type=int] [typekind=Int]] [isPOD=1] +// CHECK: TemplateRef=TypeAlias:60:1 [type=] [typekind=Invalid] [isPOD=0] diff --git a/tools/libclang/CXType.cpp b/tools/libclang/CXType.cpp index 056ce1793d..106fa7ed09 100644 --- a/tools/libclang/CXType.cpp +++ b/tools/libclang/CXType.cpp @@ -925,31 +925,26 @@ int clang_Type_getNumTemplateArguments(CXType CT) { QualType T = GetQualType(CT); if (T.isNull()) return -1; - const CXXRecordDecl *RecordDecl = T->getAsCXXRecordDecl(); - if (!RecordDecl) + const TemplateSpecializationType *Specialization = + T->getAs(); + if (!Specialization) return -1; - const ClassTemplateSpecializationDecl *TemplateDecl = - dyn_cast(RecordDecl); - if (!TemplateDecl) - return -1; - return TemplateDecl->getTemplateArgs().size(); + return Specialization->template_arguments().size(); } CXType clang_Type_getTemplateArgumentAsType(CXType CT, unsigned i) { QualType T = GetQualType(CT); if (T.isNull()) return MakeCXType(QualType(), GetTU(CT)); - const CXXRecordDecl *RecordDecl = T->getAsCXXRecordDecl(); - if (!RecordDecl) - return MakeCXType(QualType(), GetTU(CT)); - const ClassTemplateSpecializationDecl *TemplateDecl = - dyn_cast(RecordDecl); - if (!TemplateDecl) + + const TemplateSpecializationType *Specialization = + T->getAs(); + if (!Specialization) return MakeCXType(QualType(), GetTU(CT)); - const TemplateArgumentList &TA = TemplateDecl->getTemplateArgs(); + auto TA = Specialization->template_arguments(); if (TA.size() <= i) return MakeCXType(QualType(), GetTU(CT)); - const TemplateArgument &A = TA.get(i); + const TemplateArgument &A = TA[i]; if (A.getKind() != TemplateArgument::Type) return MakeCXType(QualType(), GetTU(CT)); return MakeCXType(A.getAsType(), GetTU(CT));