diff options
author | Jordan Rose <jordan_rose@apple.com> | 2012-09-28 22:21:39 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2012-09-28 22:21:39 +0000 |
commit | a55d32d1b8f799bf58c02540983976368c42d895 (patch) | |
tree | 44d03bcc9c186ee09eb25d5d1965205696d39e7f /lib/Sema/Sema.cpp | |
parent | 7a2704800943fbb69207e125d28186278712af36 (diff) |
Pull ScopeInfo implementation into its own file.
The infrastructure for -Warc-repeated-use-of-weak got a little too heavy
to leave sitting at the top of Sema.cpp.
No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164856 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/Sema.cpp')
-rw-r--r-- | lib/Sema/Sema.cpp | 159 |
1 files changed, 0 insertions, 159 deletions
diff --git a/lib/Sema/Sema.cpp b/lib/Sema/Sema.cpp index 8555562d0d..9a6cfaa761 100644 --- a/lib/Sema/Sema.cpp +++ b/lib/Sema/Sema.cpp @@ -43,165 +43,6 @@ using namespace clang; using namespace sema; -FunctionScopeInfo::~FunctionScopeInfo() { } - -void FunctionScopeInfo::Clear() { - HasBranchProtectedScope = false; - HasBranchIntoScope = false; - HasIndirectGoto = false; - - SwitchStack.clear(); - Returns.clear(); - ErrorTrap.reset(); - PossiblyUnreachableDiags.clear(); - WeakObjectUses.clear(); -} - -static const NamedDecl *getBestPropertyDecl(const ObjCPropertyRefExpr *PropE) { - if (PropE->isExplicitProperty()) - return PropE->getExplicitProperty(); - - return PropE->getImplicitPropertyGetter(); -} - -static bool isSelfExpr(const Expr *E) { - E = E->IgnoreParenImpCasts(); - - const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E); - if (!DRE) - return false; - - const ImplicitParamDecl *Param = dyn_cast<ImplicitParamDecl>(DRE->getDecl()); - if (!Param) - return false; - - const ObjCMethodDecl *M = dyn_cast<ObjCMethodDecl>(Param->getDeclContext()); - if (!M) - return false; - - return M->getSelfDecl() == Param; -} - -FunctionScopeInfo::WeakObjectProfileTy::BaseInfoTy -FunctionScopeInfo::WeakObjectProfileTy::getBaseInfo(const Expr *E) { - E = E->IgnoreParenCasts(); - - const NamedDecl *D = 0; - bool IsExact = false; - - switch (E->getStmtClass()) { - case Stmt::DeclRefExprClass: - D = cast<DeclRefExpr>(E)->getDecl(); - IsExact = isa<VarDecl>(D); - break; - case Stmt::MemberExprClass: { - const MemberExpr *ME = cast<MemberExpr>(E); - D = ME->getMemberDecl(); - IsExact = isa<CXXThisExpr>(ME->getBase()->IgnoreParenImpCasts()); - break; - } - case Stmt::ObjCIvarRefExprClass: { - const ObjCIvarRefExpr *IE = cast<ObjCIvarRefExpr>(E); - D = IE->getDecl(); - IsExact = isSelfExpr(IE->getBase()); - break; - } - case Stmt::PseudoObjectExprClass: { - const PseudoObjectExpr *POE = cast<PseudoObjectExpr>(E); - const ObjCPropertyRefExpr *BaseProp = - dyn_cast<ObjCPropertyRefExpr>(POE->getSyntacticForm()); - if (BaseProp) { - D = getBestPropertyDecl(BaseProp); - - const Expr *DoubleBase = BaseProp->getBase(); - if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(DoubleBase)) - DoubleBase = OVE->getSourceExpr(); - - IsExact = isSelfExpr(DoubleBase); - } - break; - } - default: - break; - } - - return BaseInfoTy(D, IsExact); -} - - -FunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy( - const ObjCPropertyRefExpr *PropE) - : Base(0, true), Property(getBestPropertyDecl(PropE)) { - - if (PropE->isObjectReceiver()) { - const OpaqueValueExpr *OVE = cast<OpaqueValueExpr>(PropE->getBase()); - const Expr *E = OVE->getSourceExpr(); - Base = getBaseInfo(E); - } else if (PropE->isClassReceiver()) { - Base.setPointer(PropE->getClassReceiver()); - } else { - assert(PropE->isSuperReceiver()); - } -} - -FunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy( - const DeclRefExpr *DRE) - : Base(0, true), Property(DRE->getDecl()) { - assert(isa<VarDecl>(Property)); -} - -FunctionScopeInfo::WeakObjectProfileTy::WeakObjectProfileTy( - const ObjCIvarRefExpr *IvarE) - : Base(getBaseInfo(IvarE->getBase())), Property(IvarE->getDecl()) { -} - -void FunctionScopeInfo::markSafeWeakUse(const Expr *E) { - E = E->IgnoreParenImpCasts(); - - if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E)) { - markSafeWeakUse(POE->getSyntacticForm()); - return; - } - - if (const ConditionalOperator *Cond = dyn_cast<ConditionalOperator>(E)) { - markSafeWeakUse(Cond->getTrueExpr()); - markSafeWeakUse(Cond->getFalseExpr()); - return; - } - - if (const BinaryConditionalOperator *Cond = - dyn_cast<BinaryConditionalOperator>(E)) { - markSafeWeakUse(Cond->getCommon()); - markSafeWeakUse(Cond->getFalseExpr()); - return; - } - - // Has this weak object been seen before? - FunctionScopeInfo::WeakObjectUseMap::iterator Uses; - if (const ObjCPropertyRefExpr *RefExpr = dyn_cast<ObjCPropertyRefExpr>(E)) - Uses = WeakObjectUses.find(FunctionScopeInfo::WeakObjectProfileTy(RefExpr)); - else if (const ObjCIvarRefExpr *IvarE = dyn_cast<ObjCIvarRefExpr>(E)) - Uses = WeakObjectUses.find(FunctionScopeInfo::WeakObjectProfileTy(IvarE)); - else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) - Uses = WeakObjectUses.find(FunctionScopeInfo::WeakObjectProfileTy(DRE)); - else - return; - - if (Uses == WeakObjectUses.end()) - return; - - // Has there been a read from the object using this Expr? - FunctionScopeInfo::WeakUseVector::reverse_iterator ThisUse = - std::find(Uses->second.rbegin(), Uses->second.rend(), WeakUseTy(E, true)); - if (ThisUse == Uses->second.rend()) - return; - - ThisUse->markSafe(); -} - -BlockScopeInfo::~BlockScopeInfo() { } -LambdaScopeInfo::~LambdaScopeInfo() { } - PrintingPolicy Sema::getPrintingPolicy(const ASTContext &Context, const Preprocessor &PP) { PrintingPolicy Policy = Context.getPrintingPolicy(); |