diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-26 19:55:31 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-26 19:55:31 +0000 |
commit | ce2ea59d2c4f0a75dfc75a8a5241df1727601321 (patch) | |
tree | 40af1e13f9a27da87a9d1c83b33ca56bf9563569 /clang/lib/Frontend/RewriteObjC.cpp | |
parent | 9c56ec86b2566836514a99ba5d778733ec394e6a (diff) | |
download | bcm5719-llvm-ce2ea59d2c4f0a75dfc75a8a5241df1727601321.tar.gz bcm5719-llvm-ce2ea59d2c4f0a75dfc75a8a5241df1727601321.zip |
Fix rewriting of byref variables in nested blocks.
Fixes radar 7692350.
llvm-svn: 97254
Diffstat (limited to 'clang/lib/Frontend/RewriteObjC.cpp')
-rw-r--r-- | clang/lib/Frontend/RewriteObjC.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/clang/lib/Frontend/RewriteObjC.cpp b/clang/lib/Frontend/RewriteObjC.cpp index 26b32478b89..42afe173277 100644 --- a/clang/lib/Frontend/RewriteObjC.cpp +++ b/clang/lib/Frontend/RewriteObjC.cpp @@ -4373,7 +4373,6 @@ void RewriteObjC::GetInnerBlockDeclRefExprs(Stmt *S, // Handle specific things. if (BlockDeclRefExpr *CDRE = dyn_cast<BlockDeclRefExpr>(S)) if (!isa<FunctionDecl>(CDRE->getDecl()) && - !CDRE->isByRef() && !isa<ParmVarDecl>(CDRE->getDecl()) && !InnerBlockValueDecls.count(CDRE->getDecl())) { InnerBlockValueDecls.insert(CDRE->getDecl()); @@ -4982,7 +4981,7 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp, for (unsigned i = 0; i < InnerBlockDeclRefs.size(); i++) { BlockDeclRefExpr *Exp = InnerBlockDeclRefs[i]; ValueDecl *VD = Exp->getDecl(); - if (!BlockByCopyDeclsPtrSet.count(VD)) { + if (!Exp->isByRef() && !BlockByCopyDeclsPtrSet.count(VD)) { // We need to save the copied-in variables in nested // blocks because it is needed at the end for some of the API generations. // See SynthesizeBlockLiterals routine. @@ -4996,6 +4995,14 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp, ImportedBlockDecls.insert(VD); } } + if (Exp->isByRef() && !BlockByRefDeclsPtrSet.count(VD)) { + InnerDeclRefs.push_back(Exp); countOfInnerDecls++; + BlockDeclRefs.push_back(Exp); + BlockByRefDeclsPtrSet.insert(VD); + BlockByRefDecls.push_back(VD); + GetBlockCallExprs(Exp); + ImportedBlockDecls.insert(VD); + } } InnerDeclRefsCount.push_back(countOfInnerDecls); |