diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-03-04 21:35:37 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-03-04 21:35:37 +0000 |
commit | 8611eb02e8296bd31ffa31b6eafefd76dd1e299c (patch) | |
tree | 95d7468e4847e1d573a574a5f5b8419a2cba5279 /lib/Frontend | |
parent | da1826102fcadb5d3c5d2d20dfa51f0e77489004 (diff) |
Patch to get around a rewriter bug rewriting storage class
on a block API struct definition.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97754 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend')
-rw-r--r-- | lib/Frontend/RewriteObjC.cpp | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/lib/Frontend/RewriteObjC.cpp b/lib/Frontend/RewriteObjC.cpp index a1fed8d58e..378b4225c5 100644 --- a/lib/Frontend/RewriteObjC.cpp +++ b/lib/Frontend/RewriteObjC.cpp @@ -4266,6 +4266,17 @@ void RewriteObjC::SynthesizeBlockLiterals(SourceLocation FunLocStart, // Insert declaration for the function in which block literal is used. if (CurFunctionDeclToDeclareForBlock && !Blocks.empty()) RewriteBlockLiteralFunctionDecl(CurFunctionDeclToDeclareForBlock); + bool RewriteSC = (GlobalVarDecl && + !Blocks.empty() && + GlobalVarDecl->getStorageClass() == VarDecl::Static && + GlobalVarDecl->getType().getCVRQualifiers()); + if (RewriteSC) { + std::string SC(" void __"); + SC += GlobalVarDecl->getNameAsString(); + SC += "() {}"; + InsertText(FunLocStart, SC); + } + // Insert closures that were part of the function. for (unsigned i = 0, count=0; i < Blocks.size(); i++) { CollectBlockDeclRefInfo(Blocks[i]); @@ -4311,21 +4322,19 @@ void RewriteObjC::SynthesizeBlockLiterals(SourceLocation FunLocStart, BlockByCopyDeclsPtrSet.clear(); ImportedBlockDecls.clear(); } - if (GlobalVarDecl && !Blocks.empty()) { + if (RewriteSC) { // Must insert any 'const/volatile/static here. Since it has been // removed as result of rewriting of block literals. - // FIXME. We add as we need. std::string SC; if (GlobalVarDecl->getStorageClass() == VarDecl::Static) SC = "static "; - if (GlobalVarDecl->getStorageClass() == VarDecl::Extern) - SC = "extern "; if (GlobalVarDecl->getType().isConstQualified()) SC += "const "; if (GlobalVarDecl->getType().isVolatileQualified()) SC += "volatile "; - if (!SC.empty()) - InsertText(FunLocStart, SC); + if (GlobalVarDecl->getType().isRestrictQualified()) + SC += "restrict "; + InsertText(FunLocStart, SC); } Blocks.clear(); |