]> granicus.if.org Git - clang/commitdiff
Move isObjCSelf into Expr.
authorAnna Zaks <ganna@apple.com>
Mon, 1 Oct 2012 20:34:04 +0000 (20:34 +0000)
committerAnna Zaks <ganna@apple.com>
Mon, 1 Oct 2012 20:34:04 +0000 (20:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164966 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Expr.h
lib/AST/Expr.cpp
lib/Sema/ScopeInfo.cpp
lib/StaticAnalyzer/Checkers/IvarInvalidationChecker.cpp

index d97c37aa5965956da02414aa36b0c74a0d07e284..6629e3e60c0bbd981f5a54076a196935867df744 100644 (file)
@@ -392,6 +392,9 @@ public:
   /// property, find the underlying property reference expression.
   const ObjCPropertyRefExpr *getObjCProperty() const;
 
+  /// \brief Check if this expression is the ObjC 'self' implicit parameter.
+  bool isObjCSelfExpr() const;
+
   /// \brief Returns whether this expression refers to a vector element.
   bool refersToVectorElement() const;
 
index 30342585c8eea496707eeb37cab98a250d73cec6..e1198b85c5a504f598c23c72a02141806f62fbc3 100644 (file)
@@ -3002,6 +3002,24 @@ const ObjCPropertyRefExpr *Expr::getObjCProperty() const {
   return cast<ObjCPropertyRefExpr>(E);
 }
 
+bool Expr::isObjCSelfExpr() const {
+  const Expr *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;
+}
+
 FieldDecl *Expr::getBitField() {
   Expr *E = this->IgnoreParens();
 
index bb9420d1e7e71640d542b6f8e0c2091ae4ffc137..7a9d917a025088489d995ade75fa115fae0c51ff 100644 (file)
@@ -41,24 +41,6 @@ static const NamedDecl *getBestPropertyDecl(const ObjCPropertyRefExpr *PropE) {
   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();
@@ -80,7 +62,7 @@ FunctionScopeInfo::WeakObjectProfileTy::getBaseInfo(const Expr *E) {
   case Stmt::ObjCIvarRefExprClass: {
     const ObjCIvarRefExpr *IE = cast<ObjCIvarRefExpr>(E);
     D = IE->getDecl();
-    IsExact = isSelfExpr(IE->getBase());
+    IsExact = IE->getBase()->isObjCSelfExpr();
     break;
   }
   case Stmt::PseudoObjectExprClass: {
@@ -94,7 +76,7 @@ FunctionScopeInfo::WeakObjectProfileTy::getBaseInfo(const Expr *E) {
       if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(DoubleBase))
         DoubleBase = OVE->getSourceExpr();
 
-      IsExact = isSelfExpr(DoubleBase);
+      IsExact = DoubleBase->isObjCSelfExpr();
     }
     break;
   }
index 5f944038242153da4d330233b42e7d6306b5a56b..a88b6368e8235496d2f1d1f004d0b7857d4151fd 100644 (file)
@@ -90,8 +90,6 @@ class IvarInvalidationChecker :
   /// Statement visitor, which walks the method body and flags the ivars
   /// referenced in it (either directly or via property).
   class MethodCrawler : public ConstStmtVisitor<MethodCrawler> {
-    const ObjCMethodDecl *EnclosingMethod;
-
     /// The set of Ivars which need to be invalidated.
     IvarSet &IVars;
 
@@ -138,15 +136,13 @@ class IvarInvalidationChecker :
     void check(const Expr *E);
 
   public:
-    MethodCrawler(const ObjCMethodDecl *InMeth,
-                  IvarSet &InIVars,
+    MethodCrawler(IvarSet &InIVars,
                   bool &InCalledAnotherInvalidationMethod,
                   const MethToIvarMapTy &InPropertySetterToIvarMap,
                   const MethToIvarMapTy &InPropertyGetterToIvarMap,
                   const PropToIvarMapTy &InPropertyToIvarMap,
                   ASTContext &InCtx)
-    : EnclosingMethod(InMeth),
-      IVars(InIVars),
+    : IVars(InIVars),
       CalledAnotherInvalidationMethod(InCalledAnotherInvalidationMethod),
       PropertySetterToIvarMap(InPropertySetterToIvarMap),
       PropertyGetterToIvarMap(InPropertyGetterToIvarMap),
@@ -363,7 +359,7 @@ void IvarInvalidationChecker::checkASTDecl(const ObjCMethodDecl *D,
 
   // Check which ivars have been invalidated in the method body.
   bool CalledAnotherInvalidationMethod = false;
-  MethodCrawler(D, Ivars,
+  MethodCrawler(Ivars,
                 CalledAnotherInvalidationMethod,
                 PropSetterToIvarMap,
                 PropGetterToIvarMap,
@@ -518,12 +514,9 @@ void IvarInvalidationChecker::MethodCrawler::VisitObjCMessageExpr(
 
   // Stop if we are calling '[self invalidate]'.
   if (Receiver && isInvalidationMethod(MD))
-    if (const DeclRefExpr *RD =
-          dyn_cast<DeclRefExpr>(Receiver->IgnoreParenCasts())) {
-      if (RD->getDecl() == EnclosingMethod->getSelfDecl()) {
-        CalledAnotherInvalidationMethod = true;
-        return;
-      }
+    if (Receiver->isObjCSelfExpr()) {
+      CalledAnotherInvalidationMethod = true;
+      return;
     }
 
   // Check if we call a setter and set the property to 'nil'.