forked from OSchip/llvm-project
Move no explicit ownership warning to SemaType.cpp.
// rdar://12280826 llvm-svn: 163813
This commit is contained in:
parent
12c7799c55
commit
bf38d880d6
|
@ -282,28 +282,6 @@ void Sema::AddAnyMethodToGlobalPool(Decl *D) {
|
||||||
AddFactoryMethodToGlobalPool(MDecl, true);
|
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
|
/// ActOnStartOfObjCMethodDef - This routine sets up parameters; invisible
|
||||||
/// and user declared, in the method definition's AST.
|
/// and user declared, in the method definition's AST.
|
||||||
void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
|
void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
|
||||||
|
@ -335,11 +313,6 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
|
||||||
RequireCompleteType(Param->getLocation(), Param->getType(),
|
RequireCompleteType(Param->getLocation(), Param->getType(),
|
||||||
diag::err_typecheck_decl_incomplete_type))
|
diag::err_typecheck_decl_incomplete_type))
|
||||||
Param->setInvalidDecl();
|
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())
|
if ((*PI)->getIdentifier())
|
||||||
PushOnScopeChains(*PI, FnBodyScope);
|
PushOnScopeChains(*PI, FnBodyScope);
|
||||||
|
|
|
@ -3335,6 +3335,36 @@ Sema::GetTypeSourceInfoForDeclarator(Declarator &D, QualType T,
|
||||||
return TInfo;
|
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.
|
/// \brief Create a LocInfoType to hold the given QualType and TypeSourceInfo.
|
||||||
ParsedType Sema::CreateParsedType(QualType T, TypeSourceInfo *TInfo) {
|
ParsedType Sema::CreateParsedType(QualType T, TypeSourceInfo *TInfo) {
|
||||||
// FIXME: LocInfoTypes are "transient", only needed for passing to/from Parser
|
// 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.
|
// to apply them to the actual parameter declaration.
|
||||||
if (D.getContext() != Declarator::ObjCParameterContext)
|
if (D.getContext() != Declarator::ObjCParameterContext)
|
||||||
checkUnusedDeclAttributes(D);
|
checkUnusedDeclAttributes(D);
|
||||||
|
else
|
||||||
|
checkImplicitObjCParamAttribute(*this, D, T);
|
||||||
|
|
||||||
if (getLangOpts().CPlusPlus) {
|
if (getLangOpts().CPlusPlus) {
|
||||||
// Check that there are no default arguments (C++ only).
|
// Check that there are no default arguments (C++ only).
|
||||||
|
|
Loading…
Reference in New Issue