Почему бы Clang RecursiveASTVisitor не посетить это выражение? - PullRequest
0 голосов
/ 13 марта 2020

Я пишу инструмент лягушки на основе 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 .

Это нормально или ошибка?

...