Move no explicit ownership warning to SemaType.cpp.

// rdar://12280826

llvm-svn: 163813
This commit is contained in:
Fariborz Jahanian 2012-09-13 17:29:07 +00:00
parent 12c7799c55
commit bf38d880d6
2 changed files with 32 additions and 27 deletions

View File

@ -282,28 +282,6 @@ void Sema::AddAnyMethodToGlobalPool(Decl *D) {
AddFactoryMethodToGlobalPool(MDecl, true);
}
/// HasExplicitOwnershipAttr - returns true when pointer to ObjC pointer
/// has explicit ownership attribute; false otherwise.
static bool
HasExplicitOwnershipAttr(Sema &S, ParmVarDecl *Param) {
QualType T = Param->getType();
if (!T->isObjCIndirectLifetimeType())
return true;
if (!T->isPointerType() && !T->isReferenceType())
return true;
T = T->isPointerType()
? T->getAs<PointerType>()->getPointeeType()
: T->getAs<ReferenceType>()->getPointeeType();
if (T->isObjCLifetimeType()) {
// when lifetime is Qualifiers::OCL_None it means that it has
// no implicit ownership qualifier (which means it is explicit).
Qualifiers::ObjCLifetime lifetime =
T.getLocalQualifiers().getObjCLifetime();
return lifetime == Qualifiers::OCL_None;
}
return true;
}
/// ActOnStartOfObjCMethodDef - This routine sets up parameters; invisible
/// and user declared, in the method definition's AST.
void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
@ -335,11 +313,6 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
RequireCompleteType(Param->getLocation(), Param->getType(),
diag::err_typecheck_decl_incomplete_type))
Param->setInvalidDecl();
if (!Param->isInvalidDecl() &&
getLangOpts().ObjCAutoRefCount &&
!HasExplicitOwnershipAttr(*this, Param))
Diag(Param->getLocation(), diag::warn_arc_strong_pointer_objc_pointer) <<
Param->getType();
if ((*PI)->getIdentifier())
PushOnScopeChains(*PI, FnBodyScope);

View File

@ -3335,6 +3335,36 @@ Sema::GetTypeSourceInfoForDeclarator(Declarator &D, QualType T,
return TInfo;
}
/// checkImplicitObjCParamAttribute - diagnoses when pointer to ObjC pointer
/// has implicit ownership attribute.
static void
checkImplicitObjCParamAttribute(Sema &S, Declarator &D, QualType T) {
if (!S.getLangOpts().ObjCAutoRefCount ||
!S.OriginalLexicalContext ||
(S.OriginalLexicalContext->getDeclKind() != Decl::ObjCImplementation &&
S.OriginalLexicalContext->getDeclKind() != Decl::ObjCCategoryImpl))
return;
if (!T->isObjCIndirectLifetimeType())
return;
if (!T->isPointerType() && !T->isReferenceType())
return;
QualType OrigT = T;
T = T->isPointerType()
? T->getAs<PointerType>()->getPointeeType()
: T->getAs<ReferenceType>()->getPointeeType();
if (T->isObjCLifetimeType()) {
// when lifetime is Qualifiers::OCL_None it means that it has
// no implicit ownership qualifier (which means it is explicit).
Qualifiers::ObjCLifetime lifetime =
T.getLocalQualifiers().getObjCLifetime();
if (lifetime != Qualifiers::OCL_None)
S.Diag(D.getLocStart(), diag::warn_arc_strong_pointer_objc_pointer)
<< OrigT;
}
}
/// \brief Create a LocInfoType to hold the given QualType and TypeSourceInfo.
ParsedType Sema::CreateParsedType(QualType T, TypeSourceInfo *TInfo) {
// FIXME: LocInfoTypes are "transient", only needed for passing to/from Parser
@ -3370,6 +3400,8 @@ TypeResult Sema::ActOnTypeName(Scope *S, Declarator &D) {
// to apply them to the actual parameter declaration.
if (D.getContext() != Declarator::ObjCParameterContext)
checkUnusedDeclAttributes(D);
else
checkImplicitObjCParamAttribute(*this, D, T);
if (getLangOpts().CPlusPlus) {
// Check that there are no default arguments (C++ only).