1 // RUN: rm -rf %t 2 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s 3 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s -DALT 4 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c -verify -fmodules-cache-path=%t -I %S/Inputs %s -detailed-preprocessing-record 5 // 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 6 // 7 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -verify -fmodules-cache-path=%t -I %S/Inputs %s 8 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -verify -fmodules-cache-path=%t -I %S/Inputs %s -DALT 9 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -verify -fmodules-cache-path=%t -I %S/Inputs %s -detailed-preprocessing-record 10 // 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 11 // 12 // 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 13 // FIXME: When we have a syntax for modules in C, use that. 14 // These notes come from headers in modules, and are bogus. 15 16 // FIXME: expected-note@Inputs/macros_left.h:11{{previous definition is here}} 17 // FIXME: expected-note@Inputs/macros_right.h:12{{previous definition is here}} 18 // expected-note@Inputs/macros_right.h:12{{expanding this definition of 'LEFT_RIGHT_DIFFERENT'}} 19 // expected-note@Inputs/macros_right.h:13{{expanding this definition of 'LEFT_RIGHT_DIFFERENT2'}} 20 // expected-note@Inputs/macros_left.h:14{{other definition of 'LEFT_RIGHT_DIFFERENT'}} 21 22 @import macros; 23 24 #ifndef INTEGER 25 # error INTEGER macro should be visible 26 #endif 27 28 #ifdef FLOAT 29 # error FLOAT macro should not be visible 30 #endif 31 32 #ifdef MODULE 33 # error MODULE macro should not be visible 34 #endif 35 36 #ifndef INDIRECTLY_IN_MACROS 37 # error INDIRECTLY_IN_MACROS should be visible 38 #endif 39 40 // CHECK-PREPROCESSED: double d 41 double d; 42 DOUBLE *dp = &d; 43 44 #__public_macro WIBBLE // expected-error{{no macro named 'WIBBLE'}} 45 46 void f() { 47 // CHECK-PREPROCESSED: int i = INTEGER; 48 int i = INTEGER; // the value was exported, the macro was not. 49 i += macros; // expanded from __MODULE__ within the 'macros' module. 50 } 51 52 #ifdef __MODULE__ 53 # error Not building a module! 54 #endif 55 56 #if __building_module(macros) 57 # error Not building a module 58 #endif 59 60 // None of the modules we depend on have been imported, and therefore 61 // their macros should not be visible. 62 #ifdef LEFT 63 # error LEFT should not be visible 64 #endif 65 66 #ifdef RIGHT 67 # error RIGHT should not be visible 68 #endif 69 70 #ifdef TOP 71 # error TOP should not be visible 72 #endif 73 74 #undef INTEGER 75 #define INTEGER int 76 77 // Import left module (which also imports top) 78 @import macros_left; 79 80 INTEGER my_integer = 0; 81 82 #ifndef LEFT 83 # error LEFT should be visible 84 #endif 85 86 #ifdef RIGHT 87 # error RIGHT should not be visible 88 #endif 89 90 #ifndef TOP 91 # error TOP should be visible 92 #endif 93 94 #ifdef TOP_LEFT_UNDEF 95 # error TOP_LEFT_UNDEF should not be defined 96 #endif 97 98 void test1() { 99 int i; 100 TOP_RIGHT_REDEF *ip = &i; 101 } 102 103 #define LEFT_RIGHT_DIFFERENT2 double // FIXME: expected-warning{{'LEFT_RIGHT_DIFFERENT2' macro redefined}} \ 104 // expected-note{{other definition of 'LEFT_RIGHT_DIFFERENT2'}} 105 106 // Import right module (which also imports top) 107 @import macros_right; 108 109 #undef LEFT_RIGHT_DIFFERENT3 110 111 #ifndef LEFT 112 # error LEFT should be visible 113 #endif 114 115 #ifndef RIGHT 116 # error RIGHT should be visible 117 #endif 118 119 #ifndef TOP 120 # error TOP should be visible 121 #endif 122 123 void test2() { 124 int i; 125 float f; 126 double d; 127 TOP_RIGHT_REDEF *fp = &f; // ok, right's definition overrides top's definition 128 129 LEFT_RIGHT_IDENTICAL *ip = &i; 130 LEFT_RIGHT_DIFFERENT *ip2 = &i; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT'}} 131 LEFT_RIGHT_DIFFERENT2 *ip3 = &i; // expected-warning{{ambiguous expansion of macro 'LEFT_RIGHT_DIFFERENT2}} 132 int LEFT_RIGHT_DIFFERENT3; 133 } 134 135 #define LEFT_RIGHT_DIFFERENT double // FIXME: expected-warning{{'LEFT_RIGHT_DIFFERENT' macro redefined}} 136 137 void test3() { 138 double d; 139 LEFT_RIGHT_DIFFERENT *dp = &d; // okay 140 int x = FN_ADD(1,2); 141 } 142 143 #ifndef TOP_RIGHT_UNDEF 144 # error TOP_RIGHT_UNDEF should still be defined 145 #endif 146 147 @import macros_bottom; 148 149 TOP_DEF_RIGHT_UNDEF *TDRUf() { return TDRUp; } 150 151 @import macros_right.undef; 152 153 int TOP_DEF_RIGHT_UNDEF; // ok, no longer defined 154 155 #ifdef LOCAL_VISIBILITY 156 // TOP_RIGHT_UNDEF should not be undefined, because macros_right.undef does 157 // not undefine macros_right's macro. 158 # ifndef TOP_RIGHT_UNDEF 159 # error TOP_RIGHT_UNDEF should still be defined 160 # endif 161 #else 162 // When macros_right.undef is built and local submodule visibility is not 163 // enabled, macros_top is visible because the state from building 164 // macros_right leaks through, so macros_right.undef undefines macros_top's 165 // macro. 166 # ifdef TOP_RIGHT_UNDEF 167 # error TOP_RIGHT_UNDEF should not be defined 168 # endif 169 #endif 170 171 #ifdef ALT 172 int tmp = TOP_OTHER_REDEF1; 173 #endif 174 175 @import macros_other; 176 177 #ifndef TOP_OTHER_UNDEF1 178 # error TOP_OTHER_UNDEF1 should still be defined 179 #endif 180 181 #ifndef TOP_OTHER_UNDEF2 182 # error TOP_OTHER_UNDEF2 should still be defined 183 #endif 184 #pragma clang __debug macro TOP_OTHER_REDEF1 185 #ifndef TOP_OTHER_REDEF1 186 # error TOP_OTHER_REDEF1 should still be defined 187 #endif 188 int n1 = TOP_OTHER_REDEF1; // expected-warning{{ambiguous expansion of macro 'TOP_OTHER_REDEF1'}} 189 // expected-note@macros_other.h:4 {{expanding this definition}} 190 // expected-note@macros_top.h:19 {{other definition}} 191 192 #ifndef TOP_OTHER_REDEF2 193 # error TOP_OTHER_REDEF2 should still be defined 194 #endif 195 int n2 = TOP_OTHER_REDEF2; // ok 196 197 int n3 = TOP_OTHER_DEF_RIGHT_UNDEF; // ok 198