一部の変数宣言を他の宣言に置き換える必要があります。
例えば
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 とは何を意味し、どのように操作するのですか?