From bf38d880d6b9298c7c6d6789de4c302e8b244e8f Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Thu, 13 Sep 2012 17:29:07 +0000 Subject: [PATCH] Move no explicit ownership warning to SemaType.cpp. // rdar://12280826 llvm-svn: 163813 --- clang/lib/Sema/SemaDeclObjC.cpp | 27 --------------------------- clang/lib/Sema/SemaType.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 2dc2b0cba1b4..e80cc824823f 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -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()->getPointeeType() - : T->getAs()->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); diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 39d367f07930..dc7dc04c48ff 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -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()->getPointeeType() + : T->getAs()->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).