]> granicus.if.org Git - clang/commitdiff
Move no explicit ownership warning to SemaType.cpp.
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 13 Sep 2012 17:29:07 +0000 (17:29 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 13 Sep 2012 17:29:07 +0000 (17:29 +0000)
// rdar://12280826

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163813 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclObjC.cpp
lib/Sema/SemaType.cpp

index 2dc2b0cba1b4206fa37eccb2cc1da586316cc493..e80cc824823f62f3b46b36e77f7a9793fe6dfc08 100644 (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);
index 39d367f07930753da8d82d3a49327afaceaddc94..dc7dc04c48ff2c50ced87479d473bd115a74688c 100644 (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).