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