3

一部の変数宣言を他の宣言に置き換える必要があります。

例えば

int a = 5; 

になる

T<int> a = 5;

より一般的な

X a = _const; 

になる

T<X> a = _const; 

私はclangでASTVisitorの子孫を実装しようとしました:

bool VisitVarDecl(Decl *f) {
    if (VarDecl* VD = dyn_cast_or_null<VarDecl>(f)){
    Expr* init = VD->getInit();

    SourceRange definition = VD->getDefinition()->getSourceRange();
    FullSourceLoc exprLoc = ctx.getFullLoc(init->getLocStart());
    FullSourceLoc vLoc = ctx.getFullLoc(VD->getLocStart());
    ...

variable の定義を次のように置き換えたい:

TheRewriter.ReplaceText(VD->getLocStart(), exprLoc.getSpellingColumnNumber()-vLoc.getSpellingColumnNumber(), someSting);

ただし、 exprLoc.getSpellingColumnNumber() を呼び出すと、セグメンテーション違反が発生します。たとえば、exprLoc.getSpellingColumnNumber() を印刷しようとしています。

llvm::outs()<< "init start at " 
    <<exprLoc.getSpellingColumnNumber(&isValid)
    <<" is "<<(isValid?"valid ":"invalid ")
    <<", decl start at "
    <<vLoc.getSpellingColumnNumber()
    <<".\n";

そして出力は init start at 9 is invalid , decl start at 1. <…> セグメンテーション違反

「無効な」SourceLocation とは何を意味し、どのように操作するのですか?

4

0 に答える 0