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