зеркало из https://github.com/microsoft/clang-1.git
Tweak handling of BlockDataRegions in RegionStoreManager::RemoveDeadBindings(): only the VarRegions for variables marked with the '__block' annotation should have their lifetime extended by a BlockDataRegion.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90462 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
7b0ca3fa6f
Коммит
a7a8dfd702
|
@ -1776,14 +1776,16 @@ tryAgain:
|
|||
if (const SymbolicRegion *SymR = dyn_cast<SymbolicRegion>(R))
|
||||
SymReaper.markLive(SymR->getSymbol());
|
||||
|
||||
// For BlockDataRegions, enqueue all VarRegions for that are referenced
|
||||
// For BlockDataRegions, enqueue the VarRegions for variables marked
|
||||
// with __block (passed-by-reference).
|
||||
// via BlockDeclRefExprs.
|
||||
if (const BlockDataRegion *BD = dyn_cast<BlockDataRegion>(R)) {
|
||||
for (BlockDataRegion::referenced_vars_iterator
|
||||
RI = BD->referenced_vars_begin(), RE = BD->referenced_vars_end();
|
||||
RI != RE; ++RI)
|
||||
WorkList.push_back(std::make_pair(state_N, *RI));
|
||||
|
||||
RI != RE; ++RI) {
|
||||
if ((*RI)->getDecl()->getAttr<BlocksAttr>())
|
||||
WorkList.push_back(std::make_pair(state_N, *RI));
|
||||
}
|
||||
// No possible data bindings on a BlockDataRegion. Continue to the
|
||||
// next region in the worklist.
|
||||
continue;
|
||||
|
|
Загрузка…
Ссылка в новой задаче