[cfe-dev] how to get array size from an array decl ?

Stephen Kelly via cfe-dev cfe-dev at lists.llvm.org
Thu Oct 25 01:40:29 PDT 2018


On 19/10/2018 10:04, illiop via cfe-dev wrote:
> Hello,
> if the program is :
> void foo()
> {
>     int a[3] = {0,1,2};
> }
> If I get the ast nodes by the ast matcher:  varDecl(hasType(arrayType()))
> I will get  int a[3] matched, the matched node is a VarDecl type.
> How can I get the array size (in this example is 3) from the VarDecl node ?
> Thank you for any help !
> Anders


Hi Anders,

I recommend reading through

 
https://blogs.msdn.microsoft.com/vcblog/2018/10/23/exploring-clang-tooling-part-2-examining-the-clang-ast-with-clang-query/

which I published yesterday.

It should help you understand some of the issues of discovery when 
creating an AST Matcher tool.

For your case, you would start with a file like


void foo()
{
    int a[3] = {0,1,2};

    int a2[2 + 1] = {0,1,2};

    constexpr int someSize = 2;
    constexpr int otherSize = 1;

    int a3[someSize + otherSize] = {0,1,2};

    int a4[] = {0,1,2};
}


and run clang-query on it.

Run

  clang-query> match varDecl(hasType(type().bind("t")))

to see what varDecls get matched, then switch to detailed-ast mode to 
see the AST:

  clang-query> set output detailed-ast
  clang-query> match varDecl(hasType(type().bind("t")))

Binding for "root":
VarDecl <arraysize.cpp:4:4, col:21> col:8 a 'int [3]'
`-InitListExpr <col:15, col:21> 'int [3]'
   |-IntegerLiteral <col:16> 'int' 0
   |-IntegerLiteral <col:18> 'int' 1
   `-IntegerLiteral <col:20> 'int' 2

Binding for "t":
ConstantArrayType 'int [3]' 3
`-BuiltinType 'int'


So, that way you discover that the type to use in your matcher is 
constantArrayType() instead of arrayType(), and that has the 'hasSize()' 
matcher.

  match varDecl(hasType(constantArrayType(hasSize(3)).bind("t")))

in your `check` method you can use the getSize() accessor:

  http://clang.llvm.org/doxygen/classclang_1_1ConstantArrayType.html

However, you can see in my example that my computations like `1 + 2` 
result in `3` in the type system. To access those expressions, you need 
to know how to access/traverse the TypeLoc system which is a bit less 
obvious, but will become easier soon.

Thanks,

Stephen.



More information about the cfe-dev mailing list