summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/Expr.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-10-14 16:04:05 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-10-14 16:04:05 +0000
commit681c0754d92a8c2f7f94a7255fb2b517eb2857a1 (patch)
tree130fc7767be2fe30277be3b2389c1a623c073f72 /clang/lib/AST/Expr.cpp
parentb7fd763369f8e10a1d0dcab85351572dea374ace (diff)
downloadbcm5719-llvm-681c0754d92a8c2f7f94a7255fb2b517eb2857a1.tar.gz
bcm5719-llvm-681c0754d92a8c2f7f94a7255fb2b517eb2857a1.zip
Eliminate usage of ObjCSuperExpr used for
'super' as receiver of property or a setter/getter methods. //rdar: //8525788 llvm-svn: 116483
Diffstat (limited to 'clang/lib/AST/Expr.cpp')
-rw-r--r--clang/lib/AST/Expr.cpp30
1 files changed, 21 insertions, 9 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 708512ce461..98f0656ad17 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -2348,23 +2348,35 @@ Stmt::child_iterator ObjCIvarRefExpr::child_begin() { return &Base; }
Stmt::child_iterator ObjCIvarRefExpr::child_end() { return &Base+1; }
// ObjCPropertyRefExpr
-Stmt::child_iterator ObjCPropertyRefExpr::child_begin() { return &Base; }
-Stmt::child_iterator ObjCPropertyRefExpr::child_end() { return &Base+1; }
+Stmt::child_iterator ObjCPropertyRefExpr::child_begin()
+{
+ if (BaseExprOrSuperType.is<Stmt*>()) {
+ // Hack alert!
+ return reinterpret_cast<Stmt**> (&BaseExprOrSuperType);
+ }
+ return child_iterator();
+}
+
+Stmt::child_iterator ObjCPropertyRefExpr::child_end()
+{ return BaseExprOrSuperType.is<Stmt*>() ?
+ reinterpret_cast<Stmt**> (&BaseExprOrSuperType)+1 :
+ child_iterator();
+}
// ObjCImplicitSetterGetterRefExpr
Stmt::child_iterator ObjCImplicitSetterGetterRefExpr::child_begin() {
- // If this is accessing a class member, skip that entry.
- if (Base) return &Base;
- return &Base+1;
+ // If this is accessing a class member or super, skip that entry.
+ // Technically, 2nd condition is sufficient. But I want to be verbose
+ if (isSuperReceiver() || !Base)
+ return child_iterator();
+ return &Base;
}
Stmt::child_iterator ObjCImplicitSetterGetterRefExpr::child_end() {
+ if (isSuperReceiver() || !Base)
+ return child_iterator();
return &Base+1;
}
-// ObjCSuperExpr
-Stmt::child_iterator ObjCSuperExpr::child_begin() { return child_iterator(); }
-Stmt::child_iterator ObjCSuperExpr::child_end() { return child_iterator(); }
-
// ObjCIsaExpr
Stmt::child_iterator ObjCIsaExpr::child_begin() { return &Base; }
Stmt::child_iterator ObjCIsaExpr::child_end() { return &Base+1; }
OpenPOWER on IntegriCloud