Всех приветствую.
Задача такая - найти бинарные операторы и проверить не кастится ли один из операндов signed<->unsigned. Например выражение int res = u + i. Для него AST будет иметь вид:
DeclStmt 0x56320fa43ef0 <line:4:2, col:17>
| `-VarDecl 0x56320fa43dc8 <col:2, col:16> col:6 res 'int' cinit
| `-ImplicitCastExpr 0x56320fa43ed8 <col:12, col:16> 'int' <IntegralCast>
| `-BinaryOperator 0x56320fa43eb8 <col:12, col:16> 'unsigned int' '+'
| |-ImplicitCastExpr 0x56320fa43e70 <col:12> 'unsigned int' <LValueToRValue>
| | `-DeclRefExpr 0x56320fa43e30 <col:12> 'unsigned int' lvalue Var 0x56320fa43cf8 'u' 'unsigned int'
| `-ImplicitCastExpr 0x56320fa43ea0 <col:16> 'unsigned int' <IntegralCast>
| `-ImplicitCastExpr 0x56320fa43e88 <col:16> 'int' <LValueToRValue>
| `-DeclRefExpr 0x56320fa43e50 <col:16> 'int' lvalue Var 0x56320fa43c40 'i' 'int'
Пишу Visitor для парсинг шланговского дерева:
class Visitor
: public RecursiveASTVisitor<Visitor> {
public:
explicit FindNamedClassVisitor(ASTContext *Context)
: Context(Context) {}
bool VisitBinaryOperator(BinaryOperator *bo) {
clang::Expr* lhs = bo->getLHS();
clang::Expr* rhs = bo->getRHS();
auto lt = lhs->getType();
auto rt = rhs->getType();
return true;
}
private:
ASTContext *Context;
};
В lhs/rhs содержатся левая/правая часть выражения, в lt/rt - квалифицированный тип, но уже после каста, т.е. левый и правый тип совпадают (я ищу операции для встроенных типов). Мне нужно взять lhs и rhs и проверить там наличие signed<->unsigned (третья строка снизу в дампе дерева -ImplicitCastExpr 0x56320fa43ea0 col:16 ‘unsigned int’ ).
Проверил все методы у clang::Expr и родственников, ничего не подходит, вроде. Может нужно кастануть Expr в какой-то Layout compatible тип? А может я вовсе не так парсить начал, а надо идти по всем нодам и сохранять интересующие пути.
Запутался немного, как сделать, может кто уже копал шланг.