simplify code to use adjustParameterType, apply objc arg attributes

to their arguments.

llvm-svn: 68876
This commit is contained in:
Chris Lattner 2009-04-11 19:34:56 +00:00
parent 6de05080e4
commit 9713a1c91d
2 changed files with 19 additions and 19 deletions

View File

@ -2704,12 +2704,6 @@ Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
if (D.getInvalidType())
New->setInvalidDecl();
// Parameter declarators cannot be qualified (C++ [dcl.meaning]p1).
if (D.getCXXScopeSpec().isSet()) {
Diag(D.getIdentifierLoc(), diag::err_qualified_param_declarator)
<< D.getCXXScopeSpec().getRange();
New->setInvalidDecl();
}
// Parameter declarators cannot be interface types. All ObjC objects are
// passed by reference.
if (T->isObjCInterfaceType()) {
@ -2717,6 +2711,13 @@ Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
diag::err_object_cannot_be_passed_returned_by_value) << 1 << T;
New->setInvalidDecl();
}
// Parameter declarators cannot be qualified (C++ [dcl.meaning]p1).
if (D.getCXXScopeSpec().isSet()) {
Diag(D.getIdentifierLoc(), diag::err_qualified_param_declarator)
<< D.getCXXScopeSpec().getRange();
New->setInvalidDecl();
}
// Add the parameter declaration into this scope.
S->AddDecl(DeclPtrTy::make(New));

View File

@ -1400,8 +1400,6 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration(
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);
@ -1442,17 +1440,7 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration(
} else {
UnpromotedArgType = ArgType = QualType::getFromOpaquePtr(ArgInfo[i].Type);
// Perform the default array/function conversions (C99 6.7.5.3p[7,8]).
if (ArgType->isArrayType()) { // (char *[]) -> (char **)
ArgType = Context.getArrayDecayedType(ArgType);
} else if (ArgType->isFunctionType())
ArgType = Context.getPointerType(ArgType);
else if (ArgType->isObjCInterfaceType()) {
Diag(ArgInfo[i].NameLoc,
diag::err_object_cannot_be_passed_returned_by_value)
<< 1 << ArgType;
ObjCMethod->setInvalidDecl();
return DeclPtrTy();
}
ArgType = adjustParameterType(ArgType);
}
ParmVarDecl* Param;
@ -1468,8 +1456,19 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration(
UnpromotedArgType,
VarDecl::None, 0);
if (ArgType->isObjCInterfaceType()) {
Diag(ArgInfo[i].NameLoc,
diag::err_object_cannot_be_passed_returned_by_value)
<< 1 << ArgType;
Param->setInvalidDecl();
}
Param->setObjCDeclQualifier(
CvtQTToAstBitMask(ArgInfo[i].DeclSpec.getObjCDeclQualifier()));
// Apply the attributes to the parameter.
ProcessDeclAttributeList(Param, ArgInfo[i].ArgAttrs);
Params.push_back(Param);
}