Implement support for variadic methods (work in progress).

llvm-svn: 44171
This commit is contained in:
Steve Naroff 2007-11-15 12:35:21 +00:00
parent 05caa48fb4
commit d8ea1ac576
6 changed files with 22 additions and 10 deletions

View File

@ -1278,7 +1278,7 @@ Stmt *RewriteTest::RewriteMessageExpr(ObjCMessageExpr *Exp) {
// 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());

View File

@ -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.

View File

@ -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

View File

@ -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<ParmVarDecl*, 16> 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);

View File

@ -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<NamedDecl*>(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;

View File

@ -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,