[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