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
546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const NamedDecl *D = nullptr;
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 RoseFunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy(
97a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose                                          const ObjCPropertyRefExpr *PropE)
986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    : Base(nullptr, true), Property(getBestPropertyDecl(PropE)) {
99a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
100a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (PropE->isObjectReceiver()) {
101a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    const OpaqueValueExpr *OVE = cast<OpaqueValueExpr>(PropE->getBase());
102a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    const Expr *E = OVE->getSourceExpr();
103a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    Base = getBaseInfo(E);
104a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  } else if (PropE->isClassReceiver()) {
105a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    Base.setPointer(PropE->getClassReceiver());
106a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  } else {
107a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    assert(PropE->isSuperReceiver());
108a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
109a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose}
110a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
1117fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan RoseFunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy(const Expr *BaseE,
1127fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose                                                const ObjCPropertyDecl *Prop)
1136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    : Base(nullptr, true), Property(Prop) {
1147fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  if (BaseE)
1157fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    Base = getBaseInfo(BaseE);
1167fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  // else, this is a message accessing a property on super.
1177fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose}
1187fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose
119a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseFunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy(
120a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose                                                      const DeclRefExpr *DRE)
1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  : Base(nullptr, true), Property(DRE->getDecl()) {
122a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  assert(isa<VarDecl>(Property));
123a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose}
124a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
125a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseFunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy(
126a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose                                                  const ObjCIvarRefExpr *IvarE)
127a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  : Base(getBaseInfo(IvarE->getBase())), Property(IvarE->getDecl()) {
128a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose}
129a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
1307fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rosevoid FunctionScopeInfo::recordUseOfWeak(const ObjCMessageExpr *Msg,
1317fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose                                        const ObjCPropertyDecl *Prop) {
1327fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  assert(Msg && Prop);
1337fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  WeakUseVector &Uses =
1347fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    WeakObjectUses[WeakObjectProfileTy(Msg->getInstanceReceiver(), Prop)];
1357fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  Uses.push_back(WeakUseTy(Msg, Msg->getNumArgs() == 0));
1367fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose}
1377fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose
138a55d32d1b8f799bf58c02540983976368c42d895Jordan Rosevoid FunctionScopeInfo::markSafeWeakUse(const Expr *E) {
139c88f8ef9d85a537233b4423d31dbf8bc81be525aJordan Rose  E = E->IgnoreParenCasts();
140a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
141a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E)) {
142a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    markSafeWeakUse(POE->getSyntacticForm());
143a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
144a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
145a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
146a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (const ConditionalOperator *Cond = dyn_cast<ConditionalOperator>(E)) {
147a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    markSafeWeakUse(Cond->getTrueExpr());
148a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    markSafeWeakUse(Cond->getFalseExpr());
149a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
150a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
151a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
152a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (const BinaryConditionalOperator *Cond =
153a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose        dyn_cast<BinaryConditionalOperator>(E)) {
154a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    markSafeWeakUse(Cond->getCommon());
155a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    markSafeWeakUse(Cond->getFalseExpr());
156a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
157a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  }
158a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
159a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  // Has this weak object been seen before?
160a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  FunctionScopeInfo::WeakObjectUseMap::iterator Uses;
161ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (const ObjCPropertyRefExpr *RefExpr = dyn_cast<ObjCPropertyRefExpr>(E)) {
162ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (isa<OpaqueValueExpr>(RefExpr->getBase()))
163ef8225444452a1486bd721f3285301fe84643b00Stephen Hines     Uses = WeakObjectUses.find(WeakObjectProfileTy(RefExpr));
164ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    else {
165ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      markSafeWeakUse(RefExpr->getBase());
166ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      return;
167ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
168ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
169a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  else if (const ObjCIvarRefExpr *IvarE = dyn_cast<ObjCIvarRefExpr>(E))
1707fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    Uses = WeakObjectUses.find(WeakObjectProfileTy(IvarE));
171a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
1727fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    Uses = WeakObjectUses.find(WeakObjectProfileTy(DRE));
173f1c1ba089cd8930c1193fcd20fb38cab834a8f94Jordan Rose  else if (const ObjCMessageExpr *MsgE = dyn_cast<ObjCMessageExpr>(E)) {
1747fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    Uses = WeakObjectUses.end();
1757fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    if (const ObjCMethodDecl *MD = MsgE->getMethodDecl()) {
1767fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose      if (const ObjCPropertyDecl *Prop = MD->findPropertyDecl()) {
1777fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose        Uses =
1787fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose          WeakObjectUses.find(WeakObjectProfileTy(MsgE->getInstanceReceiver(),
1797fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose                                                  Prop));
1807fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose      }
1817fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose    }
1827fffce781e6ecbf4058b24df7e5ae3037569aa56Jordan Rose  }
183a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  else
184a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
185a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
186a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (Uses == WeakObjectUses.end())
187a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
188a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
189a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  // Has there been a read from the object using this Expr?
190a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  FunctionScopeInfo::WeakUseVector::reverse_iterator ThisUse =
191a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    std::find(Uses->second.rbegin(), Uses->second.rend(), WeakUseTy(E, true));
192a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  if (ThisUse == Uses->second.rend())
193a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose    return;
194a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
195a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose  ThisUse->markSafe();
196a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose}
197a55d32d1b8f799bf58c02540983976368c42d895Jordan Rose
198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid LambdaScopeInfo::getPotentialVariableCapture(unsigned Idx, VarDecl *&VD,
199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                  Expr *&E) const {
200740265db4f5764782d3486d855bfccfc7d49f194Faisal Vali  assert(Idx < getNumPotentialVariableCaptures() &&
201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         "Index of potential capture must be within 0 to less than the "
202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         "number of captures!");
203c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  E = PotentiallyCapturingExprs[Idx];
204c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E))
205c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    VD = dyn_cast<VarDecl>(DRE->getFoundDecl());
206c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  else if (MemberExpr *ME = dyn_cast<MemberExpr>(E))
207c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    VD = dyn_cast<VarDecl>(ME->getMemberDecl());
208c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  else
209c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    llvm_unreachable("Only DeclRefExprs or MemberExprs should be added for "
210c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali    "potential captures");
211c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali  assert(VD);
212c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali}
213c00e4194296e994efab0e4bf64ca66737850bdf0Faisal Vali
214a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseFunctionScopeInfo::~FunctionScopeInfo() { }
215a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseBlockScopeInfo::~BlockScopeInfo() { }
216a55d32d1b8f799bf58c02540983976368c42d895Jordan RoseLambdaScopeInfo::~LambdaScopeInfo() { }
2176afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. SirajCapturedRegionScopeInfo::~CapturedRegionScopeInfo() { }
218