1*67e74705SXin Li // RUN: rm -rf %t 2*67e74705SXin Li // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s 3*67e74705SXin Li // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-local-submodule-visibility -x objective-c++ -verify -fmodules-cache-path=%t -I %S/Inputs %s -DLOCAL_VISIBILITY 4*67e74705SXin Li 5*67e74705SXin Li // This test checks some of the same things as macros.c, but imports modules in 6*67e74705SXin Li // a different order. 7*67e74705SXin Li 8*67e74705SXin Li @import macros_other; 9*67e74705SXin Li 10*67e74705SXin Li int n0 = TOP_OTHER_DEF_RIGHT_UNDEF; // ok 11*67e74705SXin Li 12*67e74705SXin Li @import macros_top; 13*67e74705SXin Li 14*67e74705SXin Li TOP_OTHER_DEF_RIGHT_UNDEF *n0b; // expected-warning{{ambiguous expansion of macro 'TOP_OTHER_DEF_RIGHT_UNDEF'}} 15*67e74705SXin Li // expected-note@macros_top.h:22 {{expanding this definition of 'TOP_OTHER_DEF_RIGHT_UNDEF'}} 16*67e74705SXin Li // expected-note@macros_other.h:6 {{other definition of 'TOP_OTHER_DEF_RIGHT_UNDEF'}} 17*67e74705SXin Li 18*67e74705SXin Li @import macros_right; 19*67e74705SXin Li @import macros_left; 20*67e74705SXin Li 21*67e74705SXin Li #ifdef TOP_LEFT_UNDEF 22*67e74705SXin Li # error TOP_LEFT_UNDEF should not be defined 23*67e74705SXin Li #endif 24*67e74705SXin Li 25*67e74705SXin Li #ifndef TOP_RIGHT_UNDEF 26*67e74705SXin Li # error TOP_RIGHT_UNDEF should still be defined 27*67e74705SXin Li #endif 28*67e74705SXin Li test()29*67e74705SXin Livoid test() { 30*67e74705SXin Li float f; 31*67e74705SXin Li TOP_RIGHT_REDEF *fp = &f; // ok, right's definition overrides top's definition 32*67e74705SXin Li 33*67e74705SXin Li // Note, left's definition wins here, whereas right's definition wins in 34*67e74705SXin Li // macros.c. 35*67e74705SXin Li int i; 36*67e74705SXin Li LEFT_RIGHT_IDENTICAL *ip = &i; 37*67e74705SXin Li LEFT_RIGHT_DIFFERENT *ip2 = &f; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT'}} 38*67e74705SXin Li // expected-note@macros_left.h:14 {{expanding this}} 39*67e74705SXin Li // expected-note@macros_right.h:12 {{other}} 40*67e74705SXin Li LEFT_RIGHT_DIFFERENT2 *ip3 = &f; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT2}} 41*67e74705SXin Li // expected-note@macros_left.h:11 {{expanding this}} 42*67e74705SXin Li // expected-note@macros_right.h:13 {{other}} 43*67e74705SXin Li #undef LEFT_RIGHT_DIFFERENT3 44*67e74705SXin Li int LEFT_RIGHT_DIFFERENT3; 45*67e74705SXin Li } 46*67e74705SXin Li 47*67e74705SXin Li @import macros_right.undef; 48*67e74705SXin Li 49*67e74705SXin Li // See macros.c. 50*67e74705SXin Li #ifdef LOCAL_VISIBILITY 51*67e74705SXin Li # ifndef TOP_RIGHT_UNDEF 52*67e74705SXin Li # error TOP_RIGHT_UNDEF should still be defined 53*67e74705SXin Li # endif 54*67e74705SXin Li #else 55*67e74705SXin Li # ifdef TOP_RIGHT_UNDEF 56*67e74705SXin Li # error TOP_RIGHT_UNDEF should not be defined 57*67e74705SXin Li # endif 58*67e74705SXin Li #endif 59*67e74705SXin Li 60*67e74705SXin Li #ifndef TOP_OTHER_UNDEF1 61*67e74705SXin Li # error TOP_OTHER_UNDEF1 should still be defined 62*67e74705SXin Li #endif 63*67e74705SXin Li 64*67e74705SXin Li #ifndef TOP_OTHER_UNDEF2 65*67e74705SXin Li # error TOP_OTHER_UNDEF2 should still be defined 66*67e74705SXin Li #endif 67*67e74705SXin Li 68*67e74705SXin Li #ifndef TOP_OTHER_REDEF1 69*67e74705SXin Li # error TOP_OTHER_REDEF1 should still be defined 70*67e74705SXin Li #endif 71*67e74705SXin Li int n1 = TOP_OTHER_REDEF1; // expected-warning{{ambiguous expansion of macro 'TOP_OTHER_REDEF1'}} 72*67e74705SXin Li // expected-note@macros_top.h:19 {{expanding this definition}} 73*67e74705SXin Li // expected-note@macros_other.h:4 {{other definition}} 74*67e74705SXin Li 75*67e74705SXin Li #ifndef TOP_OTHER_REDEF2 76*67e74705SXin Li # error TOP_OTHER_REDEF2 should still be defined 77*67e74705SXin Li #endif 78*67e74705SXin Li int n2 = TOP_OTHER_REDEF2; // ok 79*67e74705SXin Li 80*67e74705SXin Li int n3 = TOP_OTHER_DEF_RIGHT_UNDEF; // ok 81*67e74705SXin Li 82*67e74705SXin Li int top_redef_in_submodules = TOP_REDEF_IN_SUBMODULES; 83*67e74705SXin Li @import macros_top.c; test2()84*67e74705SXin Livoid test2() { 85*67e74705SXin Li int TOP_REDEF_IN_SUBMODULES = top_redef_in_submodules; 86*67e74705SXin Li } 87