From a459c4453d24f336500154a8f9652b49563be52f Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 12 Feb 2010 17:52:31 +0000 Subject: [PATCH] Fixes a rewriter bug rewriting function decl. with block-pointer-type as one or more of its arguments. Fixes radar 7638400. llvm-svn: 95992 --- clang/lib/Frontend/RewriteObjC.cpp | 16 ++++++++++++++-- clang/test/Rewriter/rewrite-block-pointer.mm | 16 ++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 clang/test/Rewriter/rewrite-block-pointer.mm diff --git a/clang/lib/Frontend/RewriteObjC.cpp b/clang/lib/Frontend/RewriteObjC.cpp index 91b1aaf4c86a..ba2d1c288043 100644 --- a/clang/lib/Frontend/RewriteObjC.cpp +++ b/clang/lib/Frontend/RewriteObjC.cpp @@ -2208,6 +2208,19 @@ void RewriteObjC::RewriteFunctionDecl(FunctionDecl *FD) { RewriteObjCQualifiedInterfaceTypes(FD); } +static void RewriteBlockPointerType(std::string& Str, QualType Type) { + std::string TypeString(Type.getAsString()); + const char *argPtr = TypeString.c_str(); + if (!strchr(argPtr, '^')) { + Str += TypeString; + return; + } + while (*argPtr) { + Str += (*argPtr == '^' ? '*' : *argPtr); + argPtr++; + } +} + void RewriteObjC::RewriteBlockLiteralFunctionDecl(FunctionDecl *FD) { SourceLocation FunLocStart = FD->getTypeSpecStartLoc(); const FunctionType *funcType = FD->getType()->getAs(); @@ -2222,8 +2235,7 @@ void RewriteObjC::RewriteBlockLiteralFunctionDecl(FunctionDecl *FD) { unsigned numArgs = proto->getNumArgs(); for (unsigned i = 0; i < numArgs; i++) { QualType ArgType = proto->getArgType(i); - FdStr += ArgType.getAsString(); - + RewriteBlockPointerType(FdStr, ArgType); if (i+1 < numArgs) FdStr += ", "; } diff --git a/clang/test/Rewriter/rewrite-block-pointer.mm b/clang/test/Rewriter/rewrite-block-pointer.mm new file mode 100644 index 000000000000..b03b7a9dec0a --- /dev/null +++ b/clang/test/Rewriter/rewrite-block-pointer.mm @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fblocks -fms-extensions -rewrite-objc %s -o %t-rw.cpp +// RUN: FileCheck -check-prefix LP --input-file=%t-rw.cpp %s +// radar 7638400 + +@interface X +@end + +void foo(void (^block)(int)); + +@implementation X +static void enumerateIt(void (^block)(id, id, char *)) { + foo(^(int idx) { }); +} +@end + +// CHECK-LP: static void enumerateIt(void (*)(id, id, char *));