]> granicus.if.org Git - clang/commitdiff
'super' nailed.
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 12 Nov 2007 20:13:27 +0000 (20:13 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 12 Nov 2007 20:13:27 +0000 (20:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44025 91177308-0d34-0410-b5e6-96231b3b80d8

Parse/ParseObjc.cpp
Sema/Sema.h
Sema/SemaExpr.cpp
include/clang/Parse/Action.h

index c3dae856eabf28a10f27645b7183424d0bbb094b..19d32bd486e2316cac70689a479d33b1639ccd16 100644 (file)
@@ -1237,7 +1237,8 @@ Parser::ExprResult Parser::ParseObjCMessageExpression() {
   ExprTy *ReceiverExpr = 0;
   // Parse receiver
   if (Tok.is(tok::identifier) &&
-      Actions.isTypeName(*Tok.getIdentifierInfo(), CurScope)) {
+      (Actions.isTypeName(*Tok.getIdentifierInfo(), CurScope)
+       || !strcmp(Tok.getIdentifierInfo()->getName(), "super"))) {
     ReceiverName = Tok.getIdentifierInfo();
     ConsumeToken();
   } else {
@@ -1308,7 +1309,8 @@ Parser::ExprResult Parser::ParseObjCMessageExpression() {
   
   // We've just parsed a keyword message.
   if (ReceiverName) 
-    return Actions.ActOnClassMessage(ReceiverName, Sel, LBracloc, RBracloc,
+    return Actions.ActOnClassMessage(CurScope,
+                                     ReceiverName, Sel, LBracloc, RBracloc,
                                      &KeyExprs[0]);
   return Actions.ActOnInstanceMessage(ReceiverExpr, Sel, LBracloc, RBracloc,
                                       &KeyExprs[0]);
index 4c66e10301a84dd60aaf4254660d036b80f87a99..a443c94e3bf6bdbef507ec67232c0aca0e9a4011 100644 (file)
@@ -565,6 +565,7 @@ public:
   // ArgExprs is optional - if it is present, the number of expressions
   // is obtained from Sel.getNumArgs().
   virtual ExprResult ActOnClassMessage(
+    Scope *S,
     IdentifierInfo *receivingClassName, Selector Sel,
     SourceLocation lbrac, SourceLocation rbrac, ExprTy **ArgExprs);
 
index 124eb14dc676d5b1f38d8b5e763eb229af052ac1..643f586fd51f0236f1966f1bd92bdafd67eab6b3 100644 (file)
@@ -2060,13 +2060,34 @@ bool Sema::CheckMessageArgumentTypes(Expr **Args, unsigned NumArgs,
 // ArgExprs is optional - if it is present, the number of expressions
 // is obtained from Sel.getNumArgs().
 Sema::ExprResult Sema::ActOnClassMessage(
+  Scope *S,
   IdentifierInfo *receiverName, Selector Sel,
   SourceLocation lbrac, SourceLocation rbrac, ExprTy **Args)
 {
   assert(receiverName && "missing receiver class name");
 
   Expr **ArgExprs = reinterpret_cast<Expr **>(Args);
-  ObjcInterfaceDecl* ClassDecl = getObjCInterfaceDecl(receiverName);
+  ObjcInterfaceDecl* ClassDecl = 0;
+  if (!strcmp(receiverName->getName(), "super") && CurMethodDecl) {
+    ClassDecl = CurMethodDecl->getClassInterface()->getSuperClass();
+    if (CurMethodDecl->isInstance()) {
+      IdentifierInfo &II = Context.Idents.get("self");
+      ExprResult ReceiverExpr = ActOnIdentifierExpr(S, lbrac, II, 
+                                                    false);
+      QualType superTy = Context.getObjcInterfaceType(ClassDecl);
+      superTy = Context.getPointerType(superTy);
+      ReceiverExpr = ActOnCastExpr(SourceLocation(), superTy.getAsOpaquePtr(),
+                                   SourceLocation(), ReceiverExpr.Val);
+      
+      return ActOnInstanceMessage(ReceiverExpr.Val, Sel, lbrac, rbrac,
+                                  Args);
+    }
+    // class method
+    if (ClassDecl)
+      receiverName = ClassDecl->getIdentifier();
+  }
+  else
+    ClassDecl = getObjCInterfaceDecl(receiverName);
   ObjcMethodDecl *Method = ClassDecl->lookupClassMethod(Sel);
   QualType returnType;
   
index 7f2ca690d1d0cb19e306ce41a6f57bfc14978af1..bfbcfb93dc3f18fc1ad0359e54790feddbd1c005 100644 (file)
@@ -591,6 +591,7 @@ public:
   // ArgExprs is optional - if it is present, the number of expressions
   // is obtained from Sel.getNumArgs().
   virtual ExprResult ActOnClassMessage(
+    Scope *S,
     IdentifierInfo *receivingClassName, 
     Selector Sel,
     SourceLocation lbrac,