aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-03-04 21:35:37 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-03-04 21:35:37 +0000
commit8611eb02e8296bd31ffa31b6eafefd76dd1e299c (patch)
tree95d7468e4847e1d573a574a5f5b8419a2cba5279 /lib/Frontend
parentda1826102fcadb5d3c5d2d20dfa51f0e77489004 (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.cpp21
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();