xref: /llvm-project/clang/test/Modules/module-local-with-templates.cppm (revision c5e4afe6733c58e24023ede04275bbed3bde8240)
1*c5e4afe6SChuanqi Xu// RUN: rm -rf %t
2*c5e4afe6SChuanqi Xu// RUN: mkdir -p %t
3*c5e4afe6SChuanqi Xu// RUN: split-file %s %t
4*c5e4afe6SChuanqi Xu//
5*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-module-interface -o %t/a.pcm
6*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/use.cc -fmodule-file=a=%t/a.pcm -fsyntax-only -verify
7*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/a-part.cppm -fmodule-file=a=%t/a.pcm -fsyntax-only -verify
8*c5e4afe6SChuanqi Xu//
9*c5e4afe6SChuanqi Xu// Test again with reduced BMI
10*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/a.cppm -emit-reduced-module-interface -o %t/a.pcm
11*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/use.cc -fmodule-file=a=%t/a.pcm -fsyntax-only -verify
12*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/a-part.cppm -fmodule-file=a=%t/a.pcm -fsyntax-only -verify
13*c5e4afe6SChuanqi Xu// RUN: %clang_cc1 -std=c++20 %t/a.cc -fmodule-file=a=%t/a.pcm -fsyntax-only -verify
14*c5e4afe6SChuanqi Xu
15*c5e4afe6SChuanqi Xu
16*c5e4afe6SChuanqi Xu//--- a.cppm
17*c5e4afe6SChuanqi Xuexport module a;
18*c5e4afe6SChuanqi Xu
19*c5e4afe6SChuanqi Xuconstexpr int x = 43;
20*c5e4afe6SChuanqi Xu
21*c5e4afe6SChuanqi Xuexport constexpr int f() { return x; }
22*c5e4afe6SChuanqi Xu
23*c5e4afe6SChuanqi Xuexport template <typename T>
24*c5e4afe6SChuanqi Xuconstexpr T g() {
25*c5e4afe6SChuanqi Xu    return x;
26*c5e4afe6SChuanqi Xu}
27*c5e4afe6SChuanqi Xu
28*c5e4afe6SChuanqi Xunamespace nn {
29*c5e4afe6SChuanqi Xu
30*c5e4afe6SChuanqi Xuconstexpr int x = 88;
31*c5e4afe6SChuanqi Xu
32*c5e4afe6SChuanqi Xuexport constexpr int f() { return x; }
33*c5e4afe6SChuanqi Xu
34*c5e4afe6SChuanqi Xuexport template <typename T>
35*c5e4afe6SChuanqi Xuconstexpr T g() {
36*c5e4afe6SChuanqi Xu    return x;
37*c5e4afe6SChuanqi Xu}
38*c5e4afe6SChuanqi Xu}
39*c5e4afe6SChuanqi Xu
40*c5e4afe6SChuanqi Xu//--- use.cc
41*c5e4afe6SChuanqi Xu// expected-no-diagnostics
42*c5e4afe6SChuanqi Xuimport a;
43*c5e4afe6SChuanqi Xu
44*c5e4afe6SChuanqi Xustatic_assert(f() == 43, "");
45*c5e4afe6SChuanqi Xu
46*c5e4afe6SChuanqi Xuconstexpr int x = 99;
47*c5e4afe6SChuanqi Xu
48*c5e4afe6SChuanqi Xustatic_assert(g<int>() == 43, "");
49*c5e4afe6SChuanqi Xu
50*c5e4afe6SChuanqi Xustatic_assert(x == 99, "");
51*c5e4afe6SChuanqi Xu
52*c5e4afe6SChuanqi Xunamespace nn {
53*c5e4afe6SChuanqi Xustatic_assert(f() == 88, "");
54*c5e4afe6SChuanqi Xu
55*c5e4afe6SChuanqi Xuconstexpr int x = 1000;
56*c5e4afe6SChuanqi Xu
57*c5e4afe6SChuanqi Xustatic_assert(g<int>() == 88, "");
58*c5e4afe6SChuanqi Xu
59*c5e4afe6SChuanqi Xustatic_assert(x == 1000, "");
60*c5e4afe6SChuanqi Xu
61*c5e4afe6SChuanqi Xu}
62*c5e4afe6SChuanqi Xu
63*c5e4afe6SChuanqi Xu//--- a-part.cppm
64*c5e4afe6SChuanqi Xumodule a:impl;
65*c5e4afe6SChuanqi Xuimport a;
66*c5e4afe6SChuanqi Xu
67*c5e4afe6SChuanqi Xustatic_assert(x == 43, "");
68*c5e4afe6SChuanqi Xu
69*c5e4afe6SChuanqi Xuconstexpr int x = 1000; // expected-error {{redefinition of 'x'}}
70*c5e4afe6SChuanqi Xu                        // expected-note@* {{previous definition is here}}
71*c5e4afe6SChuanqi Xu
72*c5e4afe6SChuanqi Xu//--- a.cc
73*c5e4afe6SChuanqi Xumodule a;
74*c5e4afe6SChuanqi Xu
75*c5e4afe6SChuanqi Xustatic_assert(x == 43, "");
76*c5e4afe6SChuanqi Xu
77*c5e4afe6SChuanqi Xuconstexpr int x = 1000; // expected-error {{redefinition of 'x'}}
78*c5e4afe6SChuanqi Xu                        // expected-note@* {{previous definition is here}}
79*c5e4afe6SChuanqi Xu
80