| // Reduced from https://github.com/llvm/llvm-project/issues/93859 |
| // |
| // RUN: rm -rf %t |
| // RUN: mkdir -p %t |
| // RUN: split-file %s %t |
| // |
| // RUN: %clang_cc1 -std=c++20 %t/reduced_std.cppm -emit-reduced-module-interface -o %t/reduced_std.pcm |
| // RUN: %clang_cc1 -std=c++20 %t/Misc.cppm -emit-reduced-module-interface -o %t/Misc.pcm \ |
| // RUN: -fprebuilt-module-path=%t |
| // RUN: %clang_cc1 -std=c++20 %t/Instance.cppm -emit-reduced-module-interface -o %t/Instance.pcm \ |
| // RUN: -fprebuilt-module-path=%t |
| // RUN: %clang_cc1 -std=c++20 %t/Device.cppm -emit-reduced-module-interface -o %t/Device.pcm \ |
| // RUN: -fprebuilt-module-path=%t |
| // RUN: %clang_cc1 -std=c++20 %t/Overlay.cppm -emit-reduced-module-interface -o %t/Overlay.pcm \ |
| // RUN: -fprebuilt-module-path=%t |
| // RUN: %clang_cc1 -std=c++20 %t/App.cppm -emit-module-interface -o /dev/null \ |
| // RUN: -fexperimental-modules-reduced-bmi -fmodule-output=%t/App.pcm \ |
| // RUN: -fprebuilt-module-path=%t |
| // RUN: %clang_cc1 -std=c++20 %t/test.cc -fsyntax-only -verify \ |
| // RUN: -fprebuilt-module-path=%t |
| |
| //--- header.h |
| namespace std { |
| |
| template <class _T1, class _T2> |
| struct pair |
| { |
| _T1 first; |
| _T2 second; |
| |
| constexpr pair() |
| : first(), second() {} |
| |
| constexpr pair(_T1 const& __t1, _T2 const& __t2) |
| : first(__t1), second(__t2) {} |
| }; |
| |
| template <class _T1, class _T2> |
| pair(_T1, _T2) -> pair<_T1, _T2>; |
| |
| template <class _Tp> |
| class __tree_const_iterator { |
| public: |
| template <class> |
| friend class __tree; |
| }; |
| |
| template <class _Tp> |
| class __tree { |
| public: |
| typedef _Tp value_type; |
| typedef __tree_const_iterator<value_type> const_iterator; |
| |
| template <class, class, class, class> |
| friend class map; |
| }; |
| |
| template <class _Key> |
| class set { |
| public: |
| typedef __tree<_Key> __base; |
| |
| typedef typename __base::const_iterator iterator; |
| |
| set() {} |
| |
| pair<iterator, bool> |
| insert(const _Key& __v); |
| }; |
| |
| template <class _InputIterator, class _OutputIterator> |
| inline constexpr _OutputIterator |
| copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) { |
| return pair{__first, __last}.second; |
| } |
| |
| } |
| |
| //--- reduced_std.cppm |
| module; |
| #include "header.h" |
| export module reduced_std; |
| |
| export namespace std { |
| using std::set; |
| using std::copy; |
| } |
| |
| //--- Misc.cppm |
| export module Misc; |
| import reduced_std; |
| |
| export void check_result(int res) { |
| std::set<char> extensions; |
| extensions.insert('f'); |
| } |
| |
| //--- Instance.cppm |
| export module Instance; |
| import reduced_std; |
| |
| export class Instance { |
| public: |
| Instance() { |
| std::set<const char*> extensions; |
| extensions.insert("foo"); |
| } |
| }; |
| |
| //--- Device.cppm |
| export module Device; |
| import reduced_std; |
| import Instance; |
| import Misc; |
| |
| std::set<int> wtf_set; |
| |
| //--- Overlay.cppm |
| export module Overlay; |
| |
| import reduced_std; |
| import Device; |
| |
| void overlay_vector_use() { |
| std::set<int> nums; |
| nums.insert(1); |
| } |
| |
| //--- App.cppm |
| module; |
| #include "header.h" |
| export module App; |
| import Overlay; |
| |
| std::set<float> fs; |
| |
| //--- test.cc |
| // expected-no-diagnostics |
| import reduced_std; |
| import App; |
| |
| void render() { |
| unsigned *oidxs = nullptr; |
| unsigned idxs[] = {0, 1, 2, 0, 2, 3}; |
| std::copy(idxs, idxs + 6, oidxs); |
| } |