objc-gc: More sema work for properties declared 'weak'

in GC mode. // rdar://10073896

llvm-svn: 139235
This commit is contained in:
Fariborz Jahanian 2011-09-07 16:24:21 +00:00
parent 4ff93f3bc2
commit eebdb67420
3 changed files with 17 additions and 7 deletions

View File

@ -549,6 +549,9 @@ def err_arc_perform_selector_retains : Error<
def warn_arc_perform_selector_leaks : Warning<
"performSelector may cause a leak because its selector is unknown">,
InGroup<DiagGroup<"arc-performSelector-leaks">>;
def err_gc_weak_property_strong_type : Error<
"weak attribute declared on a __strong type property"
"in GC mode">;
def error_synthesized_ivar_yet_not_supported : Error<
"instance variable synthesis not yet supported"

View File

@ -594,12 +594,18 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
ObjCPropertyDecl::PropertyAttributeKind kind
= property->getPropertyAttributes();
QualType PropType = Context.getCanonicalType(property->getType());
bool PropertyIsGCWeak = (kind & ObjCPropertyDecl::OBJC_PR_weak &&
!getLangOptions().ObjCAutoRefCount &&
getLangOptions().getGCMode() !=
LangOptions::NonGC);
if (PropertyIsGCWeak && !PropType.isObjCGCStrong())
PropType = Context.getObjCGCQualType(PropType, Qualifiers::Weak);
if ((kind & ObjCPropertyDecl::OBJC_PR_weak) &&
!getLangOptions().ObjCAutoRefCount &&
getLangOptions().getGCMode() != LangOptions::NonGC) {
if (PropType.isObjCGCStrong()) {
Diag(PropertyLoc,
diag::err_gc_weak_property_strong_type);
Diag(property->getLocation(), diag::note_property_declare);
}
else
PropType = Context.getObjCGCQualType(PropType, Qualifiers::Weak);
}
QualType PropertyIvarType = PropType;
if (PropType->isReferenceType())
PropertyIvarType = cast<ReferenceType>(PropType)->getPointeeType();
@ -721,6 +727,7 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S,
getLangOptions().getGCMode() != LangOptions::NonGC)) {
Diag(PropertyLoc, diag::error_weak_property)
<< property->getDeclName() << Ivar->getDeclName();
Diag(Ivar->getLocation(), diag::note_ivar_decl);
// Fall thru - see previous comment
}
// Fall thru - see previous comment

View File

@ -3,7 +3,7 @@
@interface INTF
{
id IVAR;
id IVAR; // expected-note {{ivar is declared here}}
__weak id II;
__weak id WID;
id ID;