mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-09 19:03:27 +00:00
objc-gc: More sema work for properties declared 'weak'
in GC mode. // rdar://10073896 llvm-svn: 139235
This commit is contained in:
parent
4ff93f3bc2
commit
eebdb67420
@ -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"
|
||||
|
@ -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
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
@interface INTF
|
||||
{
|
||||
id IVAR;
|
||||
id IVAR; // expected-note {{ivar is declared here}}
|
||||
__weak id II;
|
||||
__weak id WID;
|
||||
id ID;
|
||||
|
Loading…
x
Reference in New Issue
Block a user