aboutsummaryrefslogtreecommitdiff
path: root/clang/test/Modules/pr93859.cppm
blob: d1d45bb9753081ed25f4a14f9e80bc29d75d64dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// 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);
}