diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-12 17:52:31 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-12 17:52:31 +0000 |
commit | a459c4453d24f336500154a8f9652b49563be52f (patch) | |
tree | e2994e6ce370369c238baafc9a9962ce2297f650 /clang/lib/Frontend/RewriteObjC.cpp | |
parent | 5089c769bb986e21f63a0ec2fb48a03ac946415c (diff) | |
download | bcm5719-llvm-a459c4453d24f336500154a8f9652b49563be52f.tar.gz bcm5719-llvm-a459c4453d24f336500154a8f9652b49563be52f.zip |
Fixes a rewriter bug rewriting function decl.
with block-pointer-type as one or more of its
arguments. Fixes radar 7638400.
llvm-svn: 95992
Diffstat (limited to 'clang/lib/Frontend/RewriteObjC.cpp')
-rw-r--r-- | clang/lib/Frontend/RewriteObjC.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/Frontend/RewriteObjC.cpp b/clang/lib/Frontend/RewriteObjC.cpp index 91b1aaf4c86..ba2d1c28804 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<FunctionType>(); @@ -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 += ", "; } |