From a1a32f7f5966edf47c1e22bcbeb2a09bc462ff0b Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Thu, 13 Sep 2012 18:53:14 +0000 Subject: [PATCH] Move back the stuff about missing ownership attribute warning to SemaDeclObjC and apply some simplification per John's comment. // rdar://12280826 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163824 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclObjC.cpp | 27 +++++++++++++++++++++++++++ lib/Sema/SemaType.cpp | 32 -------------------------------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index e80cc82482..bf7755fbdf 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -282,6 +282,28 @@ 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->isPointerType() && !T->isReferenceType()) + return true; + + if (const PointerType *PT = T->getAs()) { + T = PT->getPointeeType(); + } else if (const ReferenceType *RT = T->getAs()) { + T = RT->getPointeeType(); + } else { + return true; + } + + // If we have a lifetime qualifier, but it's local, we must have + // inferred it. So, it is implicit. + return !T.getLocalQualifiers().hasObjCLifetime(); +} + /// ActOnStartOfObjCMethodDef - This routine sets up parameters; invisible /// and user declared, in the method definition's AST. void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) { @@ -313,6 +335,11 @@ 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 dc7dc04c48..39d367f079 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -3335,36 +3335,6 @@ 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 @@ -3400,8 +3370,6 @@ 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). -- 2.40.0