|  | // RUN: rm -rf %t | 
|  | // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s | 
|  | // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s -DALT | 
|  | // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s -detailed-preprocessing-record | 
|  | // RUN: not %clang_cc1 -E -fmodules -fimplicit-module-maps -x objective-c -fmodules-cache-path=%t -I %S/Inputs %s | FileCheck -check-prefix CHECK-PREPROCESSED %s | 
|  | // | 
|  | // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -verify -fmodules-cache-path=%t -I %S/Inputs %s | 
|  | // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -verify -fmodules-cache-path=%t -I %S/Inputs %s -DALT | 
|  | // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -verify -fmodules-cache-path=%t -I %S/Inputs %s -detailed-preprocessing-record | 
|  | // RUN: not %clang_cc1 -E -fmodules -fimplicit-module-maps -x objective-c++ -fmodules-cache-path=%t -I %S/Inputs %s | FileCheck -check-prefix CHECK-PREPROCESSED %s | 
|  | // | 
|  | // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -DLOCAL_VISIBILITY -fmodules-local-submodule-visibility -x objective-c++ -verify -fmodules-cache-path=%t -I %S/Inputs %s | 
|  | // FIXME: When we have a syntax for modules in C, use that. | 
|  | // These notes come from headers in modules, and are bogus. | 
|  |  | 
|  | // FIXME: expected-note@Inputs/macros_left.h:11{{previous definition is here}} | 
|  | // FIXME: expected-note@Inputs/macros_right.h:12{{previous definition is here}} | 
|  | // expected-note@Inputs/macros_right.h:12{{expanding this definition of 'LEFT_RIGHT_DIFFERENT'}} | 
|  | // expected-note@Inputs/macros_right.h:13{{expanding this definition of 'LEFT_RIGHT_DIFFERENT2'}} | 
|  | // expected-note@Inputs/macros_left.h:14{{other definition of 'LEFT_RIGHT_DIFFERENT'}} | 
|  |  | 
|  | @import macros; | 
|  |  | 
|  | #ifndef INTEGER | 
|  | #  error INTEGER macro should be visible | 
|  | #endif | 
|  |  | 
|  | #ifdef FLOAT | 
|  | #  error FLOAT macro should not be visible | 
|  | #endif | 
|  |  | 
|  | #ifdef MODULE | 
|  | #  error MODULE macro should not be visible | 
|  | #endif | 
|  |  | 
|  | #ifndef INDIRECTLY_IN_MACROS | 
|  | #  error INDIRECTLY_IN_MACROS should be visible | 
|  | #endif | 
|  |  | 
|  | // CHECK-PREPROCESSED: double d | 
|  | double d; | 
|  | DOUBLE *dp = &d; | 
|  |  | 
|  | #__public_macro WIBBLE // expected-error{{no macro named 'WIBBLE'}} | 
|  |  | 
|  | void f() { | 
|  | // CHECK-PREPROCESSED: int i = INTEGER; | 
|  | int i = INTEGER; // the value was exported, the macro was not. | 
|  | i += macros; // expanded from __MODULE__ within the 'macros' module. | 
|  | } | 
|  |  | 
|  | #ifdef __MODULE__ | 
|  | # error Not building a module! | 
|  | #endif | 
|  |  | 
|  | #if __building_module(macros) | 
|  | # error Not building a module | 
|  | #endif | 
|  |  | 
|  | // None of the modules we depend on have been imported, and therefore | 
|  | // their macros should not be visible. | 
|  | #ifdef LEFT | 
|  | #  error LEFT should not be visible | 
|  | #endif | 
|  |  | 
|  | #ifdef RIGHT | 
|  | #  error RIGHT should not be visible | 
|  | #endif | 
|  |  | 
|  | #ifdef TOP | 
|  | #  error TOP should not be visible | 
|  | #endif | 
|  |  | 
|  | #undef INTEGER | 
|  | #define INTEGER int | 
|  |  | 
|  | // Import left module (which also imports top) | 
|  | @import macros_left; | 
|  |  | 
|  | INTEGER my_integer = 0; | 
|  |  | 
|  | #ifndef LEFT | 
|  | #  error LEFT should be visible | 
|  | #endif | 
|  |  | 
|  | #ifdef RIGHT | 
|  | #  error RIGHT should not be visible | 
|  | #endif | 
|  |  | 
|  | #ifndef TOP | 
|  | #  error TOP should be visible | 
|  | #endif | 
|  |  | 
|  | #ifdef TOP_LEFT_UNDEF | 
|  | #  error TOP_LEFT_UNDEF should not be defined | 
|  | #endif | 
|  |  | 
|  | void test1() { | 
|  | int i; | 
|  | TOP_RIGHT_REDEF *ip = &i; | 
|  | } | 
|  |  | 
|  | #define LEFT_RIGHT_DIFFERENT2 double // FIXME: expected-warning{{'LEFT_RIGHT_DIFFERENT2' macro redefined}} \ | 
|  | // expected-note{{other definition of 'LEFT_RIGHT_DIFFERENT2'}} | 
|  |  | 
|  | // Import right module (which also imports top) | 
|  | @import macros_right; | 
|  |  | 
|  | #undef LEFT_RIGHT_DIFFERENT3 | 
|  |  | 
|  | #ifndef LEFT | 
|  | #  error LEFT should be visible | 
|  | #endif | 
|  |  | 
|  | #ifndef RIGHT | 
|  | #  error RIGHT should be visible | 
|  | #endif | 
|  |  | 
|  | #ifndef TOP | 
|  | #  error TOP should be visible | 
|  | #endif | 
|  |  | 
|  | void test2() { | 
|  | int i; | 
|  | float f; | 
|  | double d; | 
|  | TOP_RIGHT_REDEF *fp = &f; // ok, right's definition overrides top's definition | 
|  |  | 
|  | LEFT_RIGHT_IDENTICAL *ip = &i; | 
|  | LEFT_RIGHT_DIFFERENT *ip2 = &i; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT'}} | 
|  | LEFT_RIGHT_DIFFERENT2 *ip3 = &i; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT2}} | 
|  | int LEFT_RIGHT_DIFFERENT3; | 
|  | } | 
|  |  | 
|  | #define LEFT_RIGHT_DIFFERENT double // FIXME: expected-warning{{'LEFT_RIGHT_DIFFERENT' macro redefined}} | 
|  |  | 
|  | void test3() { | 
|  | double d; | 
|  | LEFT_RIGHT_DIFFERENT *dp = &d; // okay | 
|  | int x = FN_ADD(1,2); | 
|  | } | 
|  |  | 
|  | #ifndef TOP_RIGHT_UNDEF | 
|  | #  error TOP_RIGHT_UNDEF should still be defined | 
|  | #endif | 
|  |  | 
|  | @import macros_bottom; | 
|  |  | 
|  | TOP_DEF_RIGHT_UNDEF *TDRUf() { return TDRUp; } | 
|  |  | 
|  | @import macros_right.undef; | 
|  |  | 
|  | int TOP_DEF_RIGHT_UNDEF; // ok, no longer defined | 
|  |  | 
|  | #ifdef LOCAL_VISIBILITY | 
|  | // TOP_RIGHT_UNDEF should not be undefined, because macros_right.undef does | 
|  | // not undefine macros_right's macro. | 
|  | # ifndef TOP_RIGHT_UNDEF | 
|  | #  error TOP_RIGHT_UNDEF should still be defined | 
|  | # endif | 
|  | #else | 
|  | // When macros_right.undef is built and local submodule visibility is not | 
|  | // enabled, macros_top is visible because the state from building | 
|  | // macros_right leaks through, so macros_right.undef undefines macros_top's | 
|  | // macro. | 
|  | # ifdef TOP_RIGHT_UNDEF | 
|  | #  error TOP_RIGHT_UNDEF should not be defined | 
|  | # endif | 
|  | #endif | 
|  |  | 
|  | #ifdef ALT | 
|  | int tmp = TOP_OTHER_REDEF1; | 
|  | #endif | 
|  |  | 
|  | @import macros_other; | 
|  |  | 
|  | #ifndef TOP_OTHER_UNDEF1 | 
|  | # error TOP_OTHER_UNDEF1 should still be defined | 
|  | #endif | 
|  |  | 
|  | #ifndef TOP_OTHER_UNDEF2 | 
|  | # error TOP_OTHER_UNDEF2 should still be defined | 
|  | #endif | 
|  | #pragma clang __debug macro TOP_OTHER_REDEF1 | 
|  | #ifndef TOP_OTHER_REDEF1 | 
|  | # error TOP_OTHER_REDEF1 should still be defined | 
|  | #endif | 
|  | int n1 = TOP_OTHER_REDEF1; // expected-warning{{ambiguous expansion of macro 'TOP_OTHER_REDEF1'}} | 
|  | // expected-note@macros_other.h:4 {{expanding this definition}} | 
|  | // expected-note@macros_top.h:19 {{other definition}} | 
|  |  | 
|  | #ifndef TOP_OTHER_REDEF2 | 
|  | # error TOP_OTHER_REDEF2 should still be defined | 
|  | #endif | 
|  | int n2 = TOP_OTHER_REDEF2; // ok | 
|  |  | 
|  | int n3 = TOP_OTHER_DEF_RIGHT_UNDEF; // ok |