From 335eafa5be51f6440672a74c73d588af72e96732 Mon Sep 17 00:00:00 2001 From: Steve Naroff Date: Thu, 15 Nov 2007 12:35:21 +0000 Subject: [PATCH] Implement support for variadic methods (work in progress). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44171 91177308-0d34-0410-b5e6-96231b3b80d8 --- Driver/RewriteTest.cpp | 4 ++-- Parse/ParseObjc.cpp | 8 ++++++-- Sema/Sema.h | 3 ++- Sema/SemaDecl.cpp | 5 +++-- include/clang/AST/DeclObjC.h | 9 +++++++-- include/clang/Parse/Action.h | 3 ++- 6 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp index a768d17b3a..b5dcdfc802 100644 --- a/Driver/RewriteTest.cpp +++ b/Driver/RewriteTest.cpp @@ -1274,11 +1274,11 @@ Stmt *RewriteTest::RewriteMessageExpr(ObjCMessageExpr *Exp) { // 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()); diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp index 345906e70f..be33f86f0c 100644 --- a/Parse/ParseObjc.cpp +++ b/Parse/ParseObjc.cpp @@ -619,13 +619,17 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc, // 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 @@ Parser::DeclTy *Parser::ParseObjCMethodDecl(SourceLocation mLoc, 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. diff --git a/Sema/Sema.h b/Sema/Sema.h index 8b470fe5c6..a102644886 100644 --- a/Sema/Sema.h +++ b/Sema/Sema.h @@ -560,7 +560,8 @@ public: // 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 diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp index dc1a993519..2c016df781 100644 --- a/Sema/SemaDecl.cpp +++ b/Sema/SemaDecl.cpp @@ -2119,7 +2119,8 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration( // 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 Params; for (unsigned i = 0; i < Sel.getNumArgs(); i++) { @@ -2148,7 +2149,7 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration( resultDeclType, CDecl, 0, -1, AttrList, - MethodType == tok::minus, + MethodType == tok::minus, isVariadic, MethodDeclKind == tok::objc_optional ? ObjcMethodDecl::Optional : ObjcMethodDecl::Required); diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index a475984b12..fb0a8b4a36 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -626,6 +626,8 @@ private: /// 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 @@ public: 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(contextDecl)), SelName(SelInfo), MethodDeclType(T), ParamInfo(paramInfo), NumMethodParams(numParams), @@ -704,6 +707,8 @@ public: 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; diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h index bfbcfb93dc..e2aa1bad40 100644 --- a/include/clang/Parse/Action.h +++ b/include/clang/Parse/Action.h @@ -565,7 +565,8 @@ public: 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, -- 2.40.0