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