xref: /llvm-project/clang/test/Modules/Reachability-template-instantiation.cpp (revision da00c60dae0040185dc45039c4397f6e746548e9)
1 // RUN: rm -rf %t
2 // RUN: mkdir -p %t
3 // RUN: split-file %s %t
4 //
5 // RUN: %clang_cc1 -std=c++20 %t/Templ.cppm -emit-module-interface -o %t/Templ.pcm
6 // RUN: %clang_cc1 -std=c++20 %t/Use.cppm -fprebuilt-module-path=%t -emit-module-interface -o %t/Use.pcm
7 // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t -I%t %t/Use.cpp -verify -fsyntax-only
8 
9 // RUN: %clang_cc1 -std=c++20 %t/Templ.cppm -emit-reduced-module-interface -o %t/Templ.pcm
10 // RUN: %clang_cc1 -std=c++20 %t/Use.cppm -fprebuilt-module-path=%t -emit-reduced-module-interface -o %t/Use.pcm
11 // RUN: %clang_cc1 -std=c++20 -fprebuilt-module-path=%t -I%t %t/Use.cpp -verify -fsyntax-only
12 //
13 //--- Templ.h
14 #ifndef TEMPL_H
15 #define TEMPL_H
16 template <class T>
17 class Wrapper {
18 public:
19   T value;
20 };
21 #endif
22 
23 //--- Templ.cppm
24 export module Templ;
25 export template <class T>
26 class Wrapper2 {
27 public:
28   T value;
29 };
30 
31 //--- Use.cppm
32 module;
33 #include "Templ.h"
34 export module Use;
35 import Templ;
36 
37 export template <class T>
38 class Use {
39 public:
40   Wrapper<T> value;
41   Wrapper2<T> value2;
42 };
43 
44 export template <class T>
45 Wrapper<T> wrapper;
46 
47 //--- Use.cpp
48 // expected-no-diagnostics
49 module;
50 #include "Templ.h"
51 export module User;
52 
53 export template <class T>
54 class User {
55 public:
56   Wrapper<T> value;
57 };
58