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 \
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 \
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 \
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 \
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 \
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// RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
62// RUN:   -v -fmodules-local-submodule-visibility \
63// RUN:   -iquote Inputs/macro-ambiguity/a/quote \
64// RUN:   -isystem Inputs/macro-ambiguity/a/system \
65// RUN:   -iquote Inputs/macro-ambiguity/b/quote \
66// RUN:   -isystem Inputs/macro-ambiguity/b/system \
67// RUN:   -iquote Inputs/macro-ambiguity/c/quote \
68// RUN:   -isystem Inputs/macro-ambiguity/c/system \
69// RUN:   -iquote Inputs/macro-ambiguity/d/quote \
70// RUN:   -isystem Inputs/macro-ambiguity/d/system \
71// RUN:   -iquote Inputs/macro-ambiguity/e/quote \
72// RUN:   -isystem Inputs/macro-ambiguity/e/system \
73// RUN:   -fno-implicit-modules \
74// RUN:   -fmodule-map-file-home-is-cwd \
75// RUN:   -fmodule-map-file=Inputs/macro-ambiguity/module.modulemap \
76// RUN:   -fmodule-file=%t/a.pcm \
77// RUN:   -fmodule-file=%t/b.pcm \
78// RUN:   -fmodule-file=%t/c.pcm \
79// RUN:   -fmodule-file=%t/d.pcm \
80// RUN:   -Wambiguous-macro -verify macro-ambiguity.cpp
81
82// Include the textual headers first to maximize the ways in which things can
83// become ambiguous.
84#include "e_quote.h"
85#include <e_system.h>
86
87#include "a_quote.h"
88#include <a_system.h>
89#include "b_quote.h"
90#include <b_system.h>
91#include "c_quote.h"
92#include <c_system.h>
93#include "d_quote.h"
94#include <d_system.h>
95
96int test(int x) {
97  // We expect to get warnings for all of the quoted includes but none of the
98  // system includes here because the first module is a non-system module and
99  // the quote macros come from non-system-headers.
100  x = FOO1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
101  // expected-note@Inputs/macro-ambiguity/c/quote/c_quote.h:4 {{expanding this definition}}
102  // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:4 {{other definition}}
103
104  x = FOO1_SYSTEM(x);
105
106  x = BAR1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
107  // expected-note@Inputs/macro-ambiguity/d/quote/d_quote.h:4 {{expanding this definition}}
108  // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:5 {{other definition}}
109
110  x = BAR1_SYSTEM(x);
111
112  x = BAZ1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
113  // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:6 {{expanding this definition}}
114  // expected-note@Inputs/macro-ambiguity/e/quote/e_quote.h:4 {{other definition}}
115
116  x = BAZ1_SYSTEM(x);
117
118  // Here, we don't even warn on bar because in that cas both b and d are
119  // system modules and so the use of non-system headers is irrelevant.
120  x = FOO2_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
121  // expected-note@Inputs/macro-ambiguity/c/quote/c_quote.h:5 {{expanding this definition}}
122  // expected-note@Inputs/macro-ambiguity/b/quote/b_quote.h:4 {{other definition}}
123
124  x = FOO2_SYSTEM(x);
125
126  x = BAR2_QUOTE(x);
127
128  x = BAR2_SYSTEM(x);
129
130  x = BAZ2_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
131  // expected-note@Inputs/macro-ambiguity/b/quote/b_quote.h:6 {{expanding this definition}}
132  // expected-note@Inputs/macro-ambiguity/e/quote/e_quote.h:5 {{other definition}}
133
134  x = BAZ2_SYSTEM(x);
135  return x;
136}
137