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