summaryrefslogtreecommitdiff
path: root/test/Modules/macro-ambiguity.cpp
blob: 747a80bf38cabd518ff6bb1a376211011f1e26c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// RUN: rm -rf %t
// RUN: cd %S
//
// RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
// RUN:   -v \
// RUN:   -iquote Inputs/macro-ambiguity/a/quote \
// RUN:   -isystem Inputs/macro-ambiguity/a/system \
// RUN:   -fno-implicit-modules \
// RUN:   -fmodule-map-file-home-is-cwd \
// RUN:   -emit-module -fmodule-name=a -o %t/a.pcm \
// RUN:   Inputs/macro-ambiguity/module.modulemap
//
// RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
// RUN:   -v \
// RUN:   -iquote Inputs/macro-ambiguity/b/quote \
// RUN:   -isystem Inputs/macro-ambiguity/b/system \
// RUN:   -fno-implicit-modules \
// RUN:   -fmodule-map-file-home-is-cwd \
// RUN:   -emit-module -fmodule-name=b -o %t/b.pcm \
// RUN:   Inputs/macro-ambiguity/module.modulemap
//
// RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
// RUN:   -v \
// RUN:   -iquote Inputs/macro-ambiguity/c/quote \
// RUN:   -isystem Inputs/macro-ambiguity/c/system \
// RUN:   -fno-implicit-modules \
// RUN:   -fmodule-map-file-home-is-cwd \
// RUN:   -emit-module -fmodule-name=c -o %t/c.pcm \
// RUN:   Inputs/macro-ambiguity/module.modulemap
//
// RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
// RUN:   -v \
// RUN:   -iquote Inputs/macro-ambiguity/d/quote \
// RUN:   -isystem Inputs/macro-ambiguity/d/system \
// RUN:   -fno-implicit-modules \
// RUN:   -fmodule-map-file-home-is-cwd \
// RUN:   -emit-module -fmodule-name=d -o %t/d.pcm \
// RUN:   Inputs/macro-ambiguity/module.modulemap
//
// RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
// RUN:   -v \
// RUN:   -iquote Inputs/macro-ambiguity/a/quote \
// RUN:   -isystem Inputs/macro-ambiguity/a/system \
// RUN:   -iquote Inputs/macro-ambiguity/b/quote \
// RUN:   -isystem Inputs/macro-ambiguity/b/system \
// RUN:   -iquote Inputs/macro-ambiguity/c/quote \
// RUN:   -isystem Inputs/macro-ambiguity/c/system \
// RUN:   -iquote Inputs/macro-ambiguity/d/quote \
// RUN:   -isystem Inputs/macro-ambiguity/d/system \
// RUN:   -iquote Inputs/macro-ambiguity/e/quote \
// RUN:   -isystem Inputs/macro-ambiguity/e/system \
// RUN:   -fno-implicit-modules \
// RUN:   -fmodule-map-file-home-is-cwd \
// RUN:   -fmodule-map-file=Inputs/macro-ambiguity/module.modulemap \
// RUN:   -fmodule-file=%t/a.pcm \
// RUN:   -fmodule-file=%t/b.pcm \
// RUN:   -fmodule-file=%t/c.pcm \
// RUN:   -fmodule-file=%t/d.pcm \
// RUN:   -Wambiguous-macro -verify macro-ambiguity.cpp
//
// RUN: %clang_cc1 -fmodules -x c++ -fmodules-cache-path=%t \
// RUN:   -v -fmodules-local-submodule-visibility \
// RUN:   -iquote Inputs/macro-ambiguity/a/quote \
// RUN:   -isystem Inputs/macro-ambiguity/a/system \
// RUN:   -iquote Inputs/macro-ambiguity/b/quote \
// RUN:   -isystem Inputs/macro-ambiguity/b/system \
// RUN:   -iquote Inputs/macro-ambiguity/c/quote \
// RUN:   -isystem Inputs/macro-ambiguity/c/system \
// RUN:   -iquote Inputs/macro-ambiguity/d/quote \
// RUN:   -isystem Inputs/macro-ambiguity/d/system \
// RUN:   -iquote Inputs/macro-ambiguity/e/quote \
// RUN:   -isystem Inputs/macro-ambiguity/e/system \
// RUN:   -fno-implicit-modules \
// RUN:   -fmodule-map-file-home-is-cwd \
// RUN:   -fmodule-map-file=Inputs/macro-ambiguity/module.modulemap \
// RUN:   -fmodule-file=%t/a.pcm \
// RUN:   -fmodule-file=%t/b.pcm \
// RUN:   -fmodule-file=%t/c.pcm \
// RUN:   -fmodule-file=%t/d.pcm \
// RUN:   -Wambiguous-macro -verify macro-ambiguity.cpp

// Include the textual headers first to maximize the ways in which things can
// become ambiguous.
#include "e_quote.h"
#include <e_system.h>

#include "a_quote.h"
#include <a_system.h>
#include "b_quote.h"
#include <b_system.h>
#include "c_quote.h"
#include <c_system.h>
#include "d_quote.h"
#include <d_system.h>

int test(int x) {
  // We expect to get warnings for all of the quoted includes but none of the
  // system includes here because the first module is a non-system module and
  // the quote macros come from non-system-headers.
  x = FOO1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
  // expected-note@Inputs/macro-ambiguity/c/quote/c_quote.h:4 {{expanding this definition}}
  // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:4 {{other definition}}

  x = FOO1_SYSTEM(x);

  x = BAR1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
  // expected-note@Inputs/macro-ambiguity/d/quote/d_quote.h:4 {{expanding this definition}}
  // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:5 {{other definition}}

  x = BAR1_SYSTEM(x);

  x = BAZ1_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
  // expected-note@Inputs/macro-ambiguity/a/quote/a_quote.h:6 {{expanding this definition}}
  // expected-note@Inputs/macro-ambiguity/e/quote/e_quote.h:4 {{other definition}}

  x = BAZ1_SYSTEM(x);

  // Here, we don't even warn on bar because in that cas both b and d are
  // system modules and so the use of non-system headers is irrelevant.
  x = FOO2_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
  // expected-note@Inputs/macro-ambiguity/c/quote/c_quote.h:5 {{expanding this definition}}
  // expected-note@Inputs/macro-ambiguity/b/quote/b_quote.h:4 {{other definition}}

  x = FOO2_SYSTEM(x);

  x = BAR2_QUOTE(x);

  x = BAR2_SYSTEM(x);

  x = BAZ2_QUOTE(x); // expected-warning {{ambiguous expansion of macro}}
  // expected-note@Inputs/macro-ambiguity/b/quote/b_quote.h:6 {{expanding this definition}}
  // expected-note@Inputs/macro-ambiguity/e/quote/e_quote.h:5 {{other definition}}

  x = BAZ2_SYSTEM(x);
  return x;
}