@@ -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