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 Xuvoid foo() { 13*9c04851cSChuanqi Xu } 14*9c04851cSChuanqi Xu 15*9c04851cSChuanqi Xu template <> foo()16*9c04851cSChuanqi Xuvoid foo<int>() { 17*9c04851cSChuanqi Xu } 18*9c04851cSChuanqi Xu 19*9c04851cSChuanqi Xu template <typename T> foo2()20*9c04851cSChuanqi Xuvoid foo2() { 21*9c04851cSChuanqi Xu } 22*9c04851cSChuanqi Xu 23*9c04851cSChuanqi Xu template <> foo2()24*9c04851cSChuanqi Xuvoid foo2<int>() { 25*9c04851cSChuanqi Xu } 26*9c04851cSChuanqi Xu 27*9c04851cSChuanqi Xu template <typename T> foo3()28*9c04851cSChuanqi Xuvoid 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 Xuvoid foo4() { 40*9c04851cSChuanqi Xu } 41*9c04851cSChuanqi Xu 42*9c04851cSChuanqi Xu export template <> foo4()43*9c04851cSChuanqi Xuvoid foo4<int>() { 44*9c04851cSChuanqi Xu } 45*9c04851cSChuanqi Xu 46*9c04851cSChuanqi Xu //--- Use.cpp 47*9c04851cSChuanqi Xu import foo; use()48*9c04851cSChuanqi Xuvoid 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