diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2011-01-27 23:18:15 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2011-01-27 23:18:15 +0000 |
commit | 1e8011e2fcddc4a638d210ec2dcd21adcf7b1763 (patch) | |
tree | de8d2986ec916f1d635b53c1f286dbf1710dcb5b | |
parent | 1eee5dc0465c0ab4810e21d365e881152d7f53c0 (diff) |
Fix an objective-c rewriter bug rewriting a __block
variable declaration of a struct declared type.
// rdar://8918702
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124451 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Rewrite/RewriteObjC.cpp | 12 | ||||
-rw-r--r-- | test/Rewriter/blockstruct.m | 17 |
2 files changed, 24 insertions, 5 deletions
diff --git a/lib/Rewrite/RewriteObjC.cpp b/lib/Rewrite/RewriteObjC.cpp index 488ee6044e..659fe74154 100644 --- a/lib/Rewrite/RewriteObjC.cpp +++ b/lib/Rewrite/RewriteObjC.cpp @@ -252,7 +252,7 @@ namespace { void RewriteTypeIntoString(QualType T, std::string &ResultStr, const FunctionType *&FPRetType); void RewriteByRefString(std::string &ResultStr, const std::string &Name, - ValueDecl *VD); + ValueDecl *VD, bool def=false); void RewriteCategoryDecl(ObjCCategoryDecl *Dcl); void RewriteProtocolDecl(ObjCProtocolDecl *Dcl); void RewriteForwardProtocolDecl(ObjCForwardProtocolDecl *Dcl); @@ -4118,10 +4118,12 @@ void RewriteObjC::SynthesizeMetaDataIntoBuffer(std::string &Result) { void RewriteObjC::RewriteByRefString(std::string &ResultStr, const std::string &Name, - ValueDecl *VD) { + ValueDecl *VD, bool def) { assert(BlockByRefDeclNo.count(VD) && "RewriteByRefString: ByRef decl missing"); - ResultStr += "struct __Block_byref_" + Name + + if (def) + ResultStr += "struct "; + ResultStr += "__Block_byref_" + Name + "_" + utostr(BlockByRefDeclNo[VD]) ; } @@ -5112,7 +5114,7 @@ void RewriteObjC::RewriteByRefVar(VarDecl *ND) { const char *endBuf = SM->getCharacterData(X); std::string Name(ND->getNameAsString()); std::string ByrefType; - RewriteByRefString(ByrefType, Name, ND); + RewriteByRefString(ByrefType, Name, ND, true); ByrefType += " {\n"; ByrefType += " void *__isa;\n"; RewriteByRefString(ByrefType, Name, ND); @@ -5405,7 +5407,7 @@ Stmt *RewriteObjC::SynthBlockInitExpr(BlockExpr *Exp, ValueDecl *ND = (*I); std::string Name(ND->getNameAsString()); std::string RecName; - RewriteByRefString(RecName, Name, ND); + RewriteByRefString(RecName, Name, ND, true); IdentifierInfo *II = &Context->Idents.get(RecName.c_str() + sizeof("struct")); RecordDecl *RD = RecordDecl::Create(*Context, TTK_Struct, TUDecl, diff --git a/test/Rewriter/blockstruct.m b/test/Rewriter/blockstruct.m new file mode 100644 index 0000000000..977e0d6ce5 --- /dev/null +++ b/test/Rewriter/blockstruct.m @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -x objective-c -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp +// RUN: %clang_cc1 -fsyntax-only -fblocks -Wno-address-of-temporary -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp +// rdar://8918702 + +typedef void (^b_t)(void); +void a(b_t work) { } +struct _s { + int a; +}; +struct _s *r(); + +void f() { + __block struct _s *s = 0; + a(^{ + s = (struct _s *)r(); + }); +} |