diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2010-01-16 19:36:43 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-01-16 19:36:43 +0000 |
| commit | faf85c0dbe25c2f13a33483f0eece8646d0fc3dc (patch) | |
| tree | 05dcfe8ba66f51884f6bc83d6d4b7d7800f7e86d | |
| parent | 8b27547d6d82c986b504273490559153a8661428 (diff) | |
| download | bcm5719-llvm-faf85c0dbe25c2f13a33483f0eece8646d0fc3dc.tar.gz bcm5719-llvm-faf85c0dbe25c2f13a33483f0eece8646d0fc3dc.zip | |
Fix a rewriting crash and correct rewriting of __block
declaration where its initializer has a type-cast.
llvm-svn: 93650
| -rw-r--r-- | clang/lib/Frontend/RewriteObjC.cpp | 25 | ||||
| -rw-r--r-- | clang/test/Rewriter/rewrite-byref-vars.mm | 11 |
2 files changed, 29 insertions, 7 deletions
diff --git a/clang/lib/Frontend/RewriteObjC.cpp b/clang/lib/Frontend/RewriteObjC.cpp index 44a770a3edf..68c23c708aa 100644 --- a/clang/lib/Frontend/RewriteObjC.cpp +++ b/clang/lib/Frontend/RewriteObjC.cpp @@ -4536,8 +4536,13 @@ void RewriteObjC::RewriteByRefVar(VarDecl *ND) { ByrefType += " " + Name + ";\n"; ByrefType += "};\n"; // Insert this type in global scope. It is needed by helper function. - assert(CurFunctionDef && "RewriteByRefVar - CurFunctionDef is null"); - SourceLocation FunLocStart = CurFunctionDef->getTypeSpecStartLoc(); + SourceLocation FunLocStart; + if (CurFunctionDef) + FunLocStart = CurFunctionDef->getTypeSpecStartLoc(); + else { + assert(CurMethodDef && "RewriteByRefVar - CurMethodDef is null"); + FunLocStart = CurMethodDef->getLocStart(); + } InsertText(FunLocStart, ByrefType.c_str(), ByrefType.size()); if (Ty.isObjCGCWeak()) { flag |= BLOCK_FIELD_IS_WEAK; @@ -4587,12 +4592,17 @@ void RewriteObjC::RewriteByRefVar(VarDecl *ND) { ByrefType.c_str(), ByrefType.size()); } else { - SourceLocation startLoc = ND->getInit()->getLocStart(); + SourceLocation startLoc; + Expr *E = ND->getInit(); + if (const CStyleCastExpr *ECE = dyn_cast<CStyleCastExpr>(E)) + startLoc = ECE->getLParenLoc(); + else + startLoc = E->getLocStart(); startLoc = SM->getInstantiationLoc(startLoc); + endBuf = SM->getCharacterData(startLoc); + ByrefType += " " + Name; - ReplaceText(DeclLoc, endBuf-startBuf, - ByrefType.c_str(), ByrefType.size()); - ByrefType = " = {(void*)"; + ByrefType += " = {(void*)"; ByrefType += utostr(isa); ByrefType += ", &" + Name + ", "; ByrefType += utostr(flags); @@ -4607,7 +4617,8 @@ void RewriteObjC::RewriteByRefVar(VarDecl *ND) { ByrefType += utostr(flag); ByrefType += ", "; } - InsertText(startLoc, ByrefType.c_str(), ByrefType.size()); + ReplaceText(DeclLoc, endBuf-startBuf, + ByrefType.c_str(), ByrefType.size()); // Complete the newly synthesized compound expression by inserting a right // curly brace before the end of the declaration. diff --git a/clang/test/Rewriter/rewrite-byref-vars.mm b/clang/test/Rewriter/rewrite-byref-vars.mm index 581437b5a5d..1489c594729 100644 --- a/clang/test/Rewriter/rewrite-byref-vars.mm +++ b/clang/test/Rewriter/rewrite-byref-vars.mm @@ -31,5 +31,16 @@ __declspec(dllexport) extern "C" __declspec(dllexport) void XXXXBreakTheRewriter } +@interface I +{ + id list; +} +- (void) Meth; +@end + +@implementation I +- (void) Meth { __attribute__((__blocks__(byref))) void ** listp = (void **)list; } +@end + // $CLANG -cc1 -fms-extensions -rewrite-objc -x objective-c++ -fblocks bug.mm // g++ -c -D"__declspec(X)=" bug.cpp |

