Add a new InsertText method that does the check to see if the insertion was valid. This
fixes crashes where the insertion point was in a macro. Instead of crashing, we want
to emit a warning.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46621 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp
index d5df939..f02dd92 100644
--- a/Driver/RewriteTest.cpp
+++ b/Driver/RewriteTest.cpp
@@ -92,17 +92,23 @@
~RewriteTest();
void ReplaceStmt(Stmt *Old, Stmt *New) {
- if (!Rewrite.ReplaceStmt(Old, New))
+ // If replacement succeeded or warning disabled return with no warning.
+ if (!Rewrite.ReplaceStmt(Old, New) || SilenceRewriteMacroWarning)
return;
- // Replacement failed, report a warning unless disabled.
- if (SilenceRewriteMacroWarning) return;
-
SourceRange Range = Old->getSourceRange();
Diags.Report(Context->getFullLoc(Old->getLocStart()), RewriteFailedDiag,
0, 0, &Range, 1);
}
+ void InsertText(SourceLocation Loc, const char *StrData, unsigned StrLen) {
+ // If replacement succeeded or warning disabled return with no warning.
+ if (!Rewrite.InsertText(Loc, StrData, StrLen) ||
+ SilenceRewriteMacroWarning)
+ return;
+
+ Diags.Report(Context->getFullLoc(Loc), RewriteFailedDiag);
+ }
// Syntactic Rewriting.
@@ -277,14 +283,12 @@
"#endif\n";
if (IsHeader) {
// insert the whole string when rewriting a header file
- Rewrite.InsertText(SourceLocation::getFileLoc(MainFileID, 0),
- s, strlen(s));
+ InsertText(SourceLocation::getFileLoc(MainFileID, 0), s, strlen(s));
}
else {
// Not rewriting header, exclude the #pragma once pragma
const char *p = s + strlen("#pragma once\n");
- Rewrite.InsertText(SourceLocation::getFileLoc(MainFileID, 0),
- p, strlen(p));
+ InsertText(SourceLocation::getFileLoc(MainFileID, 0), p, strlen(p));
}
}
@@ -483,10 +487,10 @@
SourceLocation LocEnd = Method->getLocEnd();
if (SM->getLineNumber(LocEnd) > SM->getLineNumber(LocStart)) {
- Rewrite.InsertText(LocStart, "/* ", 3);
+ InsertText(LocStart, "/* ", 3);
Rewrite.ReplaceText(LocEnd, 1, ";*/ ", 4);
} else {
- Rewrite.InsertText(LocStart, "// ", 3);
+ InsertText(LocStart, "// ", 3);
}
}
@@ -648,9 +652,9 @@
ObjCCategoryImplDecl *CID = dyn_cast<ObjCCategoryImplDecl>(OID);
if (IMD)
- Rewrite.InsertText(IMD->getLocStart(), "// ", 3);
+ InsertText(IMD->getLocStart(), "// ", 3);
else
- Rewrite.InsertText(CID->getLocStart(), "// ", 3);
+ InsertText(CID->getLocStart(), "// ", 3);
for (ObjCCategoryImplDecl::instmeth_iterator
I = IMD ? IMD->instmeth_begin() : CID->instmeth_begin(),
@@ -682,9 +686,9 @@
ResultStr.c_str(), ResultStr.size());
}
if (IMD)
- Rewrite.InsertText(IMD->getLocEnd(), "// ", 3);
+ InsertText(IMD->getLocEnd(), "// ", 3);
else
- Rewrite.InsertText(CID->getLocEnd(), "// ", 3);
+ InsertText(CID->getLocEnd(), "// ", 3);
}
void RewriteTest::RewriteInterfaceDecl(ObjCInterfaceDecl *ClassDecl) {
@@ -807,10 +811,11 @@
messString.append(startBuf, endBuf-startBuf+1);
messString += "\n";
- // FIXME: Missing definition of Rewrite.InsertText(clang::SourceLocation, char const*, unsigned int).
- // Rewrite.InsertText(startLoc, messString.c_str(), messString.size());
+ // FIXME: Missing definition of
+ // InsertText(clang::SourceLocation, char const*, unsigned int).
+ // InsertText(startLoc, messString.c_str(), messString.size());
// Tried this, but it didn't work either...
- // Rewrite.ReplaceText(startLoc, 0, messString.c_str(), messString.size());
+ // ReplaceText(startLoc, 0, messString.c_str(), messString.size());
return RewriteMessageExpr(MessExpr);
}
@@ -853,7 +858,7 @@
const std::string &Str = Buf.str();
printf("CAST = %s\n", &Str[0]);
- Rewrite.InsertText(ICE->getSubExpr()->getLocStart(), &Str[0], Str.size());
+ InsertText(ICE->getSubExpr()->getLocStart(), &Str[0], Str.size());
delete S;
return Replacement;
}
@@ -1075,7 +1080,7 @@
buf += "}\n";
// Insert all these *after* the statement body.
SourceLocation endBodyLoc = OrigEnd.getFileLocWithOffset(1);
- Rewrite.InsertText(endBodyLoc, buf.c_str(), buf.size());
+ InsertText(endBodyLoc, buf.c_str(), buf.size());
Stmts.pop_back();
ObjCBcLabelNo.pop_back();
return 0;
@@ -1162,7 +1167,7 @@
buf += " _rethrow = objc_exception_extract(&_stack);\n";
buf += " else { /* @catch continue */";
- Rewrite.InsertText(startLoc, buf.c_str(), buf.size());
+ InsertText(startLoc, buf.c_str(), buf.size());
bool sawIdTypedCatch = false;
Stmt *lastCatchBody = 0;
@@ -1227,7 +1232,7 @@
bodyLoc = bodyLoc.getFileLocWithOffset(1);
buf = " } } /* @catch end */\n";
- Rewrite.InsertText(bodyLoc, buf.c_str(), buf.size());
+ InsertText(bodyLoc, buf.c_str(), buf.size());
// Set lastCurlyLoc
lastCurlyLoc = lastCatchBody->getLocEnd();
@@ -1250,10 +1255,10 @@
startLoc = startLoc.getFileLocWithOffset(1);
buf = " if (!_rethrow) objc_exception_try_exit(&_stack);\n";
- Rewrite.InsertText(startLoc, buf.c_str(), buf.size());
+ InsertText(startLoc, buf.c_str(), buf.size());
endLoc = endLoc.getFileLocWithOffset(-1);
buf = " if (_rethrow) objc_exception_throw(_rethrow);\n";
- Rewrite.InsertText(endLoc, buf.c_str(), buf.size());
+ InsertText(endLoc, buf.c_str(), buf.size());
// Set lastCurlyLoc
lastCurlyLoc = body->getLocEnd();
@@ -1261,7 +1266,7 @@
// Now emit the final closing curly brace...
lastCurlyLoc = lastCurlyLoc.getFileLocWithOffset(1);
buf = " } /* @try scope end */\n";
- Rewrite.InsertText(lastCurlyLoc, buf.c_str(), buf.size());
+ InsertText(lastCurlyLoc, buf.c_str(), buf.size());
return 0;
}
@@ -1427,8 +1432,8 @@
SourceLocation LessLoc = Loc.getFileLocWithOffset(startRef-endBuf);
SourceLocation GreaterLoc = Loc.getFileLocWithOffset(endRef-endBuf+1);
// Comment out the protocol references.
- Rewrite.InsertText(LessLoc, "/*", 2);
- Rewrite.InsertText(GreaterLoc, "*/", 2);
+ InsertText(LessLoc, "/*", 2);
+ InsertText(GreaterLoc, "*/", 2);
}
}
if (!proto)
@@ -1451,8 +1456,8 @@
SourceLocation GreaterLoc =
Loc.getFileLocWithOffset(endRef-startFuncBuf+1);
// Comment out the protocol references.
- Rewrite.InsertText(LessLoc, "/*", 2);
- Rewrite.InsertText(GreaterLoc, "*/", 2);
+ InsertText(LessLoc, "/*", 2);
+ InsertText(GreaterLoc, "*/", 2);
}
startBuf = ++endBuf;
}
@@ -2101,8 +2106,9 @@
Result += ";\n";
// insert the super class structure definition.
- SourceLocation OnePastCurly = LocStart.getFileLocWithOffset(cursor-startBuf+1);
- Rewrite.InsertText(OnePastCurly, Result.c_str(), Result.size());
+ SourceLocation OnePastCurly =
+ LocStart.getFileLocWithOffset(cursor-startBuf+1);
+ InsertText(OnePastCurly, Result.c_str(), Result.size());
}
cursor++; // past '{'
@@ -2119,23 +2125,23 @@
if (!strncmp(cursor, "public", strlen("public")) ||
!strncmp(cursor, "private", strlen("private")) ||
!strncmp(cursor, "protected", strlen("protected")))
- Rewrite.InsertText(atLoc, "// ", 3);
+ InsertText(atLoc, "// ", 3);
}
// FIXME: If there are cases where '<' is used in ivar declaration part
// of user code, then scan the ivar list and use needToScanForQualifiers
// for type checking.
else if (*cursor == '<') {
SourceLocation atLoc = LocStart.getFileLocWithOffset(cursor-startBuf);
- Rewrite.InsertText(atLoc, "/* ", 3);
+ InsertText(atLoc, "/* ", 3);
cursor = strchr(cursor, '>');
cursor++;
atLoc = LocStart.getFileLocWithOffset(cursor-startBuf);
- Rewrite.InsertText(atLoc, " */", 3);
+ InsertText(atLoc, " */", 3);
}
cursor++;
}
// Don't forget to add a ';'!!
- Rewrite.InsertText(LocEnd.getFileLocWithOffset(1), ";", 1);
+ InsertText(LocEnd.getFileLocWithOffset(1), ";", 1);
} else { // we don't have any instance variables - insert super struct.
endBuf += Lexer::MeasureTokenLength(LocEnd, *SM);
Result += " {\n struct ";