xref: /llvm-project/clang/test/Modules/cxx20-hu-01.cpp (revision 6c0e60e884a20016ccc0d7c7e6f06df089a0de86)
1*6c0e60e8SIain Sandoe // Test generation and import of simple C++20 Header Units.
2*6c0e60e8SIain Sandoe 
3*6c0e60e8SIain Sandoe // RUN: rm -rf %t
4*6c0e60e8SIain Sandoe // RUN: mkdir -p %t
5*6c0e60e8SIain Sandoe // RUN: split-file %s %t
6*6c0e60e8SIain Sandoe 
7*6c0e60e8SIain Sandoe // RUN: %clang_cc1 -std=c++20 -emit-header-unit -xc++-header %t/hu-01.h \
8*6c0e60e8SIain Sandoe // RUN:  -o %t/hu-01.pcm
9*6c0e60e8SIain Sandoe 
10*6c0e60e8SIain Sandoe // RUN: %clang_cc1 -std=c++20 -module-file-info %t/hu-01.pcm | \
11*6c0e60e8SIain Sandoe // RUN: FileCheck --check-prefix=CHECK-HU %s -DTDIR=%t
12*6c0e60e8SIain Sandoe 
13*6c0e60e8SIain Sandoe // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/imp-hu-01.cpp \
14*6c0e60e8SIain Sandoe // RUN:  -fmodule-file=%t/hu-01.pcm -o %t/B.pcm -Rmodule-import 2>&1  | \
15*6c0e60e8SIain Sandoe // RUN: FileCheck --check-prefix=CHECK-IMP %s -DTDIR=%t
16*6c0e60e8SIain Sandoe 
17*6c0e60e8SIain Sandoe // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/imp-hu-02.cpp \
18*6c0e60e8SIain Sandoe // RUN:  -fmodule-file=%t/hu-01.pcm -o %t/C.pcm -Rmodule-import 2>&1  | \
19*6c0e60e8SIain Sandoe // RUN: FileCheck --check-prefix=CHECK-GMF-IMP %s -DTDIR=%t
20*6c0e60e8SIain Sandoe 
21*6c0e60e8SIain Sandoe // RUN: %clang_cc1 -std=c++20 -emit-header-unit -xc++-header %t/hu-02.h \
22*6c0e60e8SIain Sandoe // RUN:  -o %t/hu-02.pcm
23*6c0e60e8SIain Sandoe 
24*6c0e60e8SIain Sandoe // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/imp-hu-03.cpp \
25*6c0e60e8SIain Sandoe // RUN:  -fmodule-file=%t/hu-01.pcm -fmodule-file=%t/hu-02.pcm -o %t/D.pcm \
26*6c0e60e8SIain Sandoe // RUN: -Rmodule-import 2>&1 | \
27*6c0e60e8SIain Sandoe // RUN: FileCheck --check-prefix=CHECK-BOTH %s -DTDIR=%t
28*6c0e60e8SIain Sandoe 
29*6c0e60e8SIain Sandoe // RUN: %clang_cc1 -std=c++20 -emit-header-unit -xc++-header %t/hu-03.h \
30*6c0e60e8SIain Sandoe // RUN: -fmodule-file=%t/hu-01.pcm  -o %t/hu-03.pcm
31*6c0e60e8SIain Sandoe 
32*6c0e60e8SIain Sandoe // RUN: %clang_cc1 -std=c++20 -module-file-info %t/hu-03.pcm | \
33*6c0e60e8SIain Sandoe // RUN: FileCheck --check-prefix=CHECK-HU-HU %s -DTDIR=%t
34*6c0e60e8SIain Sandoe 
35*6c0e60e8SIain Sandoe // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/imp-hu-04.cpp \
36*6c0e60e8SIain Sandoe // RUN:  -fmodule-file=%t/hu-03.pcm -o %t/E.pcm -Rmodule-import 2>&1 | \
37*6c0e60e8SIain Sandoe // RUN: FileCheck --check-prefix=CHECK-NESTED %s -DTDIR=%t
38*6c0e60e8SIain Sandoe 
39*6c0e60e8SIain Sandoe //--- hu-01.h
40*6c0e60e8SIain Sandoe int foo(int);
41*6c0e60e8SIain Sandoe 
42*6c0e60e8SIain Sandoe // CHECK-HU:  ====== C++20 Module structure ======
43*6c0e60e8SIain Sandoe // CHECK-HU-NEXT:  Header Unit '[[TDIR]]/hu-01.h' is the Primary Module at index #1
44*6c0e60e8SIain Sandoe 
45*6c0e60e8SIain Sandoe //--- imp-hu-01.cpp
46*6c0e60e8SIain Sandoe export module B;
47*6c0e60e8SIain Sandoe import "hu-01.h";
48*6c0e60e8SIain Sandoe 
bar(int x)49*6c0e60e8SIain Sandoe int bar(int x) {
50*6c0e60e8SIain Sandoe   return foo(x);
51*6c0e60e8SIain Sandoe }
52*6c0e60e8SIain Sandoe // CHECK-IMP: remark: importing module '[[TDIR]]/hu-01.h' from '[[TDIR]]/hu-01.pcm'
53*6c0e60e8SIain Sandoe // expected-no-diagnostics
54*6c0e60e8SIain Sandoe 
55*6c0e60e8SIain Sandoe //--- imp-hu-02.cpp
56*6c0e60e8SIain Sandoe module;
57*6c0e60e8SIain Sandoe import "hu-01.h";
58*6c0e60e8SIain Sandoe 
59*6c0e60e8SIain Sandoe export module C;
60*6c0e60e8SIain Sandoe 
bar(int x)61*6c0e60e8SIain Sandoe int bar(int x) {
62*6c0e60e8SIain Sandoe   return foo(x);
63*6c0e60e8SIain Sandoe }
64*6c0e60e8SIain Sandoe // CHECK-GMF-IMP: remark: importing module '[[TDIR]]/hu-01.h' from '[[TDIR]]/hu-01.pcm'
65*6c0e60e8SIain Sandoe // expected-no-diagnostics
66*6c0e60e8SIain Sandoe 
67*6c0e60e8SIain Sandoe //--- hu-02.h
68*6c0e60e8SIain Sandoe int baz(int);
69*6c0e60e8SIain Sandoe 
70*6c0e60e8SIain Sandoe //--- imp-hu-03.cpp
71*6c0e60e8SIain Sandoe module;
72*6c0e60e8SIain Sandoe export import "hu-01.h";
73*6c0e60e8SIain Sandoe 
74*6c0e60e8SIain Sandoe export module D;
75*6c0e60e8SIain Sandoe import "hu-02.h";
76*6c0e60e8SIain Sandoe 
bar(int x)77*6c0e60e8SIain Sandoe int bar(int x) {
78*6c0e60e8SIain Sandoe   return foo(x) + baz(x);
79*6c0e60e8SIain Sandoe }
80*6c0e60e8SIain Sandoe // CHECK-BOTH: remark: importing module '[[TDIR]]/hu-01.h' from '[[TDIR]]/hu-01.pcm'
81*6c0e60e8SIain Sandoe // CHECK-BOTH: remark: importing module '[[TDIR]]/hu-02.h' from '[[TDIR]]/hu-02.pcm'
82*6c0e60e8SIain Sandoe // expected-no-diagnostics
83*6c0e60e8SIain Sandoe 
84*6c0e60e8SIain Sandoe //--- hu-03.h
85*6c0e60e8SIain Sandoe export import "hu-01.h";
86*6c0e60e8SIain Sandoe int baz(int);
87*6c0e60e8SIain Sandoe // CHECK-HU-HU:  ====== C++20 Module structure ======
88*6c0e60e8SIain Sandoe // CHECK-HU-HU-NEXT:  Header Unit '[[TDIR]]/hu-03.h' is the Primary Module at index #2
89*6c0e60e8SIain Sandoe // CHECK-HU-HU-NEXT:   Exports:
90*6c0e60e8SIain Sandoe // CHECK-HU-HU-NEXT:    Header Unit '[[TDIR]]/hu-01.h' is at index #1
91*6c0e60e8SIain Sandoe 
92*6c0e60e8SIain Sandoe // expected-no-diagnostics
93*6c0e60e8SIain Sandoe 
94*6c0e60e8SIain Sandoe //--- imp-hu-04.cpp
95*6c0e60e8SIain Sandoe module;
96*6c0e60e8SIain Sandoe import "hu-03.h";
97*6c0e60e8SIain Sandoe 
98*6c0e60e8SIain Sandoe export module E;
99*6c0e60e8SIain Sandoe 
bar(int x)100*6c0e60e8SIain Sandoe int bar(int x) {
101*6c0e60e8SIain Sandoe   return foo(x) + baz(x);
102*6c0e60e8SIain Sandoe }
103*6c0e60e8SIain Sandoe // CHECK-NESTED: remark: importing module '[[TDIR]]/hu-03.h' from '[[TDIR]]/hu-03.pcm'
104*6c0e60e8SIain Sandoe // expected-no-diagnostics
105