From: Fariborz Jahanian Date: Thu, 13 Sep 2012 17:29:07 +0000 (+0000) Subject: Move no explicit ownership warning to SemaType.cpp. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ca5c4c9bfeb4b1ac645b04723c0319b0fc96073e;p=clang Move no explicit ownership warning to SemaType.cpp. // rdar://12280826 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163813 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 2dc2b0cba1..e80cc82482 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/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/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 39d367f079..dc7dc04c48 100644 --- a/lib/Sema/SemaType.cpp +++ b/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).