From: Fariborz Jahanian Date: Thu, 26 Apr 2012 23:20:25 +0000 (+0000) Subject: modern objective-c transltion: Fixes a translation bug X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=65a7c685b78c18dc158399d2cc688a611d5e2553;p=clang modern objective-c transltion: Fixes a translation bug of writing a __block variable being initialized with a constructed object. // rdar://11326988 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155673 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Rewrite/RewriteModernObjC.cpp b/lib/Rewrite/RewriteModernObjC.cpp index 705a046223..041bd60aa3 100644 --- a/lib/Rewrite/RewriteModernObjC.cpp +++ b/lib/Rewrite/RewriteModernObjC.cpp @@ -4814,8 +4814,13 @@ void RewriteModernObjC::RewriteByRefVar(VarDecl *ND, bool firstDecl, bool hasInit = (ND->getInit() != 0); // FIXME. rewriter does not support __block c++ objects which // require construction. - if (hasInit && dyn_cast(ND->getInit())) - hasInit = false; + if (hasInit) + if (CXXConstructExpr *CExp = dyn_cast(ND->getInit())) { + CXXConstructorDecl *CXXDecl = CExp->getConstructor(); + if (CXXDecl && CXXDecl->isDefaultConstructor()) + hasInit = false; + } + unsigned flags = 0; if (HasCopyAndDispose) flags |= BLOCK_HAS_COPY_DISPOSE; diff --git a/test/Rewriter/rewrite-modern-block.mm b/test/Rewriter/rewrite-modern-block.mm index f446c9c207..675d206c2c 100644 --- a/test/Rewriter/rewrite-modern-block.mm +++ b/test/Rewriter/rewrite-modern-block.mm @@ -46,3 +46,19 @@ int rdar7547630(const char *keybuf, const char *valuebuf) { return BI2; } +// rdar://11326988 +typedef struct _z { + int location; + int length; +} z; + +z w(int loc, int len); + +@interface rdar11326988 +@end +@implementation rdar11326988 +- (void)y:(int)options { + __attribute__((__blocks__(byref))) z firstRange = w(1, 0); + options &= ~(1 | 2); +} +@end