]> granicus.if.org Git - clang/commitdiff
blocks - capturing logic of byref block variable's expression
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 25 Aug 2011 00:06:26 +0000 (00:06 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 25 Aug 2011 00:06:26 +0000 (00:06 +0000)
statement initializer makes safe assumption when a substatement
is encounterred (with a fix me).

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

lib/CodeGen/CGDecl.cpp

index 0f6ceedb25cd4d1d10ddc1acb33b259bb8e3f2a4..8fcec30c6a990760be2e0a60189d2774c6237d87 100644 (file)
@@ -879,9 +879,25 @@ static bool isCapturedBy(const VarDecl &var, const Expr *e) {
     const CompoundStmt *CS = SE->getSubStmt();
     for (CompoundStmt::const_body_iterator BI = CS->body_begin(),
           BE = CS->body_end(); BI != BE; ++BI)
-      if (Expr *E = dyn_cast<Expr>((*BI)))
+      if (Expr *E = dyn_cast<Expr>((*BI))) {
         if (isCapturedBy(var, E))
             return true;
+      }
+      else if (DeclStmt *DS = dyn_cast<DeclStmt>((*BI))) {
+          // special case declarations
+          for (DeclStmt::decl_iterator I = DS->decl_begin(), E = DS->decl_end();
+               I != E; ++I) {
+              if (VarDecl *VD = dyn_cast<VarDecl>((*I))) {
+                Expr *Init = VD->getInit();
+                if (Init && isCapturedBy(var, Init))
+                  return true;
+              }
+          }
+      }
+      else
+        // FIXME. Make safe assumption assuming arbitrary statements cause capturing.
+        // Later, provide code to poke into statements for capture analysis.
+        return true;
     return false;
   }