xref: /llvm-project/clang/test/Modules/template-function-specialization.cpp (revision f21ead06750b670cf8ce72d6666e3550b04056a2)
1 // RUN: rm -fr %t
2 // RUN: mkdir %t
3 // RUN: split-file %s %t
4 //
5 // RUN: %clang_cc1 -std=c++20 -emit-module-interface %t/foo.cppm -o %t/foo.pcm
6 // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -verify -fsyntax-only
7 
8 // RUN: %clang_cc1 -std=c++20 -emit-reduced-module-interface %t/foo.cppm -o %t/foo.pcm
9 // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t %t/Use.cpp -verify -fsyntax-only -DREDUCED
10 
11 //--- foo.cppm
12 module;
13 # 3 __FILE__ 1 // use the next physical line number here (and below)
14 template <typename T>
foo()15 void foo() {
16 }
17 
18 template <>
foo()19 void foo<int>() {
20 }
21 
22 template <typename T>
foo2()23 void foo2() {
24 }
25 
26 template <>
foo2()27 void foo2<int>() {
28 }
29 
30 template <typename T>
foo3()31 void foo3() {
32 }
33 
34 template <>
35 void foo3<int>();
36 
37 export module foo;
38 export using ::foo;
39 export using ::foo3;
40 
41 export template <typename T>
foo4()42 void foo4() {
43 }
44 
45 export template <>
foo4()46 void foo4<int>() {
47 }
48 
49 //--- Use.cpp
50 import foo;
use()51 void use() {
52   foo<short>();
53   foo<int>();
54 #ifdef REDUCED
55   // In reduced BMI, the foo2 template function is optimized out.
56   foo2<short>(); // expected-error {{use of undeclared identifier 'foo2'}}
57   foo2<int>();   // expected-error {{use of undeclared identifier 'foo2'}}
58 #else
59   foo2<short>(); // expected-error {{missing '#include'; 'foo2' must be declared before it is used}}
60                  // expected-note@* {{declaration here is not visible}}
61   foo2<int>();   // expected-error {{missing '#include'; 'foo2' must be declared before it is used}}
62                  // expected-note@* {{declaration here is not visible}}
63 #endif
64   foo3<short>();
65   foo3<int>();
66 
67   foo4<short>();
68   foo4<int>();
69 }
70