// RUN: %clang_cc1 -fsyntax-only -fblocks -fobjc-arc -verify -Wno-objc-root-class %s // rdar://8843524 struct A { id x[4]; id y; }; union u { id u; }; // Volatile fields are fine. struct C { volatile int x[4]; volatile int y; }; union u_trivial_c { volatile int b; struct C c; }; @interface I { struct A a; struct B { id y[10][20]; id z; } b; union u c; }; @end // rdar://10260525 struct r10260525 { id (^block) (); }; struct S { id __attribute__((objc_ownership(none))) i; void * vp; int i1; }; // rdar://9046528 @class NSError; __autoreleasing id X; // expected-error {{global variables cannot have __autoreleasing ownership}} __autoreleasing NSError *E; // expected-error {{global variables cannot have __autoreleasing ownership}} extern id __autoreleasing X1; // expected-error {{global variables cannot have __autoreleasing ownership}} void func() { id X; static id __autoreleasing X1; // expected-error {{global variables cannot have __autoreleasing ownership}} extern id __autoreleasing E; // expected-error {{global variables cannot have __autoreleasing ownership}} } // rdar://9157348 // rdar://15757510 @interface J @property (retain) id newFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-newFoo' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} @property (strong) id copyBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-copyBar' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} @property (copy) id allocBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-allocBaz' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} @property (copy, nonatomic) id new; @property (retain) id newDFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-newDFoo' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} @property (strong) id copyDBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-copyDBar' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} @property (copy) id allocDBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note{{explicitly declare getter '-allocDBaz' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} @end @implementation J @synthesize newFoo; @synthesize copyBar; @synthesize allocBaz; @synthesize new; - new {return 0; }; @dynamic newDFoo; @dynamic copyDBar; @dynamic allocDBaz; @end @interface MethodFamilyDiags @property (retain) id newFoo; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} - (id)newFoo; // expected-note {{explicitly declare getter '-newFoo' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} #define OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none))) - (id)newBar; // expected-note {{explicitly declare getter '-newBar' with 'OBJC_METHOD_FAMILY_NONE' to return an 'unowned' object}} @property (retain) id newBar; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} @property (retain) id newBaz; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note {{explicitly declare getter '-newBaz' with 'OBJC_METHOD_FAMILY_NONE' to return an 'unowned' object}} #undef OBJC_METHOD_FAMILY_NONE @property (retain, readonly) id newGarply; // expected-error {{property follows Cocoa naming convention for returning 'owned' objects}} expected-note {{explicitly declare getter '-newGarply' with '__attribute__((objc_method_family(none)))' to return an 'unowned' object}} @end @interface MethodFamilyDiags (Redeclarations) - (id)newGarply; // no note here @end @implementation MethodFamilyDiags @synthesize newGarply; @end // rdar://10187884 @interface Super - (void)bar:(id)b; // expected-note {{parameter declared here}} - (void)bar1:(id) __attribute((ns_consumed)) b; - (void)ok:(id) __attribute((ns_consumed)) b; - (id)ns_non; // expected-note {{method declared here}} - (id)not_ret:(id) b __attribute((ns_returns_not_retained)); // expected-note {{method declared here}} - (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained)); @end @interface Sub : Super - (void)bar:(id) __attribute((ns_consumed)) b; // expected-error {{overriding method has mismatched ns_consumed attribute on its parameter}} - (void)bar1:(id)b; - (void)ok:(id) __attribute((ns_consumed)) b; - (id)ns_non __attribute((ns_returns_not_retained)); // expected-error {{overriding method has mismatched ns_returns_not_retained attributes}} - (id)not_ret:(id) b __attribute((ns_returns_retained)); // expected-error {{overriding method has mismatched ns_returns_retained attributes}} - (id)both__returns_not_retained:(id) b __attribute((ns_returns_not_retained)); // rdar://12173491 @property (copy, nonatomic) __attribute__((ns_returns_retained)) id (^fblock)(void); @end // Test that we give a good diagnostic here that mentions the missing // ownership qualifier. We don't want this to get suppressed because // of an invalid conversion. void test7(void) { id x; id *px = &x; // expected-error {{pointer to non-const type 'id' with no explicit ownership}} I *y; J **py = &y; // expected-error {{pointer to non-const type 'J *' with no explicit ownership}} expected-warning {{incompatible pointer types initializing}} } void func(void) __attribute__((objc_ownership(none))); // expected-warning {{'objc_ownership' only applies to Objective-C object or block pointer types; type here is 'void (void)'}} struct __attribute__((objc_ownership(none))) S2 {}; // expected-error {{'objc_ownership' attribute only applies to variables}} @interface I2 @property __attribute__((objc_ownership(frob))) id i; // expected-warning {{'objc_ownership' attribute argument not supported: 'frob'}} @end // rdar://15304886 @interface NSObject @end @interface ControllerClass : NSObject @end @interface SomeClassOwnedByController @property (readonly) ControllerClass *controller; // expected-note {{property declared here}} // rdar://15465916 @property (readonly, weak) ControllerClass *weak_controller; @end @interface SomeClassOwnedByController () @property (readwrite, weak) ControllerClass *controller; // expected-warning {{primary property declaration is implicitly strong while redeclaration in class extension is weak}} @property (readwrite, weak) ControllerClass *weak_controller; @end @interface I3 @end @interface D3 : I3 @end @interface D3 (Cat1) - (id)method; @end @interface I3 (Cat2) // FIXME: clang should diagnose mismatch between methods in D3(Cat1) and // I3(Cat2). - (id)method __attribute__((ns_returns_retained)); @end @implementation D3 - (id)method { return (id)0; } @end