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