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 //--- foo.cppm 9 module; 10 # 3 __FILE__ 1 // use the next physical line number here (and below) 11 template <typename T> 12 void foo() { 13 } 14 15 template <> 16 void foo<int>() { 17 } 18 19 template <typename T> 20 void foo2() { 21 } 22 23 template <> 24 void foo2<int>() { 25 } 26 27 template <typename T> 28 void foo3() { 29 } 30 31 template <> 32 void foo3<int>(); 33 34 export module foo; 35 export using ::foo; 36 export using ::foo3; 37 38 export template <typename T> 39 void foo4() { 40 } 41 42 export template <> 43 void foo4<int>() { 44 } 45 46 //--- Use.cpp 47 import foo; 48 void use() { 49 foo<short>(); 50 foo<int>(); 51 foo2<short>(); // expected-error {{missing '#include'; 'foo2' must be declared before it is used}} 52 // expected-note@* {{declaration here is not visible}} 53 foo2<int>(); // expected-error {{missing '#include'; 'foo2' must be declared before it is used}} 54 // expected-note@* {{declaration here is not visible}} 55 foo3<short>(); 56 foo3<int>(); 57 58 foo4<short>(); 59 foo4<int>(); 60 } 61