Changeset View
Changeset View
Standalone View
Standalone View
clang/lib/StaticAnalyzer/Core/MemRegion.cpp
Show First 20 Lines • Show All 836 Lines • ▼ Show 20 Lines | getStackOrCaptureRegionForDeclContext(const LocationContext *LC, | ||||
const DeclContext *DC, | const DeclContext *DC, | ||||
const VarDecl *VD) { | const VarDecl *VD) { | ||||
while (LC) { | while (LC) { | ||||
if (const auto *SFC = dyn_cast<StackFrameContext>(LC)) { | if (const auto *SFC = dyn_cast<StackFrameContext>(LC)) { | ||||
if (cast<DeclContext>(SFC->getDecl()) == DC) | if (cast<DeclContext>(SFC->getDecl()) == DC) | ||||
return SFC; | return SFC; | ||||
} | } | ||||
if (const auto *BC = dyn_cast<BlockInvocationContext>(LC)) { | if (const auto *BC = dyn_cast<BlockInvocationContext>(LC)) { | ||||
const auto *BR = | const auto *BR = static_cast<const BlockDataRegion *>(BC->getData()); | ||||
static_cast<const BlockDataRegion *>(BC->getContextData()); | |||||
// FIXME: This can be made more efficient. | // FIXME: This can be made more efficient. | ||||
for (BlockDataRegion::referenced_vars_iterator | for (BlockDataRegion::referenced_vars_iterator | ||||
I = BR->referenced_vars_begin(), | I = BR->referenced_vars_begin(), | ||||
E = BR->referenced_vars_end(); I != E; ++I) { | E = BR->referenced_vars_end(); I != E; ++I) { | ||||
const VarRegion *VR = I.getOriginalRegion(); | const VarRegion *VR = I.getOriginalRegion(); | ||||
if (VR->getDecl() == VD) | if (VR->getDecl() == VD) | ||||
return cast<VarRegion>(I.getCapturedRegion()); | return cast<VarRegion>(I.getCapturedRegion()); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 784 Lines • Show Last 20 Lines |