[cfe-commits] r116483 - in /cfe/trunk: include/clang/AST/ include/clang/Basic/ include/clang/Sema/ include/clang/Serialization/ lib/AST/ lib/Checker/ lib/CodeGen/ lib/Frontend/ lib/Rewrite/ lib/Sema/ lib/Serialization/ tools/libclang/

Fariborz Jahanian fjahanian at apple.com
Thu Oct 14 09:04:06 PDT 2010


Author: fjahanian
Date: Thu Oct 14 11:04:05 2010
New Revision: 116483

URL: http://llvm.org/viewvc/llvm-project?rev=116483&view=rev
Log:
Eliminate usage of ObjCSuperExpr used for
'super' as receiver of property or a setter/getter
methods. //rdar: //8525788


Modified:
    cfe/trunk/include/clang/AST/ExprObjC.h
    cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
    cfe/trunk/include/clang/Basic/StmtNodes.td
    cfe/trunk/include/clang/Sema/Sema.h
    cfe/trunk/include/clang/Serialization/ASTBitCodes.h
    cfe/trunk/lib/AST/Expr.cpp
    cfe/trunk/lib/AST/ExprClassification.cpp
    cfe/trunk/lib/AST/ExprConstant.cpp
    cfe/trunk/lib/AST/StmtDumper.cpp
    cfe/trunk/lib/AST/StmtPrinter.cpp
    cfe/trunk/lib/AST/StmtProfile.cpp
    cfe/trunk/lib/Checker/GRExprEngine.cpp
    cfe/trunk/lib/CodeGen/CGBlocks.cpp
    cfe/trunk/lib/CodeGen/CGExpr.cpp
    cfe/trunk/lib/CodeGen/CGObjC.cpp
    cfe/trunk/lib/CodeGen/CodeGenFunction.h
    cfe/trunk/lib/CodeGen/Mangle.cpp
    cfe/trunk/lib/Frontend/StmtXML.cpp
    cfe/trunk/lib/Rewrite/RewriteObjC.cpp
    cfe/trunk/lib/Sema/SemaExpr.cpp
    cfe/trunk/lib/Sema/SemaExprObjC.cpp
    cfe/trunk/lib/Sema/TreeTransform.h
    cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
    cfe/trunk/lib/Serialization/ASTWriter.cpp
    cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
    cfe/trunk/tools/libclang/CXCursor.cpp

Modified: cfe/trunk/include/clang/AST/ExprObjC.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprObjC.h?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/ExprObjC.h (original)
+++ cfe/trunk/include/clang/AST/ExprObjC.h Thu Oct 14 11:04:05 2010
@@ -229,13 +229,29 @@
 private:
   ObjCPropertyDecl *AsProperty;
   SourceLocation IdLoc;
-  Stmt *Base;
+  
+  /// \brief When the receiver in property access is 'super', this is
+  /// the location of the 'super' keyword.
+  SourceLocation SuperLoc;
+  
+  /// \brief When the receiver in property access is 'super', this is
+  /// the type associated with 'super' keyword. A null type indicates
+  /// that this is not a 'super' receiver.
+  llvm::PointerUnion<Stmt*, Type*> BaseExprOrSuperType;
+  
 public:
   ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t,
                       SourceLocation l, Expr *base)
     : Expr(ObjCPropertyRefExprClass, t, /*TypeDependent=*/false, 
            base->isValueDependent()), 
-      AsProperty(PD), IdLoc(l), Base(base) {
+      AsProperty(PD), IdLoc(l), BaseExprOrSuperType(base) {
+  }
+  
+  ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t,
+                      SourceLocation l, SourceLocation sl, QualType st)
+  : Expr(ObjCPropertyRefExprClass, t, /*TypeDependent=*/false, false), 
+    AsProperty(PD), IdLoc(l), SuperLoc(sl), 
+    BaseExprOrSuperType(st.getTypePtr()) {
   }
 
   explicit ObjCPropertyRefExpr(EmptyShell Empty)
@@ -243,13 +259,27 @@
 
   ObjCPropertyDecl *getProperty() const { return AsProperty; }
 
-  const Expr *getBase() const { return cast<Expr>(Base); }
-  Expr *getBase() { return cast<Expr>(Base); }
+  const Expr *getBase() const { 
+    return cast<Expr>(BaseExprOrSuperType.get<Stmt*>()); 
+  }
+  Expr *getBase() { 
+    return cast<Expr>(BaseExprOrSuperType.get<Stmt*>()); 
+  }
 
   SourceLocation getLocation() const { return IdLoc; }
+  
+  SourceLocation getSuperLocation() const { return SuperLoc; }
+  QualType getSuperType() const { 
+    Type *t = BaseExprOrSuperType.get<Type*>();
+    return QualType(t, 0); 
+  }
+  bool isSuperReceiver() const { return BaseExprOrSuperType.is<Type*>(); }
 
   virtual SourceRange getSourceRange() const {
-    return SourceRange(getBase()->getLocStart(), IdLoc);
+    return SourceRange(
+                  (BaseExprOrSuperType.is<Stmt*>() ? getBase()->getLocStart() 
+                                                   : getSuperLocation()), 
+                  IdLoc);
   }
 
   static bool classof(const Stmt *T) {
@@ -263,8 +293,10 @@
 private:
   friend class ASTStmtReader;
   void setProperty(ObjCPropertyDecl *D) { AsProperty = D; }
-  void setBase(Expr *base) { Base = base; }
+  void setBase(Expr *base) { BaseExprOrSuperType = base; }
   void setLocation(SourceLocation L) { IdLoc = L; }
+  void setSuperLocation(SourceLocation Loc) { SuperLoc = Loc; }
+  void setSuperType(QualType T) { BaseExprOrSuperType = T.getTypePtr(); }
 };
 
 /// ObjCImplicitSetterGetterRefExpr - A dot-syntax expression to access two
@@ -292,10 +324,22 @@
   // FIXME: Swizzle these into a single pointer.
   Stmt *Base;
   ObjCInterfaceDecl *InterfaceDecl;
-  /// Location of the receiver class in the dot syntax notation
+  /// \brief Location of the receiver class in the dot syntax notation
   /// used to call a class method setter/getter.
   SourceLocation ClassLoc;
 
+  /// \brief When the receiver in dot-syntax expression is 'super',
+  /// this is the location of the 'super' keyword.
+  SourceLocation SuperLoc;
+  
+  /// \brief When the receiver in dot-syntax expression is 'super', this is
+  /// the type associated with 'super' keyword.
+  QualType SuperTy;
+  
+  /// \brief When the receiver in dot-syntax expression is 'super', this is
+  /// set to true.
+  bool IsSuper:1;
+  
 public:
   ObjCImplicitSetterGetterRefExpr(ObjCMethodDecl *getter,
                  QualType t,
@@ -305,7 +349,22 @@
            base->isValueDependent()),
       Setter(setter), Getter(getter), MemberLoc(l), Base(base),
       InterfaceDecl(0), ClassLoc(SourceLocation()) {
+      IsSuper = false;
     }
+  
+  ObjCImplicitSetterGetterRefExpr(ObjCMethodDecl *getter,
+                                  QualType t,
+                                  ObjCMethodDecl *setter,
+                                  SourceLocation l,
+                                  SourceLocation sl, 
+                                  QualType st)
+  : Expr(ObjCImplicitSetterGetterRefExprClass, t, /*TypeDependent=*/false, 
+         false),
+  Setter(setter), Getter(getter), MemberLoc(l),
+  InterfaceDecl(0), ClassLoc(SourceLocation()), 
+  SuperLoc(sl), SuperTy(st), IsSuper(true) {
+  }
+  
   ObjCImplicitSetterGetterRefExpr(ObjCMethodDecl *getter,
                  QualType t,
                  ObjCMethodDecl *setter,
@@ -313,6 +372,7 @@
     : Expr(ObjCImplicitSetterGetterRefExprClass, t, false, false),
       Setter(setter), Getter(getter), MemberLoc(l), Base(0), InterfaceDecl(C),
       ClassLoc(CL) {
+        IsSuper = false;
     }
   explicit ObjCImplicitSetterGetterRefExpr(EmptyShell Empty)
            : Expr(ObjCImplicitSetterGetterRefExprClass, Empty){}
@@ -325,6 +385,8 @@
   void setInterfaceDecl(ObjCInterfaceDecl *D) { InterfaceDecl = D; }
 
   virtual SourceRange getSourceRange() const {
+    if (isSuperReceiver())
+      return SourceRange(getSuperLocation(), MemberLoc);
     if (Base)
       return SourceRange(getBase()->getLocStart(), MemberLoc);
     return SourceRange(ClassLoc, MemberLoc);
@@ -337,6 +399,10 @@
   void setLocation(SourceLocation L) { MemberLoc = L; }
   SourceLocation getClassLoc() const { return ClassLoc; }
   void setClassLoc(SourceLocation L) { ClassLoc = L; }
+  
+  SourceLocation getSuperLocation() const { return SuperLoc; }
+  QualType getSuperType() const { return SuperTy; }
+  bool isSuperReceiver() const { return IsSuper; }
 
   static bool classof(const Stmt *T) {
     return T->getStmtClass() == ObjCImplicitSetterGetterRefExprClass;
@@ -346,6 +412,12 @@
   // Iterators
   virtual child_iterator child_begin();
   virtual child_iterator child_end();
+  
+private:
+  friend class ASTStmtReader;
+  void setSuperLocation(SourceLocation Loc) { SuperLoc = Loc; }
+  void setSuperType(QualType T) { SuperTy = T; }
+  void setSuperReceiver(bool bv) { IsSuper = bv; }
 };
 
 /// \brief An expression that sends a message to the given Objective-C
@@ -738,33 +810,6 @@
   const_arg_iterator arg_end() const { return getArgs() + NumArgs; }
 };
 
-/// ObjCSuperExpr - Represents the "super" expression in Objective-C,
-/// which refers to the object on which the current method is executing.
-///
-/// FIXME: This class is intended for removal, once its remaining
-/// clients have been altered to represent "super" internally.
-class ObjCSuperExpr : public Expr {
-  SourceLocation Loc;
-public:
-  ObjCSuperExpr(SourceLocation L, QualType Type)
-    : Expr(ObjCSuperExprClass, Type, false, false), Loc(L) { }
-  explicit ObjCSuperExpr(EmptyShell Empty) : Expr(ObjCSuperExprClass, Empty) {}
-
-  SourceLocation getLoc() const { return Loc; }
-  void setLoc(SourceLocation L) { Loc = L; }
-
-  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
-
-  static bool classof(const Stmt *T) {
-    return T->getStmtClass() == ObjCSuperExprClass;
-  }
-  static bool classof(const ObjCSuperExpr *) { return true; }
-
-  // Iterators
-  virtual child_iterator child_begin();
-  virtual child_iterator child_end();
-};
-
 /// ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
 /// (similiar in spirit to MemberExpr).
 class ObjCIsaExpr : public Expr {

Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
+++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Thu Oct 14 11:04:05 2010
@@ -1835,7 +1835,6 @@
 DEF_TRAVERSE_STMT(ObjCPropertyRefExpr, { })
 DEF_TRAVERSE_STMT(ObjCProtocolExpr, { })
 DEF_TRAVERSE_STMT(ObjCSelectorExpr, { })
-DEF_TRAVERSE_STMT(ObjCSuperExpr, { })
 DEF_TRAVERSE_STMT(ParenExpr, { })
 DEF_TRAVERSE_STMT(ParenListExpr, { })
 DEF_TRAVERSE_STMT(PredefinedExpr, { })

Modified: cfe/trunk/include/clang/Basic/StmtNodes.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/StmtNodes.td?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/StmtNodes.td (original)
+++ cfe/trunk/include/clang/Basic/StmtNodes.td Thu Oct 14 11:04:05 2010
@@ -121,7 +121,6 @@
 def ObjCIvarRefExpr : DStmt<Expr>;
 def ObjCPropertyRefExpr : DStmt<Expr>;
 def ObjCImplicitSetterGetterRefExpr : DStmt<Expr>;
-def ObjCSuperExpr : DStmt<Expr>;
 def ObjCIsaExpr : DStmt<Expr>;
 
 // Clang Extensions.

Modified: cfe/trunk/include/clang/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/include/clang/Sema/Sema.h (original)
+++ cfe/trunk/include/clang/Sema/Sema.h Thu Oct 14 11:04:05 2010
@@ -3786,7 +3786,9 @@
   HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
                             Expr *BaseExpr,
                             DeclarationName MemberName,
-                            SourceLocation MemberLoc);
+                            SourceLocation MemberLoc,
+                            SourceLocation SuperLoc, QualType SuperType,
+                            bool Super);
 
   ExprResult
   ActOnClassPropertyRefExpr(IdentifierInfo &receiverName,

Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
+++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Thu Oct 14 11:04:05 2010
@@ -830,8 +830,6 @@
       EXPR_OBJC_KVC_REF_EXPR,
       /// \brief An ObjCMessageExpr record.
       EXPR_OBJC_MESSAGE_EXPR,
-      /// \brief An ObjCSuperExpr record.
-      EXPR_OBJC_SUPER_EXPR,
       /// \brief An ObjCIsa Expr record.
       EXPR_OBJC_ISA,
 

Modified: cfe/trunk/lib/AST/Expr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Expr.cpp (original)
+++ cfe/trunk/lib/AST/Expr.cpp Thu Oct 14 11:04:05 2010
@@ -2348,23 +2348,35 @@
 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; }

Modified: cfe/trunk/lib/AST/ExprClassification.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprClassification.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprClassification.cpp (original)
+++ cfe/trunk/lib/AST/ExprClassification.cpp Thu Oct 14 11:04:05 2010
@@ -109,7 +109,6 @@
   case Expr::CXXThrowExprClass:
   case Expr::ShuffleVectorExprClass:
   case Expr::IntegerLiteralClass:
-  case Expr::ObjCSuperExprClass:
   case Expr::CharacterLiteralClass:
   case Expr::AddrLabelExprClass:
   case Expr::CXXDeleteExprClass:

Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Thu Oct 14 11:04:05 2010
@@ -2468,7 +2468,6 @@
   case Expr::ObjCIvarRefExprClass:
   case Expr::ObjCPropertyRefExprClass:
   case Expr::ObjCImplicitSetterGetterRefExprClass:
-  case Expr::ObjCSuperExprClass:
   case Expr::ObjCIsaExprClass:
   case Expr::ShuffleVectorExprClass:
   case Expr::BlockExprClass:

Modified: cfe/trunk/lib/AST/StmtDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtDumper.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/AST/StmtDumper.cpp (original)
+++ cfe/trunk/lib/AST/StmtDumper.cpp Thu Oct 14 11:04:05 2010
@@ -159,7 +159,6 @@
     void VisitObjCImplicitSetterGetterRefExpr(
                                           ObjCImplicitSetterGetterRefExpr *Node);
     void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node);
-    void VisitObjCSuperExpr(ObjCSuperExpr *Node);
   };
 }
 
@@ -606,8 +605,11 @@
 
 void StmtDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
   DumpExpr(Node);
-
-  OS << " Kind=PropertyRef Property=\"" << Node->getProperty() << '"';
+  if (Node->isSuperReceiver())
+    OS << " Kind=PropertyRef Property=\"" << Node->getProperty() << '"'
+    << " super";
+  else
+    OS << " Kind=PropertyRef Property=\"" << Node->getProperty() << '"';
 }
 
 void StmtDumper::VisitObjCImplicitSetterGetterRefExpr(
@@ -624,11 +626,8 @@
   else
     OS << "(null)";
   OS << "\"";
-}
-
-void StmtDumper::VisitObjCSuperExpr(ObjCSuperExpr *Node) {
-  DumpExpr(Node);
-  OS << " super";
+  if (Node->isSuperReceiver())
+    OS << " super";
 }
 
 //===----------------------------------------------------------------------===//

Modified: cfe/trunk/lib/AST/StmtPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/AST/StmtPrinter.cpp (original)
+++ cfe/trunk/lib/AST/StmtPrinter.cpp Thu Oct 14 11:04:05 2010
@@ -509,16 +509,21 @@
 }
 
 void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
-  if (Node->getBase()) {
+  if (Node->isSuperReceiver())
+    OS << "super.";
+  else if (Node->getBase()) {
     PrintExpr(Node->getBase());
     OS << ".";
   }
+
   OS << Node->getProperty()->getName();
 }
 
 void StmtPrinter::VisitObjCImplicitSetterGetterRefExpr(
                                         ObjCImplicitSetterGetterRefExpr *Node) {
-  if (Node->getBase()) {
+  if (Node->isSuperReceiver())
+    OS << "super.";
+  else if (Node->getBase()) {
     PrintExpr(Node->getBase());
     OS << ".";
   }
@@ -1298,9 +1303,6 @@
   OS << "]";
 }
 
-void StmtPrinter::VisitObjCSuperExpr(ObjCSuperExpr *) {
-  OS << "super";
-}
 
 void StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
   BlockDecl *BD = Node->getBlockDecl();

Modified: cfe/trunk/lib/AST/StmtProfile.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/AST/StmtProfile.cpp (original)
+++ cfe/trunk/lib/AST/StmtProfile.cpp Thu Oct 14 11:04:05 2010
@@ -863,6 +863,10 @@
 void StmtProfiler::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *S) {
   VisitExpr(S);
   VisitDecl(S->getProperty());
+  if (S->isSuperReceiver()) {
+    ID.AddBoolean(S->isSuperReceiver());
+    VisitType(S->getSuperType());
+  }
 }
 
 void StmtProfiler::VisitObjCImplicitSetterGetterRefExpr(
@@ -871,6 +875,10 @@
   VisitDecl(S->getGetterMethod());
   VisitDecl(S->getSetterMethod());
   VisitDecl(S->getInterfaceDecl());
+  if (S->isSuperReceiver()) {
+    ID.AddBoolean(S->isSuperReceiver());
+    VisitType(S->getSuperType());
+  }
 }
 
 void StmtProfiler::VisitObjCMessageExpr(ObjCMessageExpr *S) {
@@ -879,10 +887,6 @@
   VisitDecl(S->getMethodDecl());
 }
 
-void StmtProfiler::VisitObjCSuperExpr(ObjCSuperExpr *S) {
-  VisitExpr(S);
-}
-
 void StmtProfiler::VisitObjCIsaExpr(ObjCIsaExpr *S) {
   VisitExpr(S);
   ID.AddBoolean(S->isArrow());

Modified: cfe/trunk/lib/Checker/GRExprEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/GRExprEngine.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/Checker/GRExprEngine.cpp (original)
+++ cfe/trunk/lib/Checker/GRExprEngine.cpp Thu Oct 14 11:04:05 2010
@@ -830,7 +830,6 @@
     case Stmt::ObjCProtocolExprClass:
     case Stmt::ObjCSelectorExprClass:
     case Stmt::ObjCStringLiteralClass:
-    case Stmt::ObjCSuperExprClass:
     case Stmt::ParenListExprClass:
     case Stmt::PredefinedExprClass:
     case Stmt::ShuffleVectorExprClass:

Modified: cfe/trunk/lib/CodeGen/CGBlocks.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBlocks.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGBlocks.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGBlocks.cpp Thu Oct 14 11:04:05 2010
@@ -122,12 +122,19 @@
         E->getReceiverKind() == ObjCMessageExpr::SuperInstance)
       Info.NeedsObjCSelf = true;
   }
-
-  // Getter/setter uses may also cause implicit super references,
-  // which we can check for with:
-  else if (isa<ObjCSuperExpr>(S))
-    Info.NeedsObjCSelf = true;
-
+  else if (const ObjCPropertyRefExpr *PE = dyn_cast<ObjCPropertyRefExpr>(S)) {
+    // Getter/setter uses may also cause implicit super references,
+    // which we can check for with:
+    if (PE->isSuperReceiver())
+      Info.NeedsObjCSelf = true;
+  }
+  else if (const ObjCImplicitSetterGetterRefExpr *IE = 
+           dyn_cast<ObjCImplicitSetterGetterRefExpr>(S)) {
+    // Getter/setter uses may also cause implicit super references,
+    // which we can check for with:
+    if (IE->isSuperReceiver())
+      Info.NeedsObjCSelf = true;
+  }
   else if (isa<CXXThisExpr>(S))
     Info.CXXThisRef = cast<CXXThisExpr>(S);
 }

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Thu Oct 14 11:04:05 2010
@@ -552,9 +552,6 @@
     return EmitObjCPropertyRefLValue(cast<ObjCPropertyRefExpr>(E));
   case Expr::ObjCImplicitSetterGetterRefExprClass:
     return EmitObjCKVCRefLValue(cast<ObjCImplicitSetterGetterRefExpr>(E));
-  case Expr::ObjCSuperExprClass:
-    return EmitObjCSuperExprLValue(cast<ObjCSuperExpr>(E));
-
   case Expr::StmtExprClass:
     return EmitStmtExprLValue(cast<StmtExpr>(E));
   case Expr::UnaryOperatorClass:
@@ -2082,10 +2079,6 @@
   return LValue::MakeKVCRef(E, E->getType().getCVRQualifiers());
 }
 
-LValue CodeGenFunction::EmitObjCSuperExprLValue(const ObjCSuperExpr *E) {
-  return EmitUnsupportedLValue(E, "use of super");
-}
-
 LValue CodeGenFunction::EmitStmtExprLValue(const StmtExpr *E) {
   // Can only get l-value for message expression returning aggregate type
   RValue RV = EmitAnyExprToTemp(E);

Modified: cfe/trunk/lib/CodeGen/CGObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjC.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjC.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjC.cpp Thu Oct 14 11:04:05 2010
@@ -534,7 +534,7 @@
   // FIXME: Split it into two separate routines.
   if (const ObjCPropertyRefExpr *E = dyn_cast<ObjCPropertyRefExpr>(Exp)) {
     Selector S = E->getProperty()->getGetterName();
-    if (isa<ObjCSuperExpr>(E->getBase()))
+    if (E->isSuperReceiver())
       return EmitObjCSuperPropertyGet(E, S, Return);
     return CGM.getObjCRuntime().
              GenerateMessageSend(*this, Return, Exp->getType(), S,
@@ -548,7 +548,7 @@
     if (KE->getInterfaceDecl()) {
       const ObjCInterfaceDecl *OID = KE->getInterfaceDecl();
       Receiver = CGM.getObjCRuntime().GetClass(Builder, OID);
-    } else if (isa<ObjCSuperExpr>(KE->getBase()))
+    } else if (KE->isSuperReceiver())
       return EmitObjCSuperPropertyGet(KE, S, Return);
     else
       Receiver = EmitScalarExpr(KE->getBase());
@@ -586,7 +586,7 @@
   // FIXME: Split it into two separate routines.
   if (const ObjCPropertyRefExpr *E = dyn_cast<ObjCPropertyRefExpr>(Exp)) {
     Selector S = E->getProperty()->getSetterName();
-    if (isa<ObjCSuperExpr>(E->getBase())) {
+    if (E->isSuperReceiver()) {
       EmitObjCSuperPropertySet(E, S, Src);
       return;
     }
@@ -605,7 +605,7 @@
     if (E->getInterfaceDecl()) {
       const ObjCInterfaceDecl *OID = E->getInterfaceDecl();
       Receiver = CGM.getObjCRuntime().GetClass(Builder, OID);
-    } else if (isa<ObjCSuperExpr>(E->getBase())) {
+    } else if (E->isSuperReceiver()) {
       EmitObjCSuperPropertySet(E, S, Src);
       return;
     } else

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Thu Oct 14 11:04:05 2010
@@ -1439,7 +1439,6 @@
   LValue EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E);
   LValue EmitObjCPropertyRefLValue(const ObjCPropertyRefExpr *E);
   LValue EmitObjCKVCRefLValue(const ObjCImplicitSetterGetterRefExpr *E);
-  LValue EmitObjCSuperExprLValue(const ObjCSuperExpr *E);
   LValue EmitStmtExprLValue(const StmtExpr *E);
   LValue EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E);
   LValue EmitObjCSelectorLValue(const ObjCSelectorExpr *E);

Modified: cfe/trunk/lib/CodeGen/Mangle.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/Mangle.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/Mangle.cpp (original)
+++ cfe/trunk/lib/CodeGen/Mangle.cpp Thu Oct 14 11:04:05 2010
@@ -1610,7 +1610,6 @@
   case Expr::ObjCProtocolExprClass:
   case Expr::ObjCSelectorExprClass:
   case Expr::ObjCStringLiteralClass:
-  case Expr::ObjCSuperExprClass:
   case Expr::OffsetOfExprClass:
   case Expr::PredefinedExprClass:
   case Expr::ShuffleVectorExprClass:

Modified: cfe/trunk/lib/Frontend/StmtXML.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/StmtXML.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/StmtXML.cpp (original)
+++ cfe/trunk/lib/Frontend/StmtXML.cpp Thu Oct 14 11:04:05 2010
@@ -150,7 +150,6 @@
     void VisitObjCImplicitSetterGetterRefExpr(
                         ObjCImplicitSetterGetterRefExpr *Node);
     void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node);
-    void VisitObjCSuperExpr(ObjCSuperExpr *Node);
 #endif
   };
 }
@@ -428,11 +427,6 @@
   Doc.addAttribute("Setter", Setter ? Setter->getSelector().getAsString().c_str() : "(null)");
 }
 
-void StmtXML::VisitObjCSuperExpr(ObjCSuperExpr *Node) {
-  DumpExpr(Node);
-  Doc.addAttribute("super", "1");
-}
-
 void StmtXML::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
   DumpExpr(Node);
   Doc.addAttribute("kind", Node->getDecl()->getDeclKindName());

Modified: cfe/trunk/lib/Rewrite/RewriteObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Rewrite/RewriteObjC.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/Rewrite/RewriteObjC.cpp (original)
+++ cfe/trunk/lib/Rewrite/RewriteObjC.cpp Thu Oct 14 11:04:05 2010
@@ -1209,6 +1209,9 @@
   QualType Ty;
   Selector Sel;
   Stmt *Receiver;
+  bool Super = false;
+  QualType SuperTy;
+  SourceLocation SuperLocation;
   // Synthesize a ObjCMessageExpr from a ObjCPropertyRefExpr or ObjCImplicitSetterGetterRefExpr.
   // This allows us to reuse all the fun and games in SynthMessageExpr().
   if (ObjCPropertyRefExpr *PropRefExpr = dyn_cast<ObjCPropertyRefExpr>(BinOp->getLHS())) {
@@ -1216,14 +1219,26 @@
     OMD = PDecl->getSetterMethodDecl();
     Ty = PDecl->getType();
     Sel = PDecl->getSetterName();
-    Receiver = PropRefExpr->getBase();
+    Super = PropRefExpr->isSuperReceiver();
+    if (!Super)
+      Receiver = PropRefExpr->getBase();
+    else {
+      SuperTy = PropRefExpr->getSuperType();
+      SuperLocation = PropRefExpr->getSuperLocation();
+    }
   }
   else if (ObjCImplicitSetterGetterRefExpr *ImplicitRefExpr = 
            dyn_cast<ObjCImplicitSetterGetterRefExpr>(BinOp->getLHS())) {
     OMD = ImplicitRefExpr->getSetterMethod();
     Sel = OMD->getSelector();
     Ty = ImplicitRefExpr->getType();
-    Receiver = ImplicitRefExpr->getBase();
+    Super = ImplicitRefExpr->isSuperReceiver();
+    if (!Super)
+      Receiver = ImplicitRefExpr->getBase();
+    else {
+      SuperTy = ImplicitRefExpr->getSuperType();
+      SuperLocation = ImplicitRefExpr->getSuperLocation();
+    }
   }
   
   assert(OMD && "RewritePropertyOrImplicitSetter - null OMD");
@@ -1236,13 +1251,13 @@
       Receiver = PropGetters[Exp];
   
   ObjCMessageExpr *MsgExpr;
-  if (isa<ObjCSuperExpr>(Receiver))
+  if (Super)
     MsgExpr = ObjCMessageExpr::Create(*Context, 
                                       Ty.getNonReferenceType(),
                                       /*FIXME?*/SourceLocation(),
-                                      Receiver->getLocStart(),
+                                      SuperLocation,
                                       /*IsInstanceSuper=*/true,
-                                      cast<Expr>(Receiver)->getType(),
+                                      SuperTy,
                                       Sel, OMD,
                                       &ExprVec[0], 1,
                                       /*FIXME:*/SourceLocation());
@@ -1272,20 +1287,35 @@
   ObjCMethodDecl *OMD = 0;
   QualType Ty;
   Selector Sel;
+  bool Super = false;
+  QualType SuperTy;
+  SourceLocation SuperLocation;
   if (ObjCPropertyRefExpr *PropRefExpr = 
         dyn_cast<ObjCPropertyRefExpr>(PropOrGetterRefExpr)) {
     ObjCPropertyDecl *PDecl = PropRefExpr->getProperty();
     OMD = PDecl->getGetterMethodDecl();
-    Receiver = PropRefExpr->getBase();
     Ty = PDecl->getType();
     Sel = PDecl->getGetterName();
+    Super = PropRefExpr->isSuperReceiver();
+    if (!Super)
+      Receiver = PropRefExpr->getBase();
+    else {
+      SuperTy = PropRefExpr->getSuperType();
+      SuperLocation = PropRefExpr->getSuperLocation();
+    }
   }
   else if (ObjCImplicitSetterGetterRefExpr *ImplicitRefExpr = 
             dyn_cast<ObjCImplicitSetterGetterRefExpr>(PropOrGetterRefExpr)) {
     OMD = ImplicitRefExpr->getGetterMethod();
-    Receiver = ImplicitRefExpr->getBase();
     Sel = OMD->getSelector();
     Ty = ImplicitRefExpr->getType();
+    Super = ImplicitRefExpr->isSuperReceiver();
+    if (!Super)
+      Receiver = ImplicitRefExpr->getBase();
+    else {
+      SuperTy = ImplicitRefExpr->getSuperType();
+      SuperLocation = ImplicitRefExpr->getSuperLocation();
+    }
   }
   
   assert (OMD && "RewritePropertyOrImplicitGetter - OMD is null");
@@ -1296,13 +1326,13 @@
       Receiver = PropGetters[Exp];
   
   ObjCMessageExpr *MsgExpr;
-  if (isa<ObjCSuperExpr>(Receiver))
+  if (Super)
     MsgExpr = ObjCMessageExpr::Create(*Context, 
                                       Ty.getNonReferenceType(),
-                                      /*FIXME:*/SourceLocation(),
-                                      Receiver->getLocStart(),
+                                      /*FIXME?*/SourceLocation(),
+                                      SuperLocation,
                                       /*IsInstanceSuper=*/true,
-                                      cast<Expr>(Receiver)->getType(),
+                                      SuperTy,
                                       Sel, OMD,
                                       0, 0, 
                                       /*FIXME:*/SourceLocation());

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Oct 14 11:04:05 2010
@@ -3307,7 +3307,8 @@
           return ExprError();
 
         return Owned(new (Context) ObjCPropertyRefExpr(PD, PD->getType(),
-                                                       MemberLoc, BaseExpr));
+                                                       MemberLoc, 
+                                                       BaseExpr));
       }
       if (ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(PMDecl)) {
         // Check the use of this method.
@@ -3337,7 +3338,8 @@
   if (!IsArrow)
     if (const ObjCObjectPointerType *OPT =
           BaseType->getAsObjCInterfacePointerType())
-      return HandleExprPropertyRefExpr(OPT, BaseExpr, MemberName, MemberLoc);
+      return HandleExprPropertyRefExpr(OPT, BaseExpr, MemberName, MemberLoc,
+                                       SourceLocation(), QualType(), false);
 
   // Handle the following exceptional case (*Obj).isa.
   if (!IsArrow &&
@@ -6018,7 +6020,10 @@
   if (E->getStmtClass() == Expr::ObjCPropertyRefExprClass) {
     const ObjCPropertyRefExpr* PropExpr = cast<ObjCPropertyRefExpr>(E);
     if (ObjCPropertyDecl *PDecl = PropExpr->getProperty()) {
-      QualType BaseType = PropExpr->getBase()->getType();
+      QualType BaseType = PropExpr->isSuperReceiver() ? 
+                            PropExpr->getSuperType() :  
+                            PropExpr->getBase()->getType();
+      
       if (const ObjCObjectPointerType *OPT =
             BaseType->getAsObjCInterfacePointerType())
         if (ObjCInterfaceDecl *IFace = OPT->getInterfaceDecl())

Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Thu Oct 14 11:04:05 2010
@@ -336,7 +336,9 @@
 ExprResult Sema::
 HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
                           Expr *BaseExpr, DeclarationName MemberName,
-                          SourceLocation MemberLoc) {
+                          SourceLocation MemberLoc,
+                          SourceLocation SuperLoc, QualType SuperType,
+                          bool Super) {
   const ObjCInterfaceType *IFaceT = OPT->getInterfaceType();
   ObjCInterfaceDecl *IFace = IFaceT->getDecl();
   IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
@@ -351,8 +353,13 @@
     ObjCMethodDecl *Getter = IFace->lookupInstanceMethod(Sel);
     if (DiagnosePropertyAccessorMismatch(PD, Getter, MemberLoc))
       ResTy = Getter->getSendResultType();
-    return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy,
-                                                   MemberLoc, BaseExpr));
+    if (Super)
+      return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy,
+                                                     MemberLoc, 
+                                                     SuperLoc, SuperType));
+    else
+      return Owned(new (Context) ObjCPropertyRefExpr(PD, ResTy,
+                                                     MemberLoc, BaseExpr));
   }
   // Check protocols on qualified interfaces.
   for (ObjCObjectPointerType::qual_iterator I = OPT->qual_begin(),
@@ -361,9 +368,14 @@
       // Check whether we can reference this property.
       if (DiagnoseUseOfDecl(PD, MemberLoc))
         return ExprError();
-
+      if (Super)
       return Owned(new (Context) ObjCPropertyRefExpr(PD, PD->getType(),
-                                                     MemberLoc, BaseExpr));
+                                                     MemberLoc, 
+                                                     SuperLoc, SuperType));
+      else
+        return Owned(new (Context) ObjCPropertyRefExpr(PD, PD->getType(),
+                                                       MemberLoc,
+                                                       BaseExpr));
     }
   // If that failed, look for an "implicit" property by seeing if the nullary
   // selector is implemented.
@@ -407,8 +419,15 @@
   if (Getter) {
     QualType PType;
     PType = Getter->getSendResultType();
-    return Owned(new (Context) ObjCImplicitSetterGetterRefExpr(Getter, PType,
-                                    Setter, MemberLoc, BaseExpr));
+    if (Super)
+      return Owned(new (Context) ObjCImplicitSetterGetterRefExpr(Getter, PType,
+                                    Setter, MemberLoc,
+                                    SuperLoc, SuperType));
+    else
+      return Owned(new (Context) ObjCImplicitSetterGetterRefExpr(Getter, PType,
+                                                                 Setter, MemberLoc, 
+                                                                 BaseExpr));
+
   }
 
   // Attempt to correct for typos in property names.
@@ -422,7 +441,8 @@
     ObjCPropertyDecl *Property = Res.getAsSingle<ObjCPropertyDecl>();
     Diag(Property->getLocation(), diag::note_previous_decl)
       << Property->getDeclName();
-    return HandleExprPropertyRefExpr(OPT, BaseExpr, TypoResult, MemberLoc);
+    return HandleExprPropertyRefExpr(OPT, BaseExpr, TypoResult, MemberLoc,
+                                     SuperLoc, SuperType, Super);
   }
   
   Diag(MemberLoc, diag::err_property_not_found)
@@ -453,11 +473,11 @@
           QualType T = 
             Context.getObjCInterfaceType(CurMethod->getClassInterface());
           T = Context.getObjCObjectPointerType(T);
-          Expr *SuperExpr = new (Context) ObjCSuperExpr(receiverNameLoc, T);
         
           return HandleExprPropertyRefExpr(T->getAsObjCInterfacePointerType(),
-                                           SuperExpr, &propertyName,
-                                           propertyNameLoc);
+                                           /*BaseExpr*/0, &propertyName,
+                                           propertyNameLoc,
+                                           receiverNameLoc, T, true);
         }
 
         // Otherwise, if this is a class method, try dispatching to our

Modified: cfe/trunk/lib/Sema/TreeTransform.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/TreeTransform.h (original)
+++ cfe/trunk/lib/Sema/TreeTransform.h Thu Oct 14 11:04:05 2010
@@ -1886,14 +1886,26 @@
   /// Subclasses may override this routine to provide different behavior.  
   ExprResult RebuildObjCImplicitSetterGetterRefExpr(
                                                         ObjCMethodDecl *Getter,
-                                                          QualType T,
+                                                        QualType T,
                                                         ObjCMethodDecl *Setter,
                                                         SourceLocation NameLoc,
-                                                          Expr *Base) {
+                                                        Expr *Base,
+                                                        SourceLocation SuperLoc,
+                                                        QualType SuperTy, 
+                                                        bool Super) {
     // Since these expressions can only be value-dependent, we do not need to
     // perform semantic analysis again.
-    return Owned(
-             new (getSema().Context) ObjCImplicitSetterGetterRefExpr(Getter, T,
+    if (Super)
+      return Owned(
+                   new (getSema().Context) ObjCImplicitSetterGetterRefExpr(Getter, T,
+                                                                           Setter,
+                                                                           NameLoc,
+                                                                           SuperLoc,
+                                                                           SuperTy));
+    else
+      return Owned(
+                   new (getSema().Context) ObjCImplicitSetterGetterRefExpr(
+                                                                     Getter, T,
                                                                      Setter,
                                                                      NameLoc,
                                                                      Base));
@@ -6146,6 +6158,11 @@
 template<typename Derived>
 ExprResult
 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
+  // 'super' never changes. Property never changes. Just retain the existing
+  // expression.
+  if (E->isSuperReceiver())
+    return SemaRef.Owned(E->Retain());
+  
   // Transform the base expression.
   ExprResult Base = getDerived().TransformExpr(E->getBase());
   if (Base.isInvalid())
@@ -6166,6 +6183,11 @@
 ExprResult
 TreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
                                           ObjCImplicitSetterGetterRefExpr *E) {
+  // If this implicit setter/getter refers to super, it cannot have any
+  // dependent parts. Just retain the existing declaration.
+  if (E->isSuperReceiver())
+    return SemaRef.Owned(E->Retain());
+  
   // If this implicit setter/getter refers to class methods, it cannot have any
   // dependent parts. Just retain the existing declaration.
   if (E->getInterfaceDecl())
@@ -6185,22 +6207,18 @@
   
   return getDerived().RebuildObjCImplicitSetterGetterRefExpr(
                                                           E->getGetterMethod(),
-                                                             E->getType(),
+                                                          E->getType(),
                                                           E->getSetterMethod(),
-                                                             E->getLocation(),
-                                                             Base.get());
+                                                          E->getLocation(),
+                                                          Base.get(),
+                                                          E->getSuperLocation(), 
+                                                          E->getSuperType(),
+                                                          E->isSuperReceiver());
                                                              
 }
 
 template<typename Derived>
 ExprResult
-TreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
-  // Can never occur in a dependent context.
-  return SemaRef.Owned(E->Retain());
-}
-
-template<typename Derived>
-ExprResult
 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
   // Transform the base expression.
   ExprResult Base = getDerived().TransformExpr(E->getBase());

Modified: cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderStmt.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReaderStmt.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReaderStmt.cpp Thu Oct 14 11:04:05 2010
@@ -122,7 +122,6 @@
     void VisitObjCImplicitSetterGetterRefExpr(
                             ObjCImplicitSetterGetterRefExpr *E);
     void VisitObjCMessageExpr(ObjCMessageExpr *E);
-    void VisitObjCSuperExpr(ObjCSuperExpr *E);
     void VisitObjCIsaExpr(ObjCIsaExpr *E);
 
     void VisitObjCForCollectionStmt(ObjCForCollectionStmt *);
@@ -843,7 +842,13 @@
   VisitExpr(E);
   E->setProperty(cast<ObjCPropertyDecl>(Reader.GetDecl(Record[Idx++])));
   E->setLocation(ReadSourceLocation(Record, Idx));
-  E->setBase(Reader.ReadSubExpr());
+  E->SuperLoc = ReadSourceLocation(Record, Idx);
+  if (E->isSuperReceiver()) {
+    QualType T = Reader.GetType(Record[Idx++]);
+    E->BaseExprOrSuperType = T.getTypePtr();
+  }
+  else
+    E->setBase(Reader.ReadSubExpr());
 }
 
 void ASTStmtReader::VisitObjCImplicitSetterGetterRefExpr(
@@ -858,6 +863,9 @@
   E->setBase(Reader.ReadSubExpr());
   E->setLocation(ReadSourceLocation(Record, Idx));
   E->setClassLoc(ReadSourceLocation(Record, Idx));
+  E->SuperLoc = ReadSourceLocation(Record, Idx);
+  E->SuperTy = Reader.GetType(Record[Idx++]);
+  E->IsSuper = Record[Idx++];
 }
 
 void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) {
@@ -898,11 +906,6 @@
     E->setArg(I, Reader.ReadSubExpr());
 }
 
-void ASTStmtReader::VisitObjCSuperExpr(ObjCSuperExpr *E) {
-  VisitExpr(E);
-  E->setLoc(ReadSourceLocation(Record, Idx));
-}
-
 void ASTStmtReader::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
   VisitStmt(S);
   S->setElement(Reader.ReadSubStmt());
@@ -1631,9 +1634,6 @@
       S = ObjCMessageExpr::CreateEmpty(*Context,
                                      Record[ASTStmtReader::NumExprFields]);
       break;
-    case EXPR_OBJC_SUPER_EXPR:
-      S = new (Context) ObjCSuperExpr(Empty);
-      break;
     case EXPR_OBJC_ISA:
       S = new (Context) ObjCIsaExpr(Empty);
       break;

Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Thu Oct 14 11:04:05 2010
@@ -592,7 +592,6 @@
   RECORD(EXPR_OBJC_PROPERTY_REF_EXPR);
   RECORD(EXPR_OBJC_KVC_REF_EXPR);
   RECORD(EXPR_OBJC_MESSAGE_EXPR);
-  RECORD(EXPR_OBJC_SUPER_EXPR);
   RECORD(STMT_OBJC_FOR_COLLECTION);
   RECORD(STMT_OBJC_CATCH);
   RECORD(STMT_OBJC_FINALLY);

Modified: cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriterStmt.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriterStmt.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriterStmt.cpp Thu Oct 14 11:04:05 2010
@@ -103,7 +103,6 @@
     void VisitObjCImplicitSetterGetterRefExpr(
                         ObjCImplicitSetterGetterRefExpr *E);
     void VisitObjCMessageExpr(ObjCMessageExpr *E);
-    void VisitObjCSuperExpr(ObjCSuperExpr *E);
     void VisitObjCIsaExpr(ObjCIsaExpr *E);
 
     // Objective-C Statements
@@ -824,7 +823,12 @@
   VisitExpr(E);
   Writer.AddDeclRef(E->getProperty(), Record);
   Writer.AddSourceLocation(E->getLocation(), Record);
-  Writer.AddStmt(E->getBase());
+  Writer.AddSourceLocation(E->getSuperLocation(), Record);
+  if (E->isSuperReceiver())
+    Writer.AddTypeRef(E->getSuperType(), Record);
+  else
+    Writer.AddStmt(E->getBase());
+  
   Code = serialization::EXPR_OBJC_PROPERTY_REF_EXPR;
 }
 
@@ -839,6 +843,9 @@
   Writer.AddStmt(E->getBase());
   Writer.AddSourceLocation(E->getLocation(), Record);
   Writer.AddSourceLocation(E->getClassLoc(), Record);
+  Writer.AddSourceLocation(E->getSuperLocation(), Record);
+  Writer.AddTypeRef(E->getSuperType(), Record);
+  Record.push_back(E->isSuperReceiver());
   Code = serialization::EXPR_OBJC_KVC_REF_EXPR;
 }
 
@@ -879,12 +886,6 @@
   Code = serialization::EXPR_OBJC_MESSAGE_EXPR;
 }
 
-void ASTStmtWriter::VisitObjCSuperExpr(ObjCSuperExpr *E) {
-  VisitExpr(E);
-  Writer.AddSourceLocation(E->getLoc(), Record);
-  Code = serialization::EXPR_OBJC_SUPER_EXPR;
-}
-
 void ASTStmtWriter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *S) {
   VisitStmt(S);
   Writer.AddStmt(S->getElement());

Modified: cfe/trunk/tools/libclang/CXCursor.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXCursor.cpp?rev=116483&r1=116482&r2=116483&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CXCursor.cpp (original)
+++ cfe/trunk/tools/libclang/CXCursor.cpp Thu Oct 14 11:04:05 2010
@@ -153,7 +153,6 @@
   case Stmt::ObjCSelectorExprClass:   
   case Stmt::ObjCProtocolExprClass:   
   case Stmt::ObjCImplicitSetterGetterRefExprClass: 
-  case Stmt::ObjCSuperExprClass:     
   case Stmt::ObjCIsaExprClass:       
   case Stmt::ShuffleVectorExprClass: 
   case Stmt::BlockExprClass:  





More information about the cfe-commits mailing list