Diagnose gc attribute mismatch of property and its ivar.
llvm-svn: 65656
This commit is contained in:
parent
c08336adc3
commit
f5c1c923e8
|
@ -211,6 +211,10 @@ DIAG(error_missing_property_ivar_decl, ERROR,
|
|||
" ivar or must explicitly name an ivar")
|
||||
DIAG(error_property_ivar_type, ERROR,
|
||||
"type of property %0 does not match type of ivar %1")
|
||||
DIAG(error_weak_property, ERROR,
|
||||
"existing ivar %1 for __weak property %0 must be __weak")
|
||||
DIAG(error_strong_property, ERROR,
|
||||
"existing ivar %1 for a __strong property %0 must be garbage collectable")
|
||||
DIAG(error_dynamic_property_ivar_decl, ERROR,
|
||||
"dynamic property can not have ivar specification")
|
||||
DIAG(error_duplicate_ivar_use, ERROR,
|
||||
|
|
|
@ -1751,6 +1751,18 @@ Sema::DeclTy *Sema::ActOnPropertyImplDecl(SourceLocation AtLoc,
|
|||
<< property->getDeclName() << Ivar->getDeclName();
|
||||
return 0;
|
||||
}
|
||||
// __weak is explicit. So it works on Canonical type.
|
||||
if (PropType.isObjCGCWeak() && !IvarType.isObjCGCWeak()) {
|
||||
Diag(PropertyLoc, diag::error_weak_property)
|
||||
<< property->getDeclName() << Ivar->getDeclName();
|
||||
return 0;
|
||||
}
|
||||
if ((Context.isObjCObjectPointerType(property->getType()) ||
|
||||
PropType.isObjCGCStrong()) && IvarType.isObjCGCWeak()) {
|
||||
Diag(PropertyLoc, diag::error_strong_property)
|
||||
<< property->getDeclName() << Ivar->getDeclName();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (PropertyIvar) {
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
// RUN: clang -fobjc-gc -fsyntax-only -verify %s
|
||||
|
||||
@interface INTF
|
||||
{
|
||||
id IVAR;
|
||||
__weak id II;
|
||||
__weak id WID;
|
||||
id ID;
|
||||
__weak INTF* AWEAK;
|
||||
__weak INTF* WI;
|
||||
}
|
||||
@property (assign) __weak id pweak;
|
||||
@property (assign) __weak id WID;
|
||||
@property (assign) __strong id not;
|
||||
@property (assign) id ID;
|
||||
@property (assign) INTF* AWEAK;
|
||||
@property (assign) __weak INTF* WI;
|
||||
@end
|
||||
|
||||
@implementation INTF
|
||||
@synthesize pweak=IVAR; // expected-error {{existing ivar 'IVAR' for __weak property 'pweak' must be __weak}}
|
||||
@synthesize not=II; // expected-error {{existing ivar 'II' for a __strong property 'not' must be garbage collectable}}
|
||||
@synthesize WID;
|
||||
@synthesize ID;
|
||||
@synthesize AWEAK; // expected-error {{existing ivar 'AWEAK' for a __strong property 'AWEAK' must be garbage collectable}}
|
||||
@synthesize WI;
|
||||
@end
|
Loading…
Reference in New Issue