xref: /llvm-project/clang/test/Modules/cxx20-include-translation.cpp (revision 0b7e8c25ece1ff0e0dc0b7d283600b49498e8162)
1af2d11b1SIain Sandoe // RUN: rm -rf %t
2af2d11b1SIain Sandoe // RUN: mkdir -p %t
3af2d11b1SIain Sandoe // RUN: split-file %s %t
4af2d11b1SIain Sandoe // RUN: cd %t
5af2d11b1SIain Sandoe //
6af2d11b1SIain Sandoe // RUN: %clang_cc1 -std=c++20 -xc++-user-header h1.h -emit-header-unit -o h1.pcm
7af2d11b1SIain Sandoe // RUN: %clang_cc1 -std=c++20 -xc++-user-header h2.h -emit-header-unit -o h2.pcm
8af2d11b1SIain Sandoe // RUN: %clang_cc1 -std=c++20 -xc++-user-header h3.h -emit-header-unit -o h3.pcm
9af2d11b1SIain Sandoe // RUN: %clang_cc1 -std=c++20 -xc++-user-header h4.h -emit-header-unit -o h4.pcm
10af2d11b1SIain Sandoe 
117e59223aSFangrui Song // RUN: %clang_cc1 -std=c++20 Xlate.cpp -o Xlate.pcm \
12af2d11b1SIain Sandoe // RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \
13381fcaa1SVolodymyr Sapsai // RUN: -fmodule-file=h4.pcm -fsyntax-only -Rmodule-include-translation -verify
14af2d11b1SIain Sandoe 
15af2d11b1SIain Sandoe // Check that we do the intended translation and not more.
16af2d11b1SIain Sandoe // RUN: %clang_cc1 -std=c++20 Xlate.cpp \
17af2d11b1SIain Sandoe // RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \
18af2d11b1SIain Sandoe // RUN: -fmodule-file=h4.pcm -E -undef | FileCheck %s
19af2d11b1SIain Sandoe 
20af2d11b1SIain Sandoe // We expect no diagnostics here, the used functions should all be available.
217e59223aSFangrui Song // RUN: %clang_cc1 -std=c++20 Xlate.cpp \
22af2d11b1SIain Sandoe // RUN: -fmodule-file=h1.pcm -fmodule-file=h2.pcm -fmodule-file=h3.pcm \
23af2d11b1SIain Sandoe // RUN: -fmodule-file=h4.pcm -fsyntax-only
24af2d11b1SIain Sandoe 
25af2d11b1SIain Sandoe // The content of the headers is not terribly important, we just want to check
26af2d11b1SIain Sandoe // whether they are textually included or include-translated.
27af2d11b1SIain Sandoe //--- h1.h
28af2d11b1SIain Sandoe #ifndef H1_GUARD
29af2d11b1SIain Sandoe #define H1_GUARD
30af2d11b1SIain Sandoe 
31af2d11b1SIain Sandoe #define ONE 1
32af2d11b1SIain Sandoe 
33af2d11b1SIain Sandoe void foo();
34af2d11b1SIain Sandoe 
35af2d11b1SIain Sandoe #endif // H1_GUARD
36af2d11b1SIain Sandoe 
37af2d11b1SIain Sandoe //--- h2.h
38af2d11b1SIain Sandoe #ifndef H2_GUARD
39af2d11b1SIain Sandoe #define H2_GUARD
40af2d11b1SIain Sandoe 
41af2d11b1SIain Sandoe #define TWO 2
42af2d11b1SIain Sandoe 
43af2d11b1SIain Sandoe void bar();
44af2d11b1SIain Sandoe 
45af2d11b1SIain Sandoe #endif // H2_GUARD
46af2d11b1SIain Sandoe 
47af2d11b1SIain Sandoe //--- h3.h
48af2d11b1SIain Sandoe #ifndef H3_GUARD
49af2d11b1SIain Sandoe #define H3_GUARD
50af2d11b1SIain Sandoe 
51af2d11b1SIain Sandoe #define THREE 3
52af2d11b1SIain Sandoe 
53af2d11b1SIain Sandoe void baz();
54af2d11b1SIain Sandoe 
55af2d11b1SIain Sandoe #endif // H3_GUARD
56af2d11b1SIain Sandoe 
57af2d11b1SIain Sandoe //--- h4.h
58af2d11b1SIain Sandoe #ifndef H4_GUARD
59af2d11b1SIain Sandoe #define H4_GUARD
60af2d11b1SIain Sandoe 
61af2d11b1SIain Sandoe #define FOUR 4
62af2d11b1SIain Sandoe 
63af2d11b1SIain Sandoe void boo();
64af2d11b1SIain Sandoe 
65af2d11b1SIain Sandoe #endif // H4_GUARD
66af2d11b1SIain Sandoe 
67af2d11b1SIain Sandoe //--- h5.h
68af2d11b1SIain Sandoe #ifndef H5_GUARD
69af2d11b1SIain Sandoe #define H5_GUARD
70af2d11b1SIain Sandoe 
71af2d11b1SIain Sandoe #define FIVE 5
72af2d11b1SIain Sandoe 
73af2d11b1SIain Sandoe void five();
74af2d11b1SIain Sandoe 
75af2d11b1SIain Sandoe #endif // H4_GUARD
76af2d11b1SIain Sandoe 
77af2d11b1SIain Sandoe //--- Xlate.cpp
78af2d11b1SIain Sandoe /* some comment ...
79af2d11b1SIain Sandoe   ... */
80af2d11b1SIain Sandoe module /*nothing here*/;
81af2d11b1SIain Sandoe 
82af2d11b1SIain Sandoe // This should be include-translated, when the header unit for h1 is available.
83fc89e904SChuanqi Xu  // expected-warning@+1 {{the implementation of header units is in an experimental phase}}
845523fefbSJan Svoboda #include "h1.h" // expected-remark-re {{treating #include as an import of module '.{{/|\\\\?}}h1.h'}}
85af2d11b1SIain Sandoe // Import of a header unit is allowed, named modules are not.
86fc89e904SChuanqi Xu import "h2.h"; // expected-warning {{the implementation of header units is in an experimental phase}}
87af2d11b1SIain Sandoe // A regular, untranslated, header
88af2d11b1SIain Sandoe #include "h5.h"
89af2d11b1SIain Sandoe 
90af2d11b1SIain Sandoe export module Xlate;
91af2d11b1SIain Sandoe 
92af2d11b1SIain Sandoe // This is OK, the import immediately follows the module decl.
93fc89e904SChuanqi Xu import "h3.h"; // expected-warning {{the implementation of header units is in an experimental phase}}
94af2d11b1SIain Sandoe 
95af2d11b1SIain Sandoe // This should *not* be include-translated, even if header unit for h4 is
96af2d11b1SIain Sandoe // available.
97af2d11b1SIain Sandoe #include "h4.h"
98af2d11b1SIain Sandoe 
99af2d11b1SIain Sandoe export void charlie() {
100af2d11b1SIain Sandoe   foo();
101af2d11b1SIain Sandoe   bar();
102af2d11b1SIain Sandoe   baz();
103af2d11b1SIain Sandoe   boo();
104af2d11b1SIain Sandoe   five();
105af2d11b1SIain Sandoe }
106af2d11b1SIain Sandoe 
1075523fefbSJan Svoboda // CHECK: #pragma clang module import ".{{/|\\\\?}}h1.h"
108*0b7e8c25SDmitry Polukhin // CHECK: import ".{{/|\\\\?}}h2.h"
109*0b7e8c25SDmitry Polukhin // CHECK: import ".{{/|\\\\?}}h3.h"
1105523fefbSJan Svoboda // CHECK-NOT: #pragma clang module import ".{{/|\\\\?}}h4.h"
111