[cfe-commits] r44171 - in /cfe/trunk: Driver/RewriteTest.cpp Parse/ParseObjc.cpp Sema/Sema.h Sema/SemaDecl.cpp include/clang/AST/DeclObjC.h include/clang/Parse/Action.h

Steve Naroff snaroff at apple.com
Thu Nov 15 04:35:22 PST 2007


Author: snaroff
Date: Thu Nov 15 06:35:21 2007
New Revision: 44171

URL: http://llvm.org/viewvc/llvm-project?rev=44171&view=rev
Log:

Implement support for variadic methods (work in progress).


Modified:
    cfe/trunk/Driver/RewriteTest.cpp
    cfe/trunk/Parse/ParseObjc.cpp
    cfe/trunk/Sema/Sema.h
    cfe/trunk/Sema/SemaDecl.cpp
    cfe/trunk/include/clang/AST/DeclObjC.h
    cfe/trunk/include/clang/Parse/Action.h

Modified: cfe/trunk/Driver/RewriteTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/RewriteTest.cpp?rev=44171&r1=44170&r2=44171&view=diff

==============================================================================
--- cfe/trunk/Driver/RewriteTest.cpp (original)
+++ cfe/trunk/Driver/RewriteTest.cpp Thu Nov 15 06:35:21 2007
@@ -1274,11 +1274,11 @@
   // xx.m:13: note: if this code is reached, the program will abort
   cast = new CastExpr(Context->getPointerType(Context->VoidTy), DRE, 
                       SourceLocation());
-                                                   
+    
   // Now do the "normal" pointer to function cast.
   QualType castType = Context->getFunctionType(returnType, 
                                                &ArgTypes[0], ArgTypes.size(),
-                                               false/*FIXME:variadic*/);
+                                               Exp->getMethodDecl()->isVariadic());
   castType = Context->getPointerType(castType);
   cast = new CastExpr(castType, cast, SourceLocation());
 

Modified: cfe/trunk/Parse/ParseObjc.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Parse/ParseObjc.cpp?rev=44171&r1=44170&r2=44171&view=diff

==============================================================================
--- cfe/trunk/Parse/ParseObjc.cpp (original)
+++ cfe/trunk/Parse/ParseObjc.cpp Thu Nov 15 06:35:21 2007
@@ -619,13 +619,17 @@
     // We have a selector or a colon, continue parsing.
   }
   
+  bool isVariadic = false;
+  
   // Parse the (optional) parameter list.
   while (Tok.is(tok::comma)) {
     ConsumeToken();
     if (Tok.is(tok::ellipsis)) {
+      isVariadic = true;
       ConsumeToken();
       break;
     }
+    // FIXME: implement this...
     // Parse the c-style argument declaration-specifier.
     DeclSpec DS;
     ParseDeclarationSpecifiers(DS);
@@ -645,8 +649,8 @@
   return Actions.ActOnMethodDeclaration(mLoc, Tok.getLocation(),
                                         mType, IDecl, DSRet, ReturnType, Sel, 
                                         &ArgTypeQuals[0], &KeyTypes[0], 
-                                        &ArgNames[0],
-                                        MethodAttrs, MethodImplKind);
+                                        &ArgNames[0], MethodAttrs, 
+                                        MethodImplKind, isVariadic);
 }
 
 /// CmpProtocolVals - Comparison predicate for sorting protocols.

Modified: cfe/trunk/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/Sema.h?rev=44171&r1=44170&r2=44171&view=diff

==============================================================================
--- cfe/trunk/Sema/Sema.h (original)
+++ cfe/trunk/Sema/Sema.h Thu Nov 15 06:35:21 2007
@@ -560,7 +560,8 @@
     // optional arguments. The number of types/arguments is obtained
     // from the Sel.getNumArgs().
     ObjcDeclSpec *ArgQT, TypeTy **ArgTypes, IdentifierInfo **ArgNames,
-    AttributeList *AttrList, tok::ObjCKeywordKind MethodImplKind);
+    AttributeList *AttrList, tok::ObjCKeywordKind MethodImplKind,
+    bool isVariadic = false);
 
   // ActOnClassMessage - used for both unary and keyword messages.
   // ArgExprs is optional - if it is present, the number of expressions

Modified: cfe/trunk/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaDecl.cpp?rev=44171&r1=44170&r2=44171&view=diff

==============================================================================
--- cfe/trunk/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/Sema/SemaDecl.cpp Thu Nov 15 06:35:21 2007
@@ -2119,7 +2119,8 @@
     // optional arguments. The number of types/arguments is obtained
     // from the Sel.getNumArgs().
     ObjcDeclSpec *ArgQT, TypeTy **ArgTypes, IdentifierInfo **ArgNames,
-    AttributeList *AttrList, tok::ObjCKeywordKind MethodDeclKind) {
+    AttributeList *AttrList, tok::ObjCKeywordKind MethodDeclKind,
+    bool isVariadic) {
   llvm::SmallVector<ParmVarDecl*, 16> Params;
   
   for (unsigned i = 0; i < Sel.getNumArgs(); i++) {
@@ -2148,7 +2149,7 @@
                                       resultDeclType,
                                       CDecl,
                                       0, -1, AttrList, 
-                                      MethodType == tok::minus,
+                                      MethodType == tok::minus, isVariadic,
                                       MethodDeclKind == tok::objc_optional ? 
                                       ObjcMethodDecl::Optional : 
                                       ObjcMethodDecl::Required);

Modified: cfe/trunk/include/clang/AST/DeclObjC.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclObjC.h?rev=44171&r1=44170&r2=44171&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/DeclObjC.h (original)
+++ cfe/trunk/include/clang/AST/DeclObjC.h Thu Nov 15 06:35:21 2007
@@ -626,6 +626,8 @@
   /// declared in class Decl.
   /// instance (true) or class (false) method.
   bool IsInstance : 1;
+  bool IsVariadic : 1;
+  
   /// @required/@optional
   ImplementationControl DeclImplementation : 2;
   
@@ -657,11 +659,12 @@
                  Decl *contextDecl,
                  ParmVarDecl **paramInfo = 0, int numParams=-1,
                  AttributeList *M = 0, bool isInstance = true,
+                 bool isVariadic = false,
                  ImplementationControl impControl = None,
                  Decl *PrevDecl = 0)
   : Decl(ObjcMethod, beginLoc),
-    IsInstance(isInstance), DeclImplementation(impControl),
-    objcDeclQualifier(OBJC_TQ_None),
+    IsInstance(isInstance), IsVariadic(isVariadic),
+    DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None),
     MethodContext(static_cast<NamedDecl*>(contextDecl)),
     SelName(SelInfo), MethodDeclType(T), 
     ParamInfo(paramInfo), NumMethodParams(numParams),
@@ -704,6 +707,8 @@
   
   AttributeList *getMethodAttrs() const {return MethodAttrs;}
   bool isInstance() const { return IsInstance; }
+  bool isVariadic() const { return IsVariadic; }
+  
   // Related to protocols declared in  @protocol
   void setDeclImplementation(ImplementationControl ic) { 
     DeclImplementation = ic; 

Modified: cfe/trunk/include/clang/Parse/Action.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=44171&r1=44170&r2=44171&view=diff

==============================================================================
--- cfe/trunk/include/clang/Parse/Action.h (original)
+++ cfe/trunk/include/clang/Parse/Action.h Thu Nov 15 06:35:21 2007
@@ -565,7 +565,8 @@
     IdentifierInfo **ArgNames, // non-zero when Sel.getNumArgs() > 0
     AttributeList *AttrList,   // optional
     // tok::objc_not_keyword, tok::objc_optional, tok::objc_required    
-    tok::ObjCKeywordKind impKind) {
+    tok::ObjCKeywordKind impKind,
+    bool isVariadic = false) {
     return 0;
   }
   // ActOnAtEnd - called to mark the @end. For declarations (interfaces,





More information about the cfe-commits mailing list