[cfe-commits] r96798 - in /cfe/trunk: lib/Frontend/RewriteObjC.cpp test/Rewriter/rewrite-rewritten-initializer.mm
Fariborz Jahanian
fjahanian at apple.com
Mon Feb 22 12:48:10 PST 2010
Author: fjahanian
Date: Mon Feb 22 14:48:10 2010
New Revision: 96798
URL: http://llvm.org/viewvc/llvm-project?rev=96798&view=rev
Log:
Fixes a rewriting of byref variable when its initializer is
itself rewritten. Radar 7669784.
Added:
cfe/trunk/test/Rewriter/rewrite-rewritten-initializer.mm
Modified:
cfe/trunk/lib/Frontend/RewriteObjC.cpp
Modified: cfe/trunk/lib/Frontend/RewriteObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/RewriteObjC.cpp?rev=96798&r1=96797&r2=96798&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/RewriteObjC.cpp (original)
+++ cfe/trunk/lib/Frontend/RewriteObjC.cpp Mon Feb 22 14:48:10 2010
@@ -301,8 +301,12 @@
Stmt *RewriteObjCForCollectionStmt(ObjCForCollectionStmt *S,
SourceLocation OrigEnd);
CallExpr *SynthesizeCallToFunctionDecl(FunctionDecl *FD,
- Expr **args, unsigned nargs);
- Stmt *SynthMessageExpr(ObjCMessageExpr *Exp);
+ Expr **args, unsigned nargs,
+ SourceLocation StartLoc=SourceLocation(),
+ SourceLocation EndLoc=SourceLocation());
+ Stmt *SynthMessageExpr(ObjCMessageExpr *Exp,
+ SourceLocation StartLoc=SourceLocation(),
+ SourceLocation EndLoc=SourceLocation());
Stmt *RewriteBreakStmt(BreakStmt *S);
Stmt *RewriteContinueStmt(ContinueStmt *S);
void SynthCountByEnumWithState(std::string &buf);
@@ -1952,7 +1956,8 @@
}
CallExpr *RewriteObjC::SynthesizeCallToFunctionDecl(
- FunctionDecl *FD, Expr **args, unsigned nargs) {
+ FunctionDecl *FD, Expr **args, unsigned nargs, SourceLocation StartLoc,
+ SourceLocation EndLoc) {
// Get the type, we will need to reference it in a couple spots.
QualType msgSendType = FD->getType();
@@ -1968,8 +1973,10 @@
const FunctionType *FT = msgSendType->getAs<FunctionType>();
- return new (Context) CallExpr(*Context, ICE, args, nargs, FT->getResultType(),
- SourceLocation());
+ CallExpr *Exp =
+ new (Context) CallExpr(*Context, ICE, args, nargs, FT->getResultType(),
+ EndLoc);
+ return Exp;
}
static bool scanForProtocolRefs(const char *startBuf, const char *endBuf,
@@ -2533,7 +2540,9 @@
return Context->getTagDeclType(ConstantStringDecl);
}
-Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {
+Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
+ SourceLocation StartLoc,
+ SourceLocation EndLoc) {
if (!SelGetUidFunctionDecl)
SynthSelGetUidFunctionDecl();
if (!MsgSendFunctionDecl)
@@ -2599,7 +2608,9 @@
false, argType, SourceLocation()));
CallExpr *Cls = SynthesizeCallToFunctionDecl(GetMetaClassFunctionDecl,
&ClsExprs[0],
- ClsExprs.size());
+ ClsExprs.size(),
+ StartLoc,
+ EndLoc);
// To turn off a warning, type-cast to 'id'
InitExprs.push_back( // set 'super class', using objc_getClass().
NoTypeInfoCStyleCastExpr(Context,
@@ -2654,7 +2665,8 @@
SourceLocation()));
CallExpr *Cls = SynthesizeCallToFunctionDecl(GetClassFunctionDecl,
&ClsExprs[0],
- ClsExprs.size());
+ ClsExprs.size(),
+ StartLoc, EndLoc);
MsgExprs.push_back(Cls);
}
} else { // instance message.
@@ -2684,7 +2696,8 @@
false, argType, SourceLocation()));
CallExpr *Cls = SynthesizeCallToFunctionDecl(GetClassFunctionDecl,
&ClsExprs[0],
- ClsExprs.size());
+ ClsExprs.size(),
+ StartLoc, EndLoc);
// To turn off a warning, type-cast to 'id'
InitExprs.push_back(
// set 'super class', using objc_getClass().
@@ -2743,7 +2756,9 @@
Exp->getSelector().getAsString().size(),
false, argType, SourceLocation()));
CallExpr *SelExp = SynthesizeCallToFunctionDecl(SelGetUidFunctionDecl,
- &SelExprs[0], SelExprs.size());
+ &SelExprs[0], SelExprs.size(),
+ StartLoc,
+ EndLoc);
MsgExprs.push_back(SelExp);
// Now push any user supplied arguments.
@@ -2830,12 +2845,12 @@
cast);
// Don't forget the parens to enforce the proper binding.
- ParenExpr *PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), cast);
+ ParenExpr *PE = new (Context) ParenExpr(StartLoc, EndLoc, cast);
const FunctionType *FT = msgSendType->getAs<FunctionType>();
CallExpr *CE = new (Context) CallExpr(*Context, PE, &MsgExprs[0],
MsgExprs.size(),
- FT->getResultType(), SourceLocation());
+ FT->getResultType(), EndLoc);
Stmt *ReplacingStmt = CE;
if (MsgSendStretFlavor) {
// We have the method which returns a struct/union. Must also generate
@@ -2898,7 +2913,8 @@
}
Stmt *RewriteObjC::RewriteMessageExpr(ObjCMessageExpr *Exp) {
- Stmt *ReplacingStmt = SynthMessageExpr(Exp);
+ Stmt *ReplacingStmt = SynthMessageExpr(Exp, Exp->getLocStart(),
+ Exp->getLocEnd());
// Now do the actual rewrite.
ReplaceStmt(Exp, ReplacingStmt);
Added: cfe/trunk/test/Rewriter/rewrite-rewritten-initializer.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Rewriter/rewrite-rewritten-initializer.mm?rev=96798&view=auto
==============================================================================
--- cfe/trunk/test/Rewriter/rewrite-rewritten-initializer.mm (added)
+++ cfe/trunk/test/Rewriter/rewrite-rewritten-initializer.mm Mon Feb 22 14:48:10 2010
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp
+// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
+// radar 7669784
+
+typedef void * id;
+void *sel_registerName(const char *);
+
+ at interface NSMutableString
+- (NSMutableString *)string;
+ at end
+
+ at interface Z
+ at end
+
+ at implementation Z
+
+- (void)x {
+ id numbers;
+ int i, numbersCount = 42;
+ __attribute__((__blocks__(byref))) int blockSum = 0;
+ void (^add)(id n, int idx, char *stop) = ^(id n, int idx, char *stop) { };
+ [numbers enumerateObjectsUsingBlock:add];
+ NSMutableString *forwardAppend = [NSMutableString string];
+ __attribute__((__blocks__(byref))) NSMutableString *blockAppend = [NSMutableString string];
+}
+
+ at end
+
More information about the cfe-commits
mailing list