147 lines · plain
1// Reduced from https://github.com/llvm/llvm-project/issues/938592//3// RUN: rm -rf %t4// RUN: mkdir -p %t5// RUN: split-file %s %t6//7// RUN: %clang_cc1 -std=c++20 %t/reduced_std.cppm -emit-reduced-module-interface -o %t/reduced_std.pcm8// RUN: %clang_cc1 -std=c++20 %t/Misc.cppm -emit-reduced-module-interface -o %t/Misc.pcm \9// RUN: -fprebuilt-module-path=%t10// RUN: %clang_cc1 -std=c++20 %t/Instance.cppm -emit-reduced-module-interface -o %t/Instance.pcm \11// RUN: -fprebuilt-module-path=%t12// RUN: %clang_cc1 -std=c++20 %t/Device.cppm -emit-reduced-module-interface -o %t/Device.pcm \13// RUN: -fprebuilt-module-path=%t14// RUN: %clang_cc1 -std=c++20 %t/Overlay.cppm -emit-reduced-module-interface -o %t/Overlay.pcm \15// RUN: -fprebuilt-module-path=%t16// RUN: %clang_cc1 -std=c++20 %t/App.cppm -emit-module-interface -o /dev/null \17// RUN: -fexperimental-modules-reduced-bmi -fmodule-output=%t/App.pcm \18// RUN: -fprebuilt-module-path=%t19// RUN: %clang_cc1 -std=c++20 %t/test.cc -fsyntax-only -verify \20// RUN: -fprebuilt-module-path=%t21 22//--- header.h23namespace std {24 25template <class _T1, class _T2>26struct pair27{28 _T1 first;29 _T2 second;30 31 constexpr pair()32 : first(), second() {}33 34 constexpr pair(_T1 const& __t1, _T2 const& __t2)35 : first(__t1), second(__t2) {}36};37 38template <class _T1, class _T2>39pair(_T1, _T2) -> pair<_T1, _T2>;40 41template <class _Tp>42class __tree_const_iterator {43public:44 template <class>45 friend class __tree;46};47 48template <class _Tp>49class __tree {50public:51 typedef _Tp value_type;52 typedef __tree_const_iterator<value_type> const_iterator;53 54 template <class, class, class, class>55 friend class map;56};57 58template <class _Key>59class set {60public:61 typedef __tree<_Key> __base;62 63 typedef typename __base::const_iterator iterator;64 65 set() {}66 67 pair<iterator, bool>68 insert(const _Key& __v);69};70 71template <class _InputIterator, class _OutputIterator>72inline constexpr _OutputIterator73copy(_InputIterator __first, _InputIterator __last, _OutputIterator __result) {74 return pair{__first, __last}.second;75}76 77}78 79//--- reduced_std.cppm80module;81#include "header.h"82export module reduced_std;83 84export namespace std {85 using std::set;86 using std::copy;87}88 89//--- Misc.cppm90export module Misc;91import reduced_std;92 93export void check_result(int res) {94 std::set<char> extensions;95 extensions.insert('f');96}97 98//--- Instance.cppm99export module Instance;100import reduced_std;101 102export class Instance {103public:104 Instance() {105 std::set<const char*> extensions;106 extensions.insert("foo");107 }108};109 110//--- Device.cppm111export module Device;112import reduced_std;113import Instance;114import Misc;115 116std::set<int> wtf_set;117 118//--- Overlay.cppm119export module Overlay;120 121import reduced_std;122import Device;123 124void overlay_vector_use() {125 std::set<int> nums;126 nums.insert(1);127}128 129//--- App.cppm130module;131#include "header.h"132export module App;133import Overlay;134 135std::set<float> fs;136 137//--- test.cc138// expected-no-diagnostics139import reduced_std;140import App;141 142void render() {143 unsigned *oidxs = nullptr;144 unsigned idxs[] = {0, 1, 2, 0, 2, 3};145 std::copy(idxs, idxs + 6, oidxs);146}147