| // RUN: rm -rf %t |
| // RUN: mkdir -p %t |
| // RUN: split-file %s %t |
| // |
| // RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf %t/A.cppm -emit-module-interface -o %t/A.pcm |
| // RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf %t/B.cppm -emit-module-interface -o %t/B.pcm |
| // RUN: %clang_cc1 -std=c++20 -fskip-odr-check-in-gmf %t/test.cpp -fprebuilt-module-path=%t -fsyntax-only -verify |
| |
| //--- header.h |
| #pragma once |
| template <class _Tp> |
| class Optional {}; |
| |
| template <class _Tp> |
| concept C = requires(const _Tp& __t) { |
| []<class _Up>(const Optional<_Up>&) {}(__t); |
| }; |
| |
| //--- func.h |
| #include "header.h" |
| template <C T> |
| void func() {} |
| |
| //--- duplicated_func.h |
| #include "header.h" |
| template <C T> |
| void duplicated_func() {} |
| |
| //--- test_func.h |
| #include "func.h" |
| |
| void test_func() { |
| func<Optional<int>>(); |
| } |
| |
| //--- test_duplicated_func.h |
| #include "duplicated_func.h" |
| |
| void test_duplicated_func() { |
| duplicated_func<Optional<int>>(); |
| } |
| |
| //--- A.cppm |
| module; |
| #include "header.h" |
| #include "test_duplicated_func.h" |
| export module A; |
| export using ::test_duplicated_func; |
| |
| //--- B.cppm |
| module; |
| #include "header.h" |
| #include "test_func.h" |
| #include "test_duplicated_func.h" |
| export module B; |
| export using ::test_func; |
| export using ::test_duplicated_func; |
| |
| //--- test.cpp |
| // expected-no-diagnostics |
| import A; |
| import B; |
| |
| void test() { |
| test_func(); |
| test_duplicated_func(); |
| } |