forked from OSchip/llvm-project
Implement support for variadic methods (work in progress).
llvm-svn: 44171
This commit is contained in:
parent
05caa48fb4
commit
d8ea1ac576
|
@ -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());
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue