Я пишу инструмент лягушки на основе RecursiveASTVisitor , и я столкнулся с довольно любопытным поведением. Рассмотрим этот код:
int main(int argc, char *argv[]){
int test_var_array_aux = 11;
int test_var_array[test_var_array_aux];
return 0;
}
В AST test_var_array
Clang имеет тип VariableArrayType
.
Теперь давайте напишем довольно простой посетитель AST, он будет посещать каждый узел AST типа Expr
и каждый узел типа VariableArrayType
:
class DBGenVisitor
: public RecursiveASTVisitor<DBGenVisitor> {
public:
explicit DBGenVisitor(ASTContext *Context);
bool VisitExpr(Expr *t);
bool VisitVariableArrayType(VariableArrayType *t);
private:
ASTContext *Context;
};
Мы печатаем идентификатор каждого Expr
узла и, когда мы сталкиваемся с VariableArrayType
узлом, мы печатаем идентификатор его SizeExpr (this также является Expr
узлом):
bool DBGenVisitor::VisitExpr(Expr *t) {
uint64_t id = t->getID(*Context);
std::cout << "Visited expr: " << id << "\n";
return true;
}
bool DBGenVisitor::VisitVariableArrayType(VariableArrayType *t) {
uint64_t ast_id = t->getSizeExpr()->getID(*Context);
std::cout << "Size expr: " << ast_id << "\n";
return true;
}
Вот результат:
Visited expr: 675
Size expr: 686
Visited expr: 682
Visited expr: 720
Как вы можете заметить, узел SizeExpr (ID 686) никогда не посещается VisitExpr
.
Это нормально или ошибка?