]> granicus.if.org Git - clang/commitdiff
Add IgnoreParenImpCasts() to Expr, which is basically like IgnoreParenCasts
authorJohn McCall <rjmccall@apple.com>
Wed, 5 May 2010 22:59:52 +0000 (22:59 +0000)
committerJohn McCall <rjmccall@apple.com>
Wed, 5 May 2010 22:59:52 +0000 (22:59 +0000)
except it only skips implicit casts.

Also fix ObjCImplicitGetterSetterRefExpr's child_begin to skip the base expression
if it's actually a type reference (which you get with static property references).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103132 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Expr.h
lib/AST/Expr.cpp

index cf88faf1a0b75156573522896e98ce54d4051762..43e087abc192ce220cbb70a8c5de6439071853fa 100644 (file)
@@ -321,6 +321,10 @@ public:
   /// or CastExprs, returning their operand.
   Expr *IgnoreParenCasts();
 
+  /// IgnoreParenImpCasts - Ignore parentheses and implicit casts.  Strip off any
+  /// ParenExpr or ImplicitCastExprs, returning their operand.
+  Expr *IgnoreParenImpCasts();
+
   /// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the
   /// value (including ptr->int casts of the same size).  Strip off any
   /// ParenExpr or CastExprs, returning their operand.
index 057d542b6d7bfe082aae81ed461e76170ffd6e09..417bc964c824d8de32cd03477d0e0f7fe25458de 100644 (file)
@@ -1557,6 +1557,18 @@ Expr *Expr::IgnoreParenCasts() {
   }
 }
 
+Expr *Expr::IgnoreParenImpCasts() {
+  Expr *E = this;
+  while (true) {
+    if (ParenExpr *P = dyn_cast<ParenExpr>(E))
+      E = P->getSubExpr();
+    else if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E))
+      E = P->getSubExpr();
+    else
+      return E;
+  }
+}
+
 /// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the
 /// value (including ptr->int casts of the same size).  Strip off any
 /// ParenExpr or CastExprs, returning their operand.
@@ -2712,7 +2724,9 @@ Stmt::child_iterator ObjCPropertyRefExpr::child_end() { return &Base+1; }
 
 // ObjCImplicitSetterGetterRefExpr
 Stmt::child_iterator ObjCImplicitSetterGetterRefExpr::child_begin() {
-  return &Base;
+  // If this is accessing a class member, skip that entry.
+  if (Base) return &Base;
+  return &Base+1;
 }
 Stmt::child_iterator ObjCImplicitSetterGetterRefExpr::child_end() {
   return &Base+1;