| // RUN: mkdir -p %t |
| // RUN: %clang_cc1 -emit-module -o %t/diamond_top.pcm %s -D MODULE_TOP |
| // RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash -emit-module -o %t/diamond_left.pcm %s -D MODULE_LEFT |
| // RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash -emit-module -o %t/diamond_right.pcm %s -D MODULE_RIGHT |
| // RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash -emit-module -o %t/diamond_bottom.pcm %s -D MODULE_BOTTOM |
| // RUN: %clang_cc1 -fmodule-cache-path %t -fdisable-module-hash %s -verify |
| |
| /*============================================================================*/ |
| #ifdef MODULE_TOP |
| |
| @interface Foo |
| @end |
| |
| @interface Foo(Top) |
| -(void)top; |
| @end |
| |
| /*============================================================================*/ |
| #elif defined(MODULE_LEFT) |
| |
| __import_module__ diamond_top; |
| |
| @interface Foo(Left) |
| -(void)left; |
| @end |
| |
| @interface LeftFoo |
| -(void)left; |
| @end |
| |
| @interface Foo(Duplicate) // expected-note {{previous definition}} |
| @end |
| |
| @interface Foo(Duplicate) |
| @end |
| |
| /*============================================================================*/ |
| #elif defined(MODULE_RIGHT) |
| |
| __import_module__ diamond_top; |
| |
| @interface Foo(Right1) |
| -(void)right1; |
| @end |
| |
| @interface Foo(Right2) |
| -(void)right2; |
| @end |
| |
| @interface Foo(Duplicate) // expected-warning {{duplicate definition of category}} |
| @end |
| |
| /*============================================================================*/ |
| #elif defined(MODULE_BOTTOM) |
| |
| __import_module__ diamond_left; |
| |
| @interface Foo(Bottom) |
| -(void)bottom; |
| @end |
| |
| __import_module__ diamond_right; |
| |
| @interface LeftFoo(Bottom) |
| -(void)bottom; |
| @end |
| |
| /*============================================================================*/ |
| #else |
| |
| __import_module__ diamond_bottom; |
| |
| @interface Foo(Source) |
| -(void)source; |
| @end |
| |
| void test(Foo *foo, LeftFoo *leftFoo) { |
| [foo source]; |
| [foo bottom]; |
| [foo left]; |
| [foo right1]; |
| [foo right2]; |
| [foo top]; |
| |
| [leftFoo left]; |
| [leftFoo bottom]; |
| } |
| |
| #endif |