aboutsummaryrefslogtreecommitdiff
path: root/clang/test/Modules/prune-non-affecting-module-map-repeated-textual.cpp
blob: 30914056c55fa2ba4a0bc8360511ce9dd1a0e710 (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
// Same as prune-non-affecting-module-map-repeated.cpp, but check that textual-only
// inclusions do not cause duplication of the module map files they are defined in.

// RUN: rm -rf %t && mkdir %t
// RUN: split-file %s %t

// RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \
// RUN:   -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mixed.map\
// RUN:   -fmodule-map-file=%t/mod1.map \
// RUN:   -fmodule-name=mod1 -emit-module %t/mod1.map -o %t/mod1.pcm
// RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \
// RUN:   -fmodule-map-file=%t/mixed.map\
// RUN:   -fmodule-name=mixed -emit-module %t/mixed.map -o %t/mixed.pcm
// RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \
// RUN:   -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod1.map -fmodule-map-file=%t/mod2.map \
// RUN:   -fmodule-file=%t/mod1.pcm -fmodule-file=%t/mixed.pcm \
// RUN:   -fmodule-name=mod2 -emit-module %t/mod2.map -o %t/mod2.pcm
// RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \
// RUN:   -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod2.map -fmodule-map-file=%t/mod3.map \
// RUN:   -fmodule-file=%t/mod2.pcm -fmodule-file=%t/mixed.pcm \
// RUN:   -fmodule-name=mod3 -emit-module %t/mod3.map -o %t/mod3.pcm
// RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \
// RUN:   -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod3.map -fmodule-map-file=%t/mod4.map \
// RUN:   -fmodule-file=%t/mod3.pcm \
// RUN:   -fmodule-name=mod4 -emit-module %t/mod4.map -o %t/mod4.pcm
// RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod4.map -fmodule-file=%t/mod4.pcm -fsyntax-only -verify %t/check_slocs.cc

//--- base.map
module base { textual header "vector.h" }
//--- mixed.map
module mixed { textual header "mixed_text.h" header "mixed_mod.h"}
//--- mod1.map
module mod1 { header "mod1.h" }
//--- mod2.map
module mod2 { header "mod2.h" }
//--- mod3.map
module mod3 { header "mod3.h" }
//--- mod4.map
module mod4 { header "mod4.h" }
//--- check_slocs.cc
#include "mod4.h"
#include "vector.h"
#pragma clang __debug sloc_usage // expected-remark {{source manager location address space usage}}
// expected-note@* {{% of available space}}

// base.map must only be present once, despite being used in each module.
// Because its location in every module compile should be non-affecting.

// expected-note@base.map:1 {{file entered 1 time}}

// different modules use either only textual header from mixed.map or both textual and modular
// headers. Either combination must lead to only 1 use at the end, because the module is ultimately
// in the import chain and any textual uses should not change that.

// expected-note@mixed.map:1 {{file entered 1 time}}

// expected-note@* + {{file entered}}


//--- vector.h
#ifndef VECTOR_H
#define VECTOR_H
#endif

//--- mixed_text.h
#ifndef MIXED_TEXT_H
#define MIXED_TEXT_H
#endif
//--- mixed_mod.h
#ifndef MIXED_MOD_H
#define MIXED_MOD_H
#endif

//--- mod1.h
#ifndef MOD1
#define MOD1
#include "vector.h"
#include "mixed_text.h"
int mod1();
#endif
//--- mod2.h
#ifndef MOD2
#define MOD2
#include "vector.h"
#include "mod1.h"
#include "mixed_mod.h"
int mod2();
#endif
//--- mod3.h
#ifndef MOD3
#define MOD3
#include "vector.h"
#include "mod2.h"
#include "mixed_text.h"
#include "mixed_mod.h"
int mod3();
#endif
//--- mod4.h
#ifndef MOD4
#define MOD4
#include "vector.h"
#include "mod3.h"
int mod4();
#endif