[cfe-commits] r46600 - in /cfe/trunk: Driver/RewriteTest.cpp test/Sema/rewrite-foreach-6.m
Chris Lattner
sabre at nondot.org
Wed Jan 30 21:10:40 PST 2008
Author: lattner
Date: Wed Jan 30 23:10:40 2008
New Revision: 46600
URL: http://llvm.org/viewvc/llvm-project?rev=46600&view=rev
Log:
Fix a rewriter crash when the whole body of a foreach is itself
rewritten, as in Sema/rewrite-foreach-6.m. Fariborz/Steve,
please review this to see if it is sane.
Added:
cfe/trunk/test/Sema/rewrite-foreach-6.m
Modified:
cfe/trunk/Driver/RewriteTest.cpp
Modified: cfe/trunk/Driver/RewriteTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/RewriteTest.cpp?rev=46600&r1=46599&r2=46600&view=diff
==============================================================================
--- cfe/trunk/Driver/RewriteTest.cpp (original)
+++ cfe/trunk/Driver/RewriteTest.cpp Wed Jan 30 23:10:40 2008
@@ -203,7 +203,8 @@
Stmt *RewriteObjCCatchStmt(ObjCAtCatchStmt *S);
Stmt *RewriteObjCFinallyStmt(ObjCAtFinallyStmt *S);
Stmt *RewriteObjCThrowStmt(ObjCAtThrowStmt *S);
- Stmt *RewriteObjCForCollectionStmt(ObjCForCollectionStmt *S);
+ Stmt *RewriteObjCForCollectionStmt(ObjCForCollectionStmt *S,
+ SourceLocation OrigEnd);
CallExpr *SynthesizeCallToFunctionDecl(FunctionDecl *FD,
Expr **args, unsigned nargs);
Stmt *SynthMessageExpr(ObjCMessageExpr *Exp);
@@ -763,7 +764,9 @@
ObjCBcLabelNo.push_back(++BcLabelCount);
}
- // Otherwise, just rewrite all children.
+ SourceLocation OrigStmtEnd = S->getLocEnd();
+
+ // Start by rewriting all children.
for (Stmt::child_iterator CI = S->child_begin(), E = S->child_end();
CI != E; ++CI)
if (*CI) {
@@ -819,7 +822,7 @@
if (ObjCForCollectionStmt *StmtForCollection =
dyn_cast<ObjCForCollectionStmt>(S))
- return RewriteObjCForCollectionStmt(StmtForCollection);
+ return RewriteObjCForCollectionStmt(StmtForCollection, OrigStmtEnd);
if (BreakStmt *StmtBreakStmt =
dyn_cast<BreakStmt>(S))
return RewriteBreakStmt(StmtBreakStmt);
@@ -939,7 +942,8 @@
/// elem = nil;
/// }
///
-Stmt *RewriteTest::RewriteObjCForCollectionStmt(ObjCForCollectionStmt *S) {
+Stmt *RewriteTest::RewriteObjCForCollectionStmt(ObjCForCollectionStmt *S,
+ SourceLocation OrigEnd) {
assert(!Stmts.empty() && "ObjCForCollectionStmt - Statement stack empty");
assert(isa<ObjCForCollectionStmt>(Stmts.back()) &&
"ObjCForCollectionStmt Statement stack mismatch");
@@ -1064,13 +1068,10 @@
buf += " = nil;\n";
buf += "}\n";
// Insert all these *after* the statement body.
- SourceLocation endBodyLoc = S->getBody()->getLocEnd();
- const char *endBodyBuf = SM->getCharacterData(endBodyLoc)+1;
- endBodyLoc = startLoc.getFileLocWithOffset(endBodyBuf-startBuf);
+ SourceLocation endBodyLoc = OrigEnd.getFileLocWithOffset(1);
Rewrite.InsertText(endBodyLoc, buf.c_str(), buf.size());
Stmts.pop_back();
ObjCBcLabelNo.pop_back();
-
return 0;
}
Added: cfe/trunk/test/Sema/rewrite-foreach-6.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/rewrite-foreach-6.m?rev=46600&view=auto
==============================================================================
--- cfe/trunk/test/Sema/rewrite-foreach-6.m (added)
+++ cfe/trunk/test/Sema/rewrite-foreach-6.m Wed Jan 30 23:10:40 2008
@@ -0,0 +1,13 @@
+// RUN: clang %s -rewrite-test
+// rdar://5716356
+// FIXME: Should be able to pipe into clang, but code is not
+// yet correct for other reasons: rdar://5716940
+
+ at class NSNotification;
+ at class NSMutableArray;
+
+void foo(NSMutableArray *notificationArray, id X) {
+ for (NSNotification *notification in notificationArray)
+ [X postNotification:notification];
+}
+
More information about the cfe-commits
mailing list