Skip to content

Commit b1fe3b0

Browse files
committed
one-less-malloc
1 parent a521231 commit b1fe3b0

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

toolchain/check/type_completion.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -123,18 +123,18 @@ static auto RequireCompleteFacetType(Context& context, SemIR::LocId loc_id,
123123
const SemIR::FacetType& facet_type,
124124
MakeDiagnosticBuilderFn diagnoser)
125125
-> bool {
126+
struct SpecificForRequires {
127+
SemIR::SpecificId specific_id;
128+
SemIR::RequireImplsBlockId requires_block_id;
129+
};
130+
llvm::SmallVector<SpecificForRequires> specifics;
131+
int specifics_done = 0;
132+
126133
llvm::SmallVector<SemIR::FacetTypeId> work = {facet_type.facet_type_id};
127-
llvm::SmallVector<SemIR::SpecificId> resolve;
128134
while (!work.empty()) {
129135
auto next_facet_type_id = work.pop_back_val();
130136
const auto& facet_type_info = context.facet_types().Get(next_facet_type_id);
131137

132-
struct SpecificForRequires {
133-
SemIR::SpecificId specific_id;
134-
SemIR::RequireImplsBlockId requires_block_id;
135-
};
136-
llvm::SmallVector<SpecificForRequires> specific_requires;
137-
138138
for (auto extends : facet_type_info.extend_constraints) {
139139
auto interface_id = extends.interface_id;
140140
const auto& interface = context.interfaces().Get(interface_id);
@@ -147,9 +147,8 @@ static auto RequireCompleteFacetType(Context& context, SemIR::LocId loc_id,
147147
return false;
148148
}
149149
if (interface.generic_id.has_value()) {
150-
specific_requires.push_back(
150+
specifics.push_back(
151151
{extends.specific_id, interface.require_impls_block_id});
152-
resolve.push_back(extends.specific_id);
153152
}
154153
}
155154

@@ -166,9 +165,8 @@ static auto RequireCompleteFacetType(Context& context, SemIR::LocId loc_id,
166165
return false;
167166
}
168167
if (constraint.generic_id.has_value()) {
169-
specific_requires.push_back(
168+
specifics.push_back(
170169
{extends.specific_id, constraint.require_impls_block_id});
171-
resolve.push_back(extends.specific_id);
172170
}
173171
}
174172

@@ -179,7 +177,9 @@ static auto RequireCompleteFacetType(Context& context, SemIR::LocId loc_id,
179177
// declaration since `extend require` can only be applied to `Self`, so the
180178
// self-type in these `require` declarations never uses any generic
181179
// parameters.
182-
for (auto [specific_id, requires_block_id] : specific_requires) {
180+
auto requires_specifics =
181+
llvm::ArrayRef(specifics).drop_front(specifics_done);
182+
for (auto [specific_id, requires_block_id] : requires_specifics) {
183183
for (auto require_impls_id :
184184
context.require_impls_blocks().Get(requires_block_id)) {
185185
const auto& require = context.require_impls().Get(require_impls_id);
@@ -198,9 +198,10 @@ static auto RequireCompleteFacetType(Context& context, SemIR::LocId loc_id,
198198
}
199199
}
200200
}
201+
specifics_done += requires_specifics.size();
201202
}
202203

203-
for (auto specific_id : resolve) {
204+
for (auto [specific_id, _] : specifics) {
204205
ResolveSpecificDefinition(context, loc_id, specific_id);
205206
}
206207

0 commit comments

Comments
 (0)