// RUN: rm -rf %t // RUN: mkdir -p %t // RUN: split-file %s %t // RUN: cd %t // // RUN: %clang_cc1 -std=c++20 -I. m_template.cppm -emit-reduced-module-interface \ // RUN: -o m_template.pcm // // RUN: %clang_cc1 -std=c++20 -I. m_wrapper.cppm \ // RUN: -emit-reduced-module-interface \ // RUN: -fmodule-file=m_template=m_template.pcm \ // RUN: -o m_wrapper.pcm // // RUN: %clang_cc1 -std=c++20 -I. main.cpp \ // RUN: -fmodule-file=m_template=m_template.pcm \ // RUN: -fmodule-file=m_wrapper=m_wrapper.pcm \ // RUN: -fsyntax-only -verify //--- template_class.h #pragma once class TemplateClass { public: template auto f1(U u); }; template auto TemplateClass::f1(U u) { U z = u; return [=](auto) { (void)z; }; } template auto trigger_ast_deserialization(U u) { return []() {}; } //--- m_template.cppm module; #include "template_class.h" export module m_template; export using ::TemplateClass; export using ::trigger_ast_deserialization; //--- m_wrapper.cppm module; #include "template_class.h" export module m_wrapper; import m_template; export inline void TriggerInstantiation() { TemplateClass tc; tc.f1(0); trigger_ast_deserialization(0); } //--- main.cpp // expected-no-diagnostics import m_template; import m_wrapper; #include "template_class.h" struct Token {}; int main() { TriggerInstantiation(); trigger_ast_deserialization(Token{}); TemplateClass tc; tc.f1(Token{}); }