[cfe-dev] libclang: traversing initializers in for-range statements

Дмитрий Ермолов epdmitry at yandex.ru
Wed Mar 4 15:15:24 PST 2015


Hi,

I'm trying to use libclang to parse some C++. When I parse source that includes for-range statement like:

  int main() {
      char a[1000];
      for (auto x: a) { // <--- expect to traverse reference to `a` here
      ++x;
      }
  }

I expect to traverse reference to `a` at some point, but it looks like such traversal never happens.

Below is the example my traversal code in Python (actually I write in C++ but situation is similar there) and its output on the sample C++ source.

Am I doing something wrong or such case is not supported by libclang?

Thanks,
Dmitry

 » cat for_range.cpp
int main() {
    char a[1000];
    for (auto x: a) {
        ++x;
    }
}

 » cat traverse.py  
import sys
import clang.cindex
clang.cindex.Config.set_library_path('.')

def traverse(node):
    print node.kind, node.spelling, node.location
    for c in node.get_children():
        traverse(c)

index = clang.cindex.Index.create()
tu = index.parse(sys.argv[1])
traverse(tu.cursor)

 » python traverse.py for_range.cpp
CursorKind.TRANSLATION_UNIT for_range.cpp <SourceLocation file None, line 0, column 0>
CursorKind.TYPEDEF_DECL __int128_t <SourceLocation file None, line 0, column 0>
CursorKind.TYPEDEF_DECL __uint128_t <SourceLocation file None, line 0, column 0>
CursorKind.TYPEDEF_DECL __builtin_va_list <SourceLocation file None, line 0, column 0>
CursorKind.TYPE_REF __va_list_tag <SourceLocation file None, line 0, column 0>
CursorKind.FUNCTION_DECL main <SourceLocation file 'for_range.cpp', line 1, column 5>
CursorKind.COMPOUND_STMT  <SourceLocation file 'for_range.cpp', line 1, column 12>
CursorKind.DECL_STMT  <SourceLocation file 'for_range.cpp', line 2, column 5>
CursorKind.VAR_DECL a <SourceLocation file 'for_range.cpp', line 2, column 10>
CursorKind.INTEGER_LITERAL  <SourceLocation file 'for_range.cpp', line 2, column 12>
CursorKind.CXX_FOR_RANGE_STMT  <SourceLocation file 'for_range.cpp', line 3, column 5>
CursorKind.DECL_STMT  <SourceLocation file 'for_range.cpp', line 3, column 18>
CursorKind.DECL_STMT  <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.BINARY_OPERATOR  <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.UNEXPOSED_EXPR __begin <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.DECL_REF_EXPR __begin <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.UNEXPOSED_EXPR __end <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.DECL_REF_EXPR __end <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.UNARY_OPERATOR  <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.DECL_REF_EXPR __begin <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.DECL_STMT  <SourceLocation file 'for_range.cpp', line 3, column 10>
CursorKind.VAR_DECL x <SourceLocation file 'for_range.cpp', line 3, column 15>
CursorKind.UNEXPOSED_EXPR  <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.UNARY_OPERATOR  <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.UNEXPOSED_EXPR __begin <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.DECL_REF_EXPR __begin <SourceLocation file 'for_range.cpp', line 3, column 16>
CursorKind.COMPOUND_STMT  <SourceLocation file 'for_range.cpp', line 3, column 21>
CursorKind.UNARY_OPERATOR  <SourceLocation file 'for_range.cpp', line 4, column 9>
CursorKind.DECL_REF_EXPR x <SourceLocation file 'for_range.cpp', line 4, column 11>




More information about the cfe-dev mailing list