1 // RUN: mkdir -p %t 2 // RUN: %clang_cc1 -emit-module -o %t/diamond_top.pcm %s -D MODULE_TOP 3 // RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash -emit-module -o %t/diamond_left.pcm %s -D MODULE_LEFT 4 // RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash -emit-module -o %t/diamond_right.pcm %s -D MODULE_RIGHT 5 // RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash -emit-module -o %t/diamond_bottom.pcm %s -D MODULE_BOTTOM 6 // RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash %s -verify 7 8 /*============================================================================*/ 9 #ifdef MODULE_TOP 10 11 @interface Foo 12 @end 13 14 @interface Foo(Top) 15 -(void)top; 16 @end 17 18 /*============================================================================*/ 19 #elif defined(MODULE_LEFT) 20 21 __import_module__ diamond_top; 22 23 @interface Foo(Left) 24 -(void)left; 25 @end 26 27 @interface LeftFoo 28 -(void)left; 29 @end 30 31 @interface Foo(Duplicate) // expected-note {{previous definition}} 32 @end 33 34 @interface Foo(Duplicate) 35 @end 36 37 /*============================================================================*/ 38 #elif defined(MODULE_RIGHT) 39 40 __import_module__ diamond_top; 41 42 @interface Foo(Right1) 43 -(void)right1; 44 @end 45 46 @interface Foo(Right2) 47 -(void)right2; 48 @end 49 50 @interface Foo(Duplicate) // expected-warning {{duplicate definition of category}} 51 @end 52 53 /*============================================================================*/ 54 #elif defined(MODULE_BOTTOM) 55 56 __import_module__ diamond_left; 57 58 @interface Foo(Bottom) 59 -(void)bottom; 60 @end 61 62 __import_module__ diamond_right; 63 64 @interface LeftFoo(Bottom) 65 -(void)bottom; 66 @end 67 68 /*============================================================================*/ 69 #else 70 71 __import_module__ diamond_bottom; 72 73 @interface Foo(Source) 74 -(void)source; 75 @end 76 77 void test(Foo *foo, LeftFoo *leftFoo) { 78 [foo source]; 79 [foo bottom]; 80 [foo left]; 81 [foo right1]; 82 [foo right2]; 83 [foo top]; 84 85 [leftFoo left]; 86 [leftFoo bottom]; 87 } 88 89 #endif 90