diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2010-11-05 18:34:46 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-11-05 18:34:46 +0000 |
| commit | 90d2e57ff7bc80045074be2488426d77ca3263ee (patch) | |
| tree | 368ae616087e7a99246cf2890fd4e56395cd5061 /clang | |
| parent | a29c14e40d5420a5cfca1bbdcbe45eaebe0d25da (diff) | |
| download | bcm5719-llvm-90d2e57ff7bc80045074be2488426d77ca3263ee.tar.gz bcm5719-llvm-90d2e57ff7bc80045074be2488426d77ca3263ee.zip | |
Proper rewriting of block envokation with
qualified ObjC pointer types in its argument list.
// rdar: //8608902
llvm-svn: 118286
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Rewrite/RewriteObjC.cpp | 14 | ||||
| -rw-r--r-- | clang/test/Rewriter/rewrite-block-pointer.mm | 6 |
2 files changed, 19 insertions, 1 deletions
diff --git a/clang/lib/Rewrite/RewriteObjC.cpp b/clang/lib/Rewrite/RewriteObjC.cpp index 301266f5870..5fff38859cb 100644 --- a/clang/lib/Rewrite/RewriteObjC.cpp +++ b/clang/lib/Rewrite/RewriteObjC.cpp @@ -404,6 +404,16 @@ namespace { return false; } + void convertToUnqualifiedObjCType(QualType &T) { + if (T->isObjCQualifiedIdType()) + T = Context->getObjCIdType(); + else if (T->isObjCQualifiedClassType()) + T = Context->getObjCClassType(); + else if (T->isObjCObjectPointerType() && + T->getPointeeType()->isObjCQualifiedInterfaceType()) + T = Context->getObjCIdType(); + } + // FIXME: This predicate seems like it would be useful to add to ASTContext. bool isObjCType(QualType T) { if (!LangOpts.ObjC1 && !LangOpts.ObjC2) @@ -4685,7 +4695,8 @@ Stmt *RewriteObjC::SynthesizeBlockCall(CallExpr *Exp, const Expr *BlockExp) { E = FTP->arg_type_end(); I && (I != E); ++I) { QualType t = *I; // Make sure we convert "t (^)(...)" to "t (*)(...)". - (void)convertBlockPointerToFunctionPointer(t); + if (!convertBlockPointerToFunctionPointer(t)) + convertToUnqualifiedObjCType(t); ArgTypes.push_back(t); } } @@ -4711,6 +4722,7 @@ Stmt *RewriteObjC::SynthesizeBlockCall(CallExpr *Exp, const Expr *BlockExp) { MemberExpr *ME = new (Context) MemberExpr(PE, true, FD, SourceLocation(), FD->getType()); + CastExpr *FunkCast = NoTypeInfoCStyleCastExpr(Context, PtrToFuncCastType, CK_Unknown, ME); PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), FunkCast); diff --git a/clang/test/Rewriter/rewrite-block-pointer.mm b/clang/test/Rewriter/rewrite-block-pointer.mm index 7a90408ccfc..abb2f136183 100644 --- a/clang/test/Rewriter/rewrite-block-pointer.mm +++ b/clang/test/Rewriter/rewrite-block-pointer.mm @@ -82,3 +82,9 @@ typedef void (^DVDisc)(id<CoreDAVAccountInfoProvider> discoveredInfo, id<CodePro @interface I @end @interface INTF @end void (^BLINT)(I<CoreDAVAccountInfoProvider>* ARG, INTF<CodeProvider, CoreDAVAccountInfoProvider>* ARG1); + +void test8608902() { + BDVDiscoveryCompletionHandler ppp; + ppp(1, 0); +} + |

