1*67e74705SXin Li // RUN: rm -rf %t 2*67e74705SXin Li // RUN: cd %S 3*67e74705SXin Li // 4*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \ 5*67e74705SXin Li // RUN: -v \ 6*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/a/quote \ 7*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/a/system \ 8*67e74705SXin Li // RUN: -fno-implicit-modules \ 9*67e74705SXin Li // RUN: -fmodule-map-file-home-is-cwd \ 10*67e74705SXin Li // RUN: -emit-module -fmodule-name=a -o %t/a.pcm \ 11*67e74705SXin Li // RUN: Inputs/macro-ambiguity/module.modulemap 12*67e74705SXin Li // 13*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \ 14*67e74705SXin Li // RUN: -v \ 15*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/b/quote \ 16*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/b/system \ 17*67e74705SXin Li // RUN: -fno-implicit-modules \ 18*67e74705SXin Li // RUN: -fmodule-map-file-home-is-cwd \ 19*67e74705SXin Li // RUN: -emit-module -fmodule-name=b -o %t/b.pcm \ 20*67e74705SXin Li // RUN: Inputs/macro-ambiguity/module.modulemap 21*67e74705SXin Li // 22*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \ 23*67e74705SXin Li // RUN: -v \ 24*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/c/quote \ 25*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/c/system \ 26*67e74705SXin Li // RUN: -fno-implicit-modules \ 27*67e74705SXin Li // RUN: -fmodule-map-file-home-is-cwd \ 28*67e74705SXin Li // RUN: -emit-module -fmodule-name=c -o %t/c.pcm \ 29*67e74705SXin Li // RUN: Inputs/macro-ambiguity/module.modulemap 30*67e74705SXin Li // 31*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \ 32*67e74705SXin Li // RUN: -v \ 33*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/d/quote \ 34*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/d/system \ 35*67e74705SXin Li // RUN: -fno-implicit-modules \ 36*67e74705SXin Li // RUN: -fmodule-map-file-home-is-cwd \ 37*67e74705SXin Li // RUN: -emit-module -fmodule-name=d -o %t/d.pcm \ 38*67e74705SXin Li // RUN: Inputs/macro-ambiguity/module.modulemap 39*67e74705SXin Li // 40*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \ 41*67e74705SXin Li // RUN: -v \ 42*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/a/quote \ 43*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/a/system \ 44*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/b/quote \ 45*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/b/system \ 46*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/c/quote \ 47*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/c/system \ 48*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/d/quote \ 49*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/d/system \ 50*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/e/quote \ 51*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/e/system \ 52*67e74705SXin Li // RUN: -fno-implicit-modules \ 53*67e74705SXin Li // RUN: -fmodule-map-file-home-is-cwd \ 54*67e74705SXin Li // RUN: -fmodule-map-file=Inputs/macro-ambiguity/module.modulemap \ 55*67e74705SXin Li // RUN: -fmodule-file=%t/a.pcm \ 56*67e74705SXin Li // RUN: -fmodule-file=%t/b.pcm \ 57*67e74705SXin Li // RUN: -fmodule-file=%t/c.pcm \ 58*67e74705SXin Li // RUN: -fmodule-file=%t/d.pcm \ 59*67e74705SXin Li // RUN: -Wambiguous-macro -verify macro-ambiguity.cpp 60*67e74705SXin Li // 61*67e74705SXin Li // RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \ 62*67e74705SXin Li // RUN: -v -fmodules-local-submodule-visibility \ 63*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/a/quote \ 64*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/a/system \ 65*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/b/quote \ 66*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/b/system \ 67*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/c/quote \ 68*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/c/system \ 69*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/d/quote \ 70*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/d/system \ 71*67e74705SXin Li // RUN: -iquote Inputs/macro-ambiguity/e/quote \ 72*67e74705SXin Li // RUN: -isystem Inputs/macro-ambiguity/e/system \ 73*67e74705SXin Li // RUN: -fno-implicit-modules \ 74*67e74705SXin Li // RUN: -fmodule-map-file-home-is-cwd \ 75*67e74705SXin Li // RUN: -fmodule-map-file=Inputs/macro-ambiguity/module.modulemap \ 76*67e74705SXin Li // RUN: -fmodule-file=%t/a.pcm \ 77*67e74705SXin Li // RUN: -fmodule-file=%t/b.pcm \ 78*67e74705SXin Li // RUN: -fmodule-file=%t/c.pcm \ 79*67e74705SXin Li // RUN: -fmodule-file=%t/d.pcm \ 80*67e74705SXin Li // RUN: -Wambiguous-macro -verify macro-ambiguity.cpp 81*67e74705SXin Li 82*67e74705SXin Li // Include the textual headers first to maximize the ways in which things can 83*67e74705SXin Li // become ambiguous. 84*67e74705SXin Li #include "e_quote.h" 85*67e74705SXin Li #include <e_system.h> 86*67e74705SXin Li 87*67e74705SXin Li #include "a_quote.h" 88*67e74705SXin Li #include <a_system.h> 89*67e74705SXin Li #include "b_quote.h" 90*67e74705SXin Li #include <b_system.h> 91*67e74705SXin Li #include "c_quote.h" 92*67e74705SXin Li #include <c_system.h> 93*67e74705SXin Li #include "d_quote.h" 94*67e74705SXin Li #include <d_system.h> 95*67e74705SXin Li test(int x)96*67e74705SXin Liint test(int x) { 97*67e74705SXin Li // We expect to get warnings for all of the quoted includes but none of the 98*67e74705SXin Li // system includes here because the first module is a non-system module and 99*67e74705SXin Li // the quote macros come from non-system-headers. 100*67e74705SXin Li x = FOO1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}} 101*67e74705SXin Li // expected-note@Inputs/macro-ambiguity/c/quote/c_quote.h:4 {{expanding this definition}} 102*67e74705SXin Li // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:4 {{other definition}} 103*67e74705SXin Li 104*67e74705SXin Li x = FOO1_SYSTEM(x); 105*67e74705SXin Li 106*67e74705SXin Li x = BAR1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}} 107*67e74705SXin Li // expected-note@Inputs/macro-ambiguity/d/quote/d_quote.h:4 {{expanding this definition}} 108*67e74705SXin Li // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:5 {{other definition}} 109*67e74705SXin Li 110*67e74705SXin Li x = BAR1_SYSTEM(x); 111*67e74705SXin Li 112*67e74705SXin Li x = BAZ1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}} 113*67e74705SXin Li // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:6 {{expanding this definition}} 114*67e74705SXin Li // expected-note@Inputs/macro-ambiguity/e/quote/e_quote.h:4 {{other definition}} 115*67e74705SXin Li 116*67e74705SXin Li x = BAZ1_SYSTEM(x); 117*67e74705SXin Li 118*67e74705SXin Li // Here, we don't even warn on bar because in that cas both b and d are 119*67e74705SXin Li // system modules and so the use of non-system headers is irrelevant. 120*67e74705SXin Li x = FOO2_QUOTE(x); // expected-warning {{ambiguous expansion of macro}} 121*67e74705SXin Li // expected-note@Inputs/macro-ambiguity/c/quote/c_quote.h:5 {{expanding this definition}} 122*67e74705SXin Li // expected-note@Inputs/macro-ambiguity/b/quote/b_quote.h:4 {{other definition}} 123*67e74705SXin Li 124*67e74705SXin Li x = FOO2_SYSTEM(x); 125*67e74705SXin Li 126*67e74705SXin Li x = BAR2_QUOTE(x); 127*67e74705SXin Li 128*67e74705SXin Li x = BAR2_SYSTEM(x); 129*67e74705SXin Li 130*67e74705SXin Li x = BAZ2_QUOTE(x); // expected-warning {{ambiguous expansion of macro}} 131*67e74705SXin Li // expected-note@Inputs/macro-ambiguity/b/quote/b_quote.h:6 {{expanding this definition}} 132*67e74705SXin Li // expected-note@Inputs/macro-ambiguity/e/quote/e_quote.h:5 {{other definition}} 133*67e74705SXin Li 134*67e74705SXin Li x = BAZ2_SYSTEM(x); 135*67e74705SXin Li return x; 136*67e74705SXin Li } 137