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 Xuexport template <typename T, typename U> void foo(T, U u) { auto v = u; } bar(T,U u)339c04851cSChuanqi Xuexport 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 Xuexport 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 Xuexport 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 Xuvoid 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