From 0661a716986c9e0d5e5e5b889fbfd9677ab10bb6 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! llvm-svn: 186967 --- clang/bindings/python/clang/cindex.py | 3 +++ clang/bindings/python/tests/cindex/test_type.py | 12 ++++++++++-- clang/include/clang-c/Index.h | 5 ++++- clang/test/Index/print-type-size.cpp | 2 +- clang/test/Index/print-type.cpp | 9 +++++++++ clang/tools/libclang/CXType.cpp | 24 ++++++++++++++++++++++++ 6 files changed, 51 insertions(+), 4 deletions(-) diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py index 8316b1f..7fe5f7d 100644 --- a/clang/bindings/python/clang/cindex.py +++ b/clang/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/clang/bindings/python/tests/cindex/test_type.py b/clang/bindings/python/tests/cindex/test_type.py index 9bbed5a..ed3d65c 100644 --- a/clang/bindings/python/tests/cindex/test_type.py +++ b/clang/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/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index ce98b06..1adaa48 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/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/clang/test/Index/print-type-size.cpp b/clang/test/Index/print-type-size.cpp index c1684f1..58f2e14 100644 --- a/clang/test/Index/print-type-size.cpp +++ b/clang/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/clang/test/Index/print-type.cpp b/clang/test/Index/print-type.cpp index 49a05fb..5a9a06c 100644 --- a/clang/test/Index/print-type.cpp +++ b/clang/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/clang/tools/libclang/CXType.cpp b/clang/tools/libclang/CXType.cpp index 4b602ef..3ed388f 100644 --- a/clang/tools/libclang/CXType.cpp +++ b/clang/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.7.4