aboutsummaryrefslogtreecommitdiff
path: root/clang/test/Modules/cxx20-include-translation.cpp
blob: a607e7c0373f814cef379a6467c5abfc1f93444c (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
// RUN: rm -rf %t
// RUN: mkdir -p %t
// RUN: split-file %s %t
// RUN: cd %t
//
// RUN: %clang_cc1 -std=c++20 -xc++-user-header h1.h -emit-header-unit -o h1.pcm
// RUN: %clang_cc1 -std=c++20 -xc++-user-header h2.h -emit-header-unit -o h2.pcm
// RUN: %clang_cc1 -std=c++20 -xc++-user-header h3.h -emit-header-unit -o h3.pcm
// RUN: %clang_cc1 -std=c++20 -xc++-user-header h4.h -emit-header-unit -o h4.pcm

// RUN: %clang_cc1 -std=c++20 Xlate.cpp -o Xlate.pcm \
// RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \
// RUN: -fmodule-file=h4.pcm -fsyntax-only -Rmodule-include-translation -verify

// Check that we do the intended translation and not more.
// RUN: %clang_cc1 -std=c++20 Xlate.cpp \
// RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \
// RUN: -fmodule-file=h4.pcm -E -undef | FileCheck %s

// We expect no diagnostics here, the used functions should all be available.
// RUN: %clang_cc1 -std=c++20 Xlate.cpp \
// RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \
// RUN: -fmodule-file=h4.pcm -fsyntax-only

// The content of the headers is not terribly important, we just want to check
// whether they are textually included or include-translated.
//--- h1.h
#ifndef H1_GUARD
#define H1_GUARD

#define ONE 1

void foo();

#endif // H1_GUARD

//--- h2.h
#ifndef H2_GUARD
#define H2_GUARD

#define TWO 2

void bar();

#endif // H2_GUARD

//--- h3.h
#ifndef H3_GUARD
#define H3_GUARD

#define THREE 3

void baz();

#endif // H3_GUARD

//--- h4.h
#ifndef H4_GUARD
#define H4_GUARD

#define FOUR 4

void boo();

#endif // H4_GUARD

//--- h5.h
#ifndef H5_GUARD
#define H5_GUARD

#define FIVE 5

void five();

#endif // H4_GUARD

//--- Xlate.cpp
/* some comment ...
  ... */
module /*nothing here*/;

// This should be include-translated, when the header unit for h1 is available.
 // expected-warning@+1 {{the implementation of header units is in an experimental phase}}
#include "h1.h" // expected-remark-re {{treating #include as an import of module '.{{/|\\\\?}}h1.h'}}
// Import of a header unit is allowed, named modules are not.
import "h2.h"; // expected-warning {{the implementation of header units is in an experimental phase}}
// A regular, untranslated, header
#include "h5.h"

export module Xlate;

// This is OK, the import immediately follows the module decl.
import "h3.h"; // expected-warning {{the implementation of header units is in an experimental phase}}

// This should *not* be include-translated, even if header unit for h4 is
// available.
#include "h4.h"

export void charlie() {
  foo();
  bar();
  baz();
  boo();
  five();
}

// CHECK: #pragma clang module import ".{{/|\\\\?}}h1.h"
// CHECK: import ".{{/|\\\\?}}h2.h"
// CHECK: import ".{{/|\\\\?}}h3.h"
// CHECK-NOT: #pragma clang module import ".{{/|\\\\?}}h4.h"