| // Checks that macros from transitive imports work with local submodule |
| // visibility. In the below test, previously a() and d() failed because |
| // OTHER_MACRO1 and OTHER_MACRO3 were not visible at the use site. |
| |
| // RUN: rm -rf %t |
| // RUN: split-file %s %t |
| // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t \ |
| // RUN: -fmodules-local-submodule-visibility -I%t %t/tu.c -verify |
| |
| //--- Other1.h |
| #define OTHER_MACRO1(...) |
| |
| //--- Other2.h |
| #define OTHER_MACRO2(...) |
| |
| //--- Other3.h |
| #define OTHER_MACRO3(...) |
| |
| //--- module.modulemap |
| module Other { |
| module O1 { header "Other1.h" } |
| module O2 { header "Other2.h" } |
| module O3 { header "Other3.h" } |
| } |
| |
| //--- Top/A.h |
| #include "Other1.h" |
| #define MACRO_A OTHER_MACRO1(x, y) |
| |
| //--- Top/B.h |
| #include "Other2.h" |
| #define MACRO_B OTHER_MACRO2(x, y) |
| |
| //--- Top/C.h |
| #include "D.h" |
| |
| //--- Top/D.h |
| #include "Other3.h" |
| #define MACRO_D OTHER_MACRO3(x, y) |
| |
| //--- Top/Top.h |
| #include "A.h" |
| #include "B.h" |
| #include "C.h" |
| |
| void a() MACRO_A; |
| void b() MACRO_B; |
| void d() MACRO_D; |
| |
| //--- Top/module.modulemap |
| module Top { |
| umbrella header "Top.h" |
| module A { header "A.h" export * } |
| module D { header "D.h" export * } |
| module * { export * } |
| export * |
| export Other.O3 |
| } |
| |
| //--- tu.c |
| #include "Top/Top.h" |
| // expected-no-diagnostics |