ScopeInfo.cpp revision 651f13cea278ec967336033dd032faef0e9fc2ec
1a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose//===--- ScopeInfo.cpp - Information about a semantic context -------------===//
2a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose//
3a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose//                     The LLVM Compiler Infrastructure
4a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose//
5a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose// This file is distributed under the University of Illinois Open Source
6a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose// License. See LICENSE.TXT for details.
7a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose//
8a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose//===----------------------------------------------------------------------===//
9a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose//
10a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose// This file implements FunctionScopeInfo and its subclasses, which contain
11a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose// information about a single function, block, lambda, or method body.
12a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose//
13a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose//===----------------------------------------------------------------------===//
14a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
15a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose#include "clang/Sema/ScopeInfo.h"
16a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose#include "clang/AST/Decl.h"
17a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose#include "clang/AST/DeclObjC.h"
18a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose#include "clang/AST/Expr.h"
19a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose#include "clang/AST/ExprCXX.h"
20a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose#include "clang/AST/ExprObjC.h"
21a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
22a55d32d1b8f799bf58c02540983976368c42d895Jordan Roseusing namespace clang;
23a55d32d1b8f799bf58c02540983976368c42d895Jordan Roseusing namespace sema;
24a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
25a55d32d1b8f799bf58c02540983976368c42d895Jordan Rosevoid FunctionScopeInfo::Clear() {
26a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  HasBranchProtectedScope = false;
27a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  HasBranchIntoScope = false;
28a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  HasIndirectGoto = false;
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  HasDroppedStmt = false;
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ObjCShouldCallSuper = false;
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ObjCIsDesignatedInit = false;
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ObjCWarnForNoDesignatedInitChain = false;
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ObjCIsSecondaryInit = false;
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ObjCWarnForNoInitDelegation = false;
35a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
36a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  SwitchStack.clear();
37a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  Returns.clear();
38a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  ErrorTrap.reset();
39a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  PossiblyUnreachableDiags.clear();
40a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  WeakObjectUses.clear();
41a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose}
42a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
43a55d32d1b8f799bf58c02540983976368c42d895Jordan Rosestatic const NamedDecl *getBestPropertyDecl(const ObjCPropertyRefExpr *PropE) {
44a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (PropE->isExplicitProperty())
45a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return PropE->getExplicitProperty();
46a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
47a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  return PropE->getImplicitPropertyGetter();
48a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose}
49a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
50a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseFunctionScopeInfo::WeakObjectProfileTy::BaseInfoTy
51a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseFunctionScopeInfo::WeakObjectProfileTy::getBaseInfo(const Expr *E) {
52a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  E = E->IgnoreParenCasts();
53a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
54a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  const NamedDecl *D = 0;
55a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  bool IsExact = false;
56a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
57a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  switch (E->getStmtClass()) {
58a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  case Stmt::DeclRefExprClass:
59a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    D = cast<DeclRefExpr>(E)->getDecl();
60a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    IsExact = isa<VarDecl>(D);
61a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    break;
62a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  case Stmt::MemberExprClass: {
63a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    const MemberExpr *ME = cast<MemberExpr>(E);
64a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    D = ME->getMemberDecl();
65a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    IsExact = isa<CXXThisExpr>(ME->getBase()->IgnoreParenImpCasts());
66a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    break;
67a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
68a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  case Stmt::ObjCIvarRefExprClass: {
69a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    const ObjCIvarRefExpr *IE = cast<ObjCIvarRefExpr>(E);
70a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    D = IE->getDecl();
71bbff82f302a1dd67589f65912351978905f0c5a7Anna Zaks    IsExact = IE->getBase()->isObjCSelfExpr();
72a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    break;
73a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
74a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  case Stmt::PseudoObjectExprClass: {
75a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    const PseudoObjectExpr *POE = cast<PseudoObjectExpr>(E);
76a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    const ObjCPropertyRefExpr *BaseProp =
77a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose      dyn_cast<ObjCPropertyRefExpr>(POE->getSyntacticForm());
78a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    if (BaseProp) {
79a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose      D = getBestPropertyDecl(BaseProp);
80a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
81a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose      const Expr *DoubleBase = BaseProp->getBase();
82a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose      if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(DoubleBase))
83a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose        DoubleBase = OVE->getSourceExpr();
84a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
85bbff82f302a1dd67589f65912351978905f0c5a7Anna Zaks      IsExact = DoubleBase->isObjCSelfExpr();
86a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    }
87a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    break;
88a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
89a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  default:
90a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    break;
91a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
92a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
93a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  return BaseInfoTy(D, IsExact);
94a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose}
95a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
96a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
97a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseFunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy(
98a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose                                          const ObjCPropertyRefExpr *PropE)
99a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    : Base(0, true), Property(getBestPropertyDecl(PropE)) {
100a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
101a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (PropE->isObjectReceiver()) {
102a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    const OpaqueValueExpr *OVE = cast<OpaqueValueExpr>(PropE->getBase());
103a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    const Expr *E = OVE->getSourceExpr();
104a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    Base = getBaseInfo(E);
105a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  } else if (PropE->isClassReceiver()) {
106a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    Base.setPointer(PropE->getClassReceiver());
107a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  } else {
108a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    assert(PropE->isSuperReceiver());
109a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
110a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose}
111a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
1127fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan RoseFunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy(const Expr *BaseE,
1137fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose                                                const ObjCPropertyDecl *Prop)
1147fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    : Base(0, true), Property(Prop) {
1157fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  if (BaseE)
1167fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    Base = getBaseInfo(BaseE);
1177fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  // else, this is a message accessing a property on super.
1187fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose}
1197fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose
120a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseFunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy(
121a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose                                                      const DeclRefExpr *DRE)
122a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  : Base(0, true), Property(DRE->getDecl()) {
123a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  assert(isa<VarDecl>(Property));
124a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose}
125a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
126a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseFunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy(
127a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose                                                  const ObjCIvarRefExpr *IvarE)
128a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  : Base(getBaseInfo(IvarE->getBase())), Property(IvarE->getDecl()) {
129a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose}
130a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
1317fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rosevoid FunctionScopeInfo::recordUseOfWeak(const ObjCMessageExpr *Msg,
1327fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose                                        const ObjCPropertyDecl *Prop) {
1337fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  assert(Msg && Prop);
1347fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  WeakUseVector &Uses =
1357fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    WeakObjectUses[WeakObjectProfileTy(Msg->getInstanceReceiver(), Prop)];
1367fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  Uses.push_back(WeakUseTy(Msg, Msg->getNumArgs() == 0));
1377fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose}
1387fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose
139a55d32d1b8f799bf58c02540983976368c42d895Jordan Rosevoid FunctionScopeInfo::markSafeWeakUse(const Expr *E) {
140c88f8ef9d85a537233b4423d31dbf8bc81be525aJordan Rose  E = E->IgnoreParenCasts();
141a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
142a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E)) {
143a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    markSafeWeakUse(POE->getSyntacticForm());
144a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
145a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
146a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
147a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (const ConditionalOperator *Cond = dyn_cast<ConditionalOperator>(E)) {
148a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    markSafeWeakUse(Cond->getTrueExpr());
149a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    markSafeWeakUse(Cond->getFalseExpr());
150a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
151a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
152a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
153a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (const BinaryConditionalOperator *Cond =
154a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose        dyn_cast<BinaryConditionalOperator>(E)) {
155a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    markSafeWeakUse(Cond->getCommon());
156a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    markSafeWeakUse(Cond->getFalseExpr());
157a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
158a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
159a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
160a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  // Has this weak object been seen before?
161a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  FunctionScopeInfo::WeakObjectUseMap::iterator Uses;
162a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (const ObjCPropertyRefExpr *RefExpr = dyn_cast<ObjCPropertyRefExpr>(E))
1637fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    Uses = WeakObjectUses.find(WeakObjectProfileTy(RefExpr));
164a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  else if (const ObjCIvarRefExpr *IvarE = dyn_cast<ObjCIvarRefExpr>(E))
1657fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    Uses = WeakObjectUses.find(WeakObjectProfileTy(IvarE));
166a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
1677fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    Uses = WeakObjectUses.find(WeakObjectProfileTy(DRE));
168f1c1ba089cd8930c1193fcd20fb38cab834a8f94Jordan Rose  else if (const ObjCMessageExpr *MsgE = dyn_cast<ObjCMessageExpr>(E)) {
1697fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    Uses = WeakObjectUses.end();
1707fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    if (const ObjCMethodDecl *MD = MsgE->getMethodDecl()) {
1717fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose      if (const ObjCPropertyDecl *Prop = MD->findPropertyDecl()) {
1727fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose        Uses =
1737fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose          WeakObjectUses.find(WeakObjectProfileTy(MsgE->getInstanceReceiver(),
1747fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose                                                  Prop));
1757fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose      }
1767fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    }
1777fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  }
178a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  else
179a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
180a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
181a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (Uses == WeakObjectUses.end())
182a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
183a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
184a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  // Has there been a read from the object using this Expr?
185a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  FunctionScopeInfo::WeakUseVector::reverse_iterator ThisUse =
186a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    std::find(Uses->second.rbegin(), Uses->second.rend(), WeakUseTy(E, true));
187a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (ThisUse == Uses->second.rend())
188a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
189a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
190a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  ThisUse->markSafe();
191a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose}
192a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid LambdaScopeInfo::getPotentialVariableCapture(unsigned Idx, VarDecl *&VD,
194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                  Expr *&E) const {
195740265db4f5764782d3486d855bfccfc7d49f194Faisal Vali  assert(Idx < getNumPotentialVariableCaptures() &&
196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         "Index of potential capture must be within 0 to less than the "
197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         "number of captures!");
198c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  E = PotentiallyCapturingExprs[Idx];
199c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
200c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    VD = dyn_cast<VarDecl>(DRE->getFoundDecl());
201c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  else if (MemberExpr *ME = dyn_cast<MemberExpr>(E))
202c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    VD = dyn_cast<VarDecl>(ME->getMemberDecl());
203c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  else
204c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    llvm_unreachable("Only DeclRefExprs or MemberExprs should be added for "
205c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    "potential captures");
206c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  assert(VD);
207c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali}
208c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
209a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseFunctionScopeInfo::~FunctionScopeInfo() { }
210a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseBlockScopeInfo::~BlockScopeInfo() { }
211a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseLambdaScopeInfo::~LambdaScopeInfo() { }
2126afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. SirajCapturedRegionScopeInfo::~CapturedRegionScopeInfo() { }
213