// RUN: %clang_cc1 -fsyntax-only -verify %s __attribute__((objc_root_class)) @interface RootClass - (void)baseMethod; @end __attribute__((objc_direct_members)) @interface I : RootClass - (void)direct; // expected-note {{direct member declared here}} @end @protocol P - (void)direct; @end @interface I (Cat1)

// expected-error {{category 'Cat1' cannot conform to protocol 'P' because of direct members declared in interface 'I'}} @end @protocol BaseP - (void)baseMethod; @end @interface I (CatBase) // OK @end @protocol P2 - (void)indirect; @end @interface I (Cat2) // OK - (void)indirect; @end @protocol P3 - (void)indirect3; @end @interface I (Cat3) // OK @end @interface ExpDirect : RootClass - (void)direct __attribute__((objc_direct)); // expected-note {{direct member declared here}} - (void)directRecursive __attribute__((objc_direct)); // expected-note {{direct member declared here}} @end @interface ExpDirect (CatExpDirect)

// expected-error {{category 'CatExpDirect' cannot conform to protocol 'P' because of direct members declared in interface 'ExpDirect'}} @end @protocol PRecursive1 - (void)directRecursive; @end @protocol PRecursiveTop @end @interface ExpDirect () // expected-error {{class extension cannot conform to protocol 'PRecursive1' because of direct members declared in interface 'ExpDirect'}} @end @protocol PProp @property (nonatomic, readonly) I *name; @end __attribute__((objc_direct_members)) @interface IProp1 : RootClass @property (nonatomic, readonly) I *name; // expected-note {{direct member declared here}} @end @interface IProp1 () // expected-error {{class extension cannot conform to protocol 'PProp' because of direct members declared in interface 'IProp1'}} @end @protocol PProp2 @property (nonatomic, readonly, class) I *name; @end @interface IProp2 : RootClass @property (nonatomic, readonly, class, direct) I *name; // expected-note {{direct member declared here}} @end @interface IProp2 () // expected-error {{class extension cannot conform to protocol 'PProp2' because of direct members declared in interface 'IProp2'}} @end