// From https://github.com/llvm/llvm-project/issues/61317 // RUN: rm -rf %t // RUN: mkdir -p %t // RUN: split-file %s %t // // RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-module-interface -o %t/A.pcm // RUN: %clang_cc1 -std=c++20 %t/B.cppm -emit-module-interface -o %t/B.pcm \ // RUN: -fprebuilt-module-path=%t // RUN: %clang_cc1 -std=c++20 %t/Use.cpp -fprebuilt-module-path=%t -fsyntax-only -verify // RUN: rm -rf %t // RUN: mkdir -p %t // RUN: split-file %s %t // // RUN: %clang_cc1 -std=c++20 %t/A.cppm -emit-reduced-module-interface -o %t/A.pcm // RUN: %clang_cc1 -std=c++20 %t/B.cppm -emit-reduced-module-interface -o %t/B.pcm \ // RUN: -fprebuilt-module-path=%t // RUN: %clang_cc1 -std=c++20 %t/Use.cpp -fprebuilt-module-path=%t -fsyntax-only -verify //--- foo.h #ifndef _FOO #define _FOO template struct Foo { Foo(T f) {} }; template Foo(T&) -> Foo; struct Bar { template requires requires { Foo{T()}; } void baz() const {} }; template struct Foo2 { Foo2(T f) {} }; struct Bar2 { template requires requires { Foo2{T()}; } void baz2() const {} }; #endif //--- A.cppm module; #include "foo.h" export module A; export using ::Foo; export using ::Bar; export using ::Bar2; //--- B.cppm module; #include "foo.h" export module B; export import A; //--- Use.cpp // expected-no-diagnostics import A; import B; void use() { Bar _; _.baz(); Bar2 __; __.baz2(); }