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