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
diff --git a/Driver/RewriteTest.cpp b/Driver/RewriteTest.cpp
index a768d17..b5dcdfc 100644
--- a/Driver/RewriteTest.cpp
+++ b/Driver/RewriteTest.cpp
@@ -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());
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp
index 345906e..be33f86 100644
--- a/Parse/ParseObjc.cpp
+++ b/Parse/ParseObjc.cpp
@@ -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.
diff --git a/Sema/Sema.h b/Sema/Sema.h
index 8b470fe..a102644 100644
--- a/Sema/Sema.h
+++ b/Sema/Sema.h
@@ -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
diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp
index dc1a993..2c016df 100644
--- a/Sema/SemaDecl.cpp
+++ b/Sema/SemaDecl.cpp
@@ -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);
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index a475984..fb0a8b4 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -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;
diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h
index bfbcfb9..e2aa1ba 100644
--- a/include/clang/Parse/Action.h
+++ b/include/clang/Parse/Action.h
@@ -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,