]> granicus.if.org Git - clang/commitdiff
objc modern translator. Fixes writing of block pointer ivar access.
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 24 Feb 2012 17:35:35 +0000 (17:35 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 24 Feb 2012 17:35:35 +0000 (17:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@151371 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Rewrite/RewriteModernObjC.cpp
test/Rewriter/rewrite-modern-block-ivar-call.mm [new file with mode: 0644]

index 63dfa561d3afb4b946354f197dd6ef2aa05d2450..403ccd9c12d5c5b31ab096b8d66cf4e388bdb37a 100644 (file)
@@ -6469,8 +6469,10 @@ Stmt *RewriteModernObjC::RewriteObjCIvarRefExpr(ObjCIvarRefExpr *IV) {
       ParenExpr *PE = new (Context) ParenExpr(SourceLocation(),
                                               SourceLocation(),
                                               addExpr);
+      QualType IvarT = D->getType();
+      convertBlockPointerToFunctionPointer(IvarT);
+      QualType castT = Context->getPointerType(IvarT);
       
-      QualType castT = Context->getPointerType(D->getType());
       castExpr = NoTypeInfoCStyleCastExpr(Context, 
                                           castT,
                                           CK_BitCast,
diff --git a/test/Rewriter/rewrite-modern-block-ivar-call.mm b/test/Rewriter/rewrite-modern-block-ivar-call.mm
new file mode 100644 (file)
index 0000000..0fe2d54
--- /dev/null
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -E %s -o %t.m
+// RUN: %clang_cc1 -fblocks -rewrite-objc -fms-extensions %t.m -o %t-rw.cpp 
+// RUN: FileCheck --input-file=%t-rw.cpp %s
+// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"Class=void*" -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-rw.cpp
+
+@interface Foo {
+    void (^_block)(void);
+}
+@end
+
+@implementation Foo
+- (void)bar {
+    _block();
+}
+@end
+
+// CHECK: ((void (*)(struct __block_impl *))((struct __block_impl *)(*(void (**)(void))((char *)self + OBJC_IVAR_$_Foo__block)))->FuncPtr)((struct __block_impl *)(*(void (**)(void))((char *)self + OBJC_IVAR_$_Foo__block)));