From 4c4f6fe2a6d6b3ffd0ce114cb8099366662b67f7 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Tue, 23 Jul 2013 17:36:21 +0000 Subject: [PATCH] [libclang] Expose the rest of the array types. Patch by Che-Liang Chiou! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186967 91177308-0d34-0410-b5e6-96231b3b80d8 --- bindings/python/clang/cindex.py | 3 +++ bindings/python/tests/cindex/test_type.py | 12 ++++++++++-- include/clang-c/Index.h | 5 ++++- test/Index/print-type-size.cpp | 2 +- test/Index/print-type.cpp | 9 +++++++++ tools/libclang/CXType.cpp | 24 +++++++++++++++++++++++ 6 files changed, 51 insertions(+), 4 deletions(-) diff --git a/bindings/python/clang/cindex.py b/bindings/python/clang/cindex.py index 8316b1ff9f..7fe5f7ddab 100644 --- a/bindings/python/clang/cindex.py +++ b/bindings/python/clang/cindex.py @@ -1483,6 +1483,9 @@ TypeKind.FUNCTIONNOPROTO = TypeKind(110) TypeKind.FUNCTIONPROTO = TypeKind(111) TypeKind.CONSTANTARRAY = TypeKind(112) TypeKind.VECTOR = TypeKind(113) +TypeKind.INCOMPLETEARRAY = TypeKind(114) +TypeKind.VARIABLEARRAY = TypeKind(115) +TypeKind.DEPENDENTSIZEDARRAY = TypeKind(116) class Type(Structure): """ diff --git a/bindings/python/tests/cindex/test_type.py b/bindings/python/tests/cindex/test_type.py index 9bbed5aa94..ed3d65c378 100644 --- a/bindings/python/tests/cindex/test_type.py +++ b/bindings/python/tests/cindex/test_type.py @@ -237,12 +237,20 @@ void bar(int a, int b); def test_element_type(): """Ensure Type.element_type works.""" - tu = get_tu('int i[5];') + tu = get_tu('int c[5]; int i[]; int x; int v[x];') + c = get_cursor(tu, 'c') i = get_cursor(tu, 'i') + v = get_cursor(tu, 'v') + assert c is not None assert i is not None + assert v is not None - assert i.type.kind == TypeKind.CONSTANTARRAY + assert c.type.kind == TypeKind.CONSTANTARRAY + assert c.type.element_type.kind == TypeKind.INT + assert i.type.kind == TypeKind.INCOMPLETEARRAY assert i.type.element_type.kind == TypeKind.INT + assert v.type.kind == TypeKind.VARIABLEARRAY + assert v.type.element_type.kind == TypeKind.INT @raises(Exception) def test_invalid_element_type(): diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index ce98b06573..1adaa48615 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -2670,7 +2670,10 @@ enum CXTypeKind { CXType_FunctionNoProto = 110, CXType_FunctionProto = 111, CXType_ConstantArray = 112, - CXType_Vector = 113 + CXType_Vector = 113, + CXType_IncompleteArray = 114, + CXType_VariableArray = 115, + CXType_DependentSizedArray = 116 }; /** diff --git a/test/Index/print-type-size.cpp b/test/Index/print-type-size.cpp index c1684f12ce..58f2e14c33 100644 --- a/test/Index/print-type-size.cpp +++ b/test/Index/print-type-size.cpp @@ -367,7 +367,7 @@ struct BaseStruct namespace NotConstantSize { void f(int i) { -// CHECK32: VarDecl=v2:[[@LINE+1]]:8 (Definition) [type=int [i]] [typekind=Unexposed] [sizeof=-4] [alignof=4] +// CHECK32: VarDecl=v2:[[@LINE+1]]:8 (Definition) [type=int [i]] [typekind=VariableArray] [sizeof=-4] [alignof=4] int v2[i]; { struct CS1 { diff --git a/test/Index/print-type.cpp b/test/Index/print-type.cpp index 49a05fbbdb..5a9a06cfe5 100644 --- a/test/Index/print-type.cpp +++ b/test/Index/print-type.cpp @@ -29,6 +29,11 @@ T tbar(int); template T tbar(int[5]); +template +T tbar(int[size]); + +void foo(int i, int incomplete_array[]) { int variable_array[i]; } + // RUN: c-index-test -test-print-type %s | FileCheck %s // CHECK: Namespace=outer:1:11 (Definition) [type=] [typekind=Invalid] [isPOD=0] // CHECK: ClassTemplate=Foo:4:8 (Definition) [type=] [typekind=Invalid] [isPOD=0] @@ -64,3 +69,7 @@ T tbar(int[5]); // CHECK: TemplateTypeParameter=T:26:20 (Definition) [type=T] [typekind=Unexposed] [canonicaltype=type-parameter-0-0] [canonicaltypekind=Unexposed] [isPOD=0] // CHECK: FunctionTemplate=tbar:30:3 [type=T (int *)] [typekind=FunctionProto] [canonicaltype=type-parameter-0-0 (int *)] [canonicaltypekind=FunctionProto] [resulttype=T] [resulttypekind=Unexposed] [isPOD=0] // CHECK: ParmDecl=:30:11 (Definition) [type=int [5]] [typekind=ConstantArray] [isPOD=1] +// CHECK: FunctionTemplate=tbar:33:3 [type=T (int *)] [typekind=FunctionProto] [canonicaltype=type-parameter-0-0 (int *)] [canonicaltypekind=FunctionProto] [resulttype=T] [resulttypekind=Unexposed] [isPOD=0] +// CHECK: ParmDecl=:33:11 (Definition) [type=int [size]] [typekind=DependentSizedArray] [isPOD=0] +// CHECK: ParmDecl=incomplete_array:35:21 (Definition) [type=int []] [typekind=IncompleteArray] [isPOD=1] +// CHECK: VarDecl=variable_array:35:47 (Definition) [type=int [i]] [typekind=VariableArray] [isPOD=1] diff --git a/tools/libclang/CXType.cpp b/tools/libclang/CXType.cpp index 4b602efa8c..3ed388f4a7 100644 --- a/tools/libclang/CXType.cpp +++ b/tools/libclang/CXType.cpp @@ -85,6 +85,9 @@ static CXTypeKind GetTypeKind(QualType T) { TKCASE(FunctionNoProto); TKCASE(FunctionProto); TKCASE(ConstantArray); + TKCASE(IncompleteArray); + TKCASE(VariableArray); + TKCASE(DependentSizedArray); TKCASE(Vector); default: return CXType_Unexposed; @@ -466,6 +469,9 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) { TKIND(FunctionNoProto); TKIND(FunctionProto); TKIND(ConstantArray); + TKIND(IncompleteArray); + TKIND(VariableArray); + TKIND(DependentSizedArray); TKIND(Vector); } #undef TKIND @@ -590,6 +596,15 @@ CXType clang_getElementType(CXType CT) { case Type::ConstantArray: ET = cast (TP)->getElementType(); break; + case Type::IncompleteArray: + ET = cast (TP)->getElementType(); + break; + case Type::VariableArray: + ET = cast (TP)->getElementType(); + break; + case Type::DependentSizedArray: + ET = cast (TP)->getElementType(); + break; case Type::Vector: ET = cast (TP)->getElementType(); break; @@ -633,6 +648,15 @@ CXType clang_getArrayElementType(CXType CT) { case Type::ConstantArray: ET = cast (TP)->getElementType(); break; + case Type::IncompleteArray: + ET = cast (TP)->getElementType(); + break; + case Type::VariableArray: + ET = cast (TP)->getElementType(); + break; + case Type::DependentSizedArray: + ET = cast (TP)->getElementType(); + break; default: break; } -- 2.40.0