diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-16 16:21:26 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-02-16 16:21:26 +0000 |
commit | e1ff1232147712612826ad85ebad4df300cc55bc (patch) | |
tree | 5ffb0c836d1a840910284afd8bf4590b58f5203c /clang/lib/Frontend/RewriteObjC.cpp | |
parent | 14157939ab9264ae92c667022bb4f24cba3c3bcb (diff) | |
download | bcm5719-llvm-e1ff1232147712612826ad85ebad4df300cc55bc.tar.gz bcm5719-llvm-e1ff1232147712612826ad85ebad4df300cc55bc.zip |
Fix rewriter bug when function call inside block with block parameter
causes C++ compile error (radar 7651312).
llvm-svn: 96352
Diffstat (limited to 'clang/lib/Frontend/RewriteObjC.cpp')
-rw-r--r-- | clang/lib/Frontend/RewriteObjC.cpp | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/clang/lib/Frontend/RewriteObjC.cpp b/clang/lib/Frontend/RewriteObjC.cpp index 9dade66d4ab..bf6d2ac8fab 100644 --- a/clang/lib/Frontend/RewriteObjC.cpp +++ b/clang/lib/Frontend/RewriteObjC.cpp @@ -2196,6 +2196,36 @@ static void RewriteBlockPointerType(std::string& Str, QualType Type) { } } +// FIXME. Consolidate this routine with RewriteBlockPointerType. +static void RewriteBlockPointerTypeVariable(std::string& Str, ValueDecl *VD) { + QualType Type = VD->getType(); + std::string TypeString(Type.getAsString()); + const char *argPtr = TypeString.c_str(); + int paren = 0; + while (*argPtr) { + switch (*argPtr) { + case '(': + Str += *argPtr; + paren++; + break; + case ')': + Str += *argPtr; + paren--; + break; + case '^': + Str += '*'; + if (paren == 1) + Str += VD->getNameAsString(); + break; + default: + Str += *argPtr; + break; + } + argPtr++; + } +} + + void RewriteObjC::RewriteBlockLiteralFunctionDecl(FunctionDecl *FD) { SourceLocation FunLocStart = FD->getTypeSpecStartLoc(); const FunctionType *funcType = FD->getType()->getAs<FunctionType>(); @@ -3899,11 +3929,18 @@ std::string RewriteObjC::SynthesizeBlockFunc(BlockExpr *CE, int i, // myImportedClosure(); // import and invoke the closure // }; // - if (isTopLevelBlockPointerType((*I)->getType())) - S += "struct __block_impl *"; - else + if (isTopLevelBlockPointerType((*I)->getType())) { + RewriteBlockPointerTypeVariable(S, (*I)); + S += " = ("; + RewriteBlockPointerType(S, (*I)->getType()); + S += ")"; + S += "__cself->" + (*I)->getNameAsString() + "; // bound by copy\n"; + } + else { (*I)->getType().getAsStringInternal(Name, Context->PrintingPolicy); - S += Name + " = __cself->" + (*I)->getNameAsString() + "; // bound by copy\n"; + S += Name + " = __cself->" + + (*I)->getNameAsString() + "; // bound by copy\n"; + } } std::string RewrittenStr = RewrittenBlockExprs[CE]; const char *cstr = RewrittenStr.c_str(); |