diff options
author | Chris Lattner <sabre@nondot.org> | 2009-04-11 18:57:04 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-04-11 18:57:04 +0000 |
commit | e294d3fbaffcbc0cf5f16067ab31d2b2763d25e9 (patch) | |
tree | f2c07c503173ba2db46c9bbb18fe94d09c02cb28 /lib/Sema/SemaDeclObjC.cpp | |
parent | da0895d003dff3e9c57ca899fc2a3a2b397edb2e (diff) |
change the interface to ActOnMethodDeclaration to pass down argument
information in a little struct instead of individually. While we're
at it, add per-argument loc info and attribute info.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68871 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclObjC.cpp')
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index a73b440577..d12fe63df1 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -1394,12 +1394,14 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration( Selector Sel, // optional arguments. The number of types/arguments is obtained // from the Sel.getNumArgs(). - ObjCDeclSpec *ArgQT, TypeTy **ArgTypes, IdentifierInfo **ArgNames, + ObjCArgInfo *ArgInfo, llvm::SmallVectorImpl<Declarator> &Cdecls, AttributeList *AttrList, tok::ObjCKeywordKind MethodDeclKind, bool isVariadic) { Decl *ClassDecl = classDecl.getAs<Decl>(); + // FIXME: Param attributes. + // Make sure we can establish a context for the method. if (!ClassDecl) { Diag(MethodLoc, diag::error_missing_method_context); @@ -1435,38 +1437,40 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration( // FIXME: arg->AttrList must be stored too! QualType argType, originalArgType; - if (ArgTypes[i]) { - argType = QualType::getFromOpaquePtr(ArgTypes[i]); + if (ArgInfo[i].Type == 0) { + argType = Context.getObjCIdType(); + } else { + argType = QualType::getFromOpaquePtr(ArgInfo[i].Type); // Perform the default array/function conversions (C99 6.7.5.3p[7,8]). if (argType->isArrayType()) { // (char *[]) -> (char **) originalArgType = argType; argType = Context.getArrayDecayedType(argType); - } - else if (argType->isFunctionType()) + } else if (argType->isFunctionType()) argType = Context.getPointerType(argType); else if (argType->isObjCInterfaceType()) { - // FIXME! provide more precise location for the parameter + // FIXME: improve message to include type! Diag(MethodLoc, diag::err_object_cannot_be_by_value) << "passed"; ObjCMethod->setInvalidDecl(); return DeclPtrTy(); } - } else - argType = Context.getObjCIdType(); + } + ParmVarDecl* Param; if (originalArgType.isNull()) Param = ParmVarDecl::Create(Context, ObjCMethod, SourceLocation(/*FIXME*/), - ArgNames[i], argType, + ArgInfo[i].Name, argType, VarDecl::None, 0); else Param = OriginalParmVarDecl::Create(Context, ObjCMethod, SourceLocation(/*FIXME*/), - ArgNames[i], argType, originalArgType, + ArgInfo[i].Name, argType, + originalArgType, VarDecl::None, 0); Param->setObjCDeclQualifier( - CvtQTToAstBitMask(ArgQT[i].getObjCDeclQualifier())); + CvtQTToAstBitMask(ArgInfo[i].DeclSpec.getObjCDeclQualifier())); Params.push_back(Param); } |