Fix the linkage of static locals inside a CapturedStmt.  (Found in the
process of trying to fix the related issue for block literals.)



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@183951 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp
index 7fdd334..cb15748 100644
--- a/lib/CodeGen/CGDecl.cpp
+++ b/lib/CodeGen/CGDecl.cpp
@@ -129,9 +129,27 @@
     // uniqued.  We can't do this in C, though, because there's no
     // standard way to agree on which variables are the same (i.e.
     // there's no mangling).
-    if (getLangOpts().CPlusPlus)
-      if (llvm::GlobalValue::isWeakForLinker(CurFn->getLinkage()))
-        Linkage = CurFn->getLinkage();
+    if (getLangOpts().CPlusPlus) {
+      const Decl *D = CurCodeDecl;
+      while (true) {
+        if (isa<BlockDecl>(D)) {
+          // FIXME: Handle this case properly!  (Should be similar to the
+          // way we handle lambdas in computeLVForDecl in Decl.cpp.)
+          break;
+        } else if (isa<CapturedDecl>(D)) {
+          D = cast<Decl>(cast<CapturedDecl>(D)->getParent());
+        } else {
+          break;
+        }
+      }
+      // FIXME: Do we really only care about FunctionDecls here?
+      if (D && isa<FunctionDecl>(D)) {
+        llvm::GlobalValue::LinkageTypes ParentLinkage =
+            CGM.getFunctionLinkage(cast<FunctionDecl>(D));
+        if (llvm::GlobalValue::isWeakForLinker(ParentLinkage))
+          Linkage = ParentLinkage;
+      }
+    }
 
     return EmitStaticVarDecl(D, Linkage);
   }