// 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 struct pair { _T1 first; _T2 second; constexpr pair() : first(), second() {} constexpr pair(_T1 const& __t1, _T2 const& __t2) : first(__t1), second(__t2) {} }; template pair(_T1, _T2) -> pair<_T1, _T2>; template class __tree_const_iterator { public: template friend class __tree; }; template class __tree { public: typedef _Tp value_type; typedef __tree_const_iterator const_iterator; template friend class map; }; template class set { public: typedef __tree<_Key> __base; typedef typename __base::const_iterator iterator; set() {} pair insert(const _Key& __v); }; template 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 extensions; extensions.insert('f'); } //--- Instance.cppm export module Instance; import reduced_std; export class Instance { public: Instance() { std::set extensions; extensions.insert("foo"); } }; //--- Device.cppm export module Device; import reduced_std; import Instance; import Misc; std::set wtf_set; //--- Overlay.cppm export module Overlay; import reduced_std; import Device; void overlay_vector_use() { std::set nums; nums.insert(1); } //--- App.cppm module; #include "header.h" export module App; import Overlay; std::set 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); }