From 5033be1b3a6f1d1c1ab9b2d284267c8f6f531f2e Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 23 Aug 2011 16:47:15 +0000 Subject: [PATCH] checking for __block variable captured by given stmt expression, recursively walk down all substatements of the stmt expression. // rdar://10001085 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138334 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGDecl.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index 6be6fcedd3..d07347963d 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -875,8 +875,15 @@ static bool isCapturedBy(const VarDecl &var, const Expr *e) { return false; } - if (const StmtExpr *SE = dyn_cast(e)) - e = cast(SE->getSubStmt()->body_back()); + if (const StmtExpr *SE = dyn_cast(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((*BI))) + if (isCapturedBy(var, E)) + return true; + return false; + } for (Stmt::const_child_range children = e->children(); children; ++children) if (isCapturedBy(var, cast(*children))) -- 2.40.0