@@ -2222,6 +2222,56 @@ FnPtr::clone () const
2222
2222
get_combined_refs ());
2223
2223
}
2224
2224
2225
+ void
2226
+ FnPtr::setup_fn_once_output () const
2227
+ {
2228
+ // lookup the lang items
2229
+ auto fn_once_lookup = mappings.lookup_lang_item (LangItem::Kind::FN_ONCE);
2230
+ auto fn_once_output_lookup
2231
+ = mappings.lookup_lang_item (LangItem::Kind::FN_ONCE_OUTPUT);
2232
+ if (!fn_once_lookup)
2233
+ {
2234
+ rust_fatal_error (UNKNOWN_LOCATION,
2235
+ " Missing required %<fn_once%> lang item" );
2236
+ return ;
2237
+ }
2238
+ if (!fn_once_output_lookup)
2239
+ {
2240
+ rust_fatal_error (UNKNOWN_LOCATION,
2241
+ " Missing required %<fn_once_ouput%> lang item" );
2242
+ return ;
2243
+ }
2244
+
2245
+ DefId &trait_id = fn_once_lookup.value ();
2246
+ DefId &trait_item_id = fn_once_output_lookup.value ();
2247
+
2248
+ // resolve to the trait
2249
+ HIR::Item *item = mappings.lookup_defid (trait_id).value ();
2250
+ rust_assert (item->get_item_kind () == HIR::Item::ItemKind::Trait);
2251
+ HIR::Trait *trait = static_cast <HIR::Trait *> (item);
2252
+
2253
+ Resolver::TraitReference *trait_ref
2254
+ = Resolver::TraitResolver::Resolve (*trait);
2255
+ rust_assert (!trait_ref->is_error ());
2256
+
2257
+ // resolve to trait item
2258
+ HIR::TraitItem *trait_item
2259
+ = mappings.lookup_trait_item_defid (trait_item_id).value ();
2260
+ rust_assert (trait_item->get_item_kind ()
2261
+ == HIR::TraitItem::TraitItemKind::TYPE);
2262
+ std::string item_identifier = trait_item->trait_identifier ();
2263
+
2264
+ // setup associated types #[lang = "fn_once_output"]
2265
+ Resolver::TraitItemReference *item_reference = nullptr ;
2266
+ bool found = trait_ref->lookup_trait_item_by_type (
2267
+ item_identifier, Resolver::TraitItemReference::TraitItemType::TYPE,
2268
+ &item_reference);
2269
+ rust_assert (found);
2270
+
2271
+ // setup
2272
+ item_reference->associated_type_set (&get_result_type ());
2273
+ }
2274
+
2225
2275
void
2226
2276
ClosureType::accept_vis (TyVisitor &vis)
2227
2277
{
0 commit comments