xref: /llvm-project/clang/test/CXX/module/module.context/p7.cpp (revision e22fa1d4c6152d36cf1342ab9029adc97c79a310)
19c04851cSChuanqi Xu // RUN: rm -rf %t
29c04851cSChuanqi Xu // RUN: split-file %s %t
39c04851cSChuanqi Xu // RUN: cd %t
49c04851cSChuanqi Xu 
59c04851cSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -emit-header-unit -xc++-header-unit-header std-10-6-ex1-decl.h \
69c04851cSChuanqi Xu // RUN: -o decl.pcm
79c04851cSChuanqi Xu 
89c04851cSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -emit-header-unit -xc++-header-unit-header std-10-6-ex1-defn.h \
99c04851cSChuanqi Xu // RUN: -o defn.pcm
109c04851cSChuanqi Xu 
119c04851cSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -emit-module-interface std-10-6-ex1-stuff.cpp \
129c04851cSChuanqi Xu // RUN: -o stuff.pcm
139c04851cSChuanqi Xu 
149c04851cSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -emit-module-interface std-10-6-ex1-M1.cpp \
1557833636SChuanqi Xu // RUN:   -fmodule-file=stuff=stuff.pcm -o M1.pcm  -fmodule-file=defn.pcm
169c04851cSChuanqi Xu 
179c04851cSChuanqi Xu // RUN: %clang_cc1 -std=c++20 -emit-module-interface std-10-6-ex1-M2.cpp \
1857833636SChuanqi Xu // RUN:   -fmodule-file=stuff=stuff.pcm -o M2.pcm  -fmodule-file=decl.pcm
199c04851cSChuanqi Xu 
209c04851cSChuanqi Xu // RUN: %clang_cc1 -std=c++20 std-10-6-ex1-use.cpp \
21*e22fa1d4SChuanqi Xu // RUN:   -fmodule-file=M1=M1.pcm -fmodule-file=M2=M2.pcm -fmodule-file=stuff=stuff.pcm \
22*e22fa1d4SChuanqi Xu // RUN:   -fsyntax-only -verify
239c04851cSChuanqi Xu 
249c04851cSChuanqi Xu //--- std-10-6-ex1-decl.h
259c04851cSChuanqi Xu struct X;
269c04851cSChuanqi Xu 
279c04851cSChuanqi Xu //--- std-10-6-ex1-defn.h
289c04851cSChuanqi Xu struct X {};
299c04851cSChuanqi Xu 
309c04851cSChuanqi Xu //--- std-10-6-ex1-stuff.cpp
319c04851cSChuanqi Xu export module stuff;
foo(T,U u)329c04851cSChuanqi Xu export template <typename T, typename U> void foo(T, U u) { auto v = u; }
bar(T,U u)339c04851cSChuanqi Xu export template <typename T, typename U> void bar(T, U u) { auto v = *u; }
349c04851cSChuanqi Xu 
359c04851cSChuanqi Xu //--- std-10-6-ex1-M1.cpp
369c04851cSChuanqi Xu export module M1;
379c04851cSChuanqi Xu import "std-10-6-ex1-defn.h"; // provides struct X {};
389c04851cSChuanqi Xu import stuff;
399c04851cSChuanqi Xu 
f(T t)409c04851cSChuanqi Xu export template <typename T> void f(T t) {
419c04851cSChuanqi Xu   X x;
429c04851cSChuanqi Xu   foo(t, x);
439c04851cSChuanqi Xu }
449c04851cSChuanqi Xu 
459c04851cSChuanqi Xu //--- std-10-6-ex1-M2.cpp
469c04851cSChuanqi Xu export module M2;
479c04851cSChuanqi Xu import "std-10-6-ex1-decl.h"; // provides struct X; (not a definition)
489c04851cSChuanqi Xu 
499c04851cSChuanqi Xu import stuff;
g(T t)509c04851cSChuanqi Xu export template <typename T> void g(T t) {
519c04851cSChuanqi Xu   X *x;
529c04851cSChuanqi Xu   bar(t, x);
539c04851cSChuanqi Xu }
549c04851cSChuanqi Xu 
559c04851cSChuanqi Xu //--- std-10-6-ex1-use.cpp
569c04851cSChuanqi Xu import M1;
579c04851cSChuanqi Xu import M2;
589c04851cSChuanqi Xu 
test()599c04851cSChuanqi Xu void test() {
609c04851cSChuanqi Xu   f(0);
619c04851cSChuanqi Xu   // It is unspecified whether the instantiation of g(0) is valid here.
629c04851cSChuanqi Xu   // We choose to make it invalid here.
639c04851cSChuanqi Xu   g(0); // expected-error@* {{definition of 'X' must be imported from module}}
649c04851cSChuanqi Xu         // expected-note@* {{in instantiation of function template specialization 'bar<int, X *>'}}
659c04851cSChuanqi Xu         // expected-note@* {{in instantiation of function template specialization}}
669c04851cSChuanqi Xu         // expected-note@* {{definition here is not reachable}}
679c04851cSChuanqi Xu }
68