diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2012-09-13 18:53:14 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2012-09-13 18:53:14 +0000 |
commit | 1dfeacefbce9b49df419ee432b038db29227d705 (patch) | |
tree | 75335304a9a727cf667f20197e15d89393fe75b2 | |
parent | 147a1fe15f0d437da8c64900992d0785b05fabd1 (diff) | |
download | bcm5719-llvm-1dfeacefbce9b49df419ee432b038db29227d705.tar.gz bcm5719-llvm-1dfeacefbce9b49df419ee432b038db29227d705.zip |
Move back the stuff about missing ownership attribute warning
to SemaDeclObjC and apply some simplification per John's
comment. // rdar://12280826
llvm-svn: 163824
-rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 27 | ||||
-rw-r--r-- | clang/lib/Sema/SemaType.cpp | 32 |
2 files changed, 27 insertions, 32 deletions
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index e80cc824823..bf7755fbdf8 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/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<PointerType>()) { + T = PT->getPointeeType(); + } else if (const ReferenceType *RT = T->getAs<ReferenceType>()) { + 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/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index dc7dc04c48f..39d367f0793 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/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<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 @@ -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). |