]> granicus.if.org Git - clang/commitdiff
Patch to get around a rewriter bug rewriting storage class
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 4 Mar 2010 21:35:37 +0000 (21:35 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 4 Mar 2010 21:35:37 +0000 (21:35 +0000)
on a block API struct definition.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97754 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Frontend/RewriteObjC.cpp

index a1fed8d58e591ce5142f610a3253c67b11ee0db4..378b4225c53eb37179f315b197c4378904b80292 100644 (file)
@@ -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();