Skip to content

Commit 62f1840

Browse files
authored
Rollup merge of #72170 - lcnr:lang_item, r=oli-obk
use `require_lang_item` over `unwrap`. Does not yet replace all uses of `lang_items\(\)\.*\.unwrap\(\)`, as there are more than I expected 😅 Fixes #72099 r? @RalfJung *edit: The goal of this this PR is to change ICE from missing lang items to a fatal error.*
2 parents d732aef + 9001a64 commit 62f1840

File tree

11 files changed

+38
-27
lines changed

11 files changed

+38
-27
lines changed

src/librustc_middle/ty/adjustment.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::ty::subst::SubstsRef;
22
use crate::ty::{self, Ty, TyCtxt};
33
use rustc_hir as hir;
44
use rustc_hir::def_id::DefId;
5+
use rustc_hir::lang_items::{DerefMutTraitLangItem, DerefTraitLangItem};
56
use rustc_macros::HashStable;
67

78
#[derive(Clone, Copy, Debug, PartialEq, Eq, RustcEncodable, RustcDecodable, HashStable)]
@@ -117,11 +118,11 @@ pub struct OverloadedDeref<'tcx> {
117118
impl<'tcx> OverloadedDeref<'tcx> {
118119
pub fn method_call(&self, tcx: TyCtxt<'tcx>, source: Ty<'tcx>) -> (DefId, SubstsRef<'tcx>) {
119120
let trait_def_id = match self.mutbl {
120-
hir::Mutability::Not => tcx.lang_items().deref_trait(),
121-
hir::Mutability::Mut => tcx.lang_items().deref_mut_trait(),
121+
hir::Mutability::Not => tcx.require_lang_item(DerefTraitLangItem, None),
122+
hir::Mutability::Mut => tcx.require_lang_item(DerefMutTraitLangItem, None),
122123
};
123124
let method_def_id = tcx
124-
.associated_items(trait_def_id.unwrap())
125+
.associated_items(trait_def_id)
125126
.in_definition_order()
126127
.find(|m| m.kind == ty::AssocKind::Fn)
127128
.unwrap()

src/librustc_middle/ty/instance.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::ty::{self, SubstsRef, Ty, TyCtxt, TypeFoldable};
44
use rustc_errors::ErrorReported;
55
use rustc_hir::def::Namespace;
66
use rustc_hir::def_id::{CrateNum, DefId};
7-
use rustc_hir::lang_items::DropInPlaceFnLangItem;
7+
use rustc_hir::lang_items::{DropInPlaceFnLangItem, FnOnceTraitLangItem};
88
use rustc_macros::HashStable;
99

1010
use std::fmt;
@@ -375,7 +375,7 @@ impl<'tcx> Instance<'tcx> {
375375
substs: ty::SubstsRef<'tcx>,
376376
) -> Instance<'tcx> {
377377
debug!("fn_once_adapter_shim({:?}, {:?})", closure_did, substs);
378-
let fn_once = tcx.lang_items().fn_once_trait().unwrap();
378+
let fn_once = tcx.require_lang_item(FnOnceTraitLangItem, None);
379379
let call_once = tcx
380380
.associated_items(fn_once)
381381
.in_definition_order()

src/librustc_middle/ty/layout.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use rustc_ast::ast::{self, IntTy, UintTy};
88
use rustc_attr as attr;
99
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
1010
use rustc_hir as hir;
11+
use rustc_hir::lang_items::{GeneratorStateLangItem, PinTypeLangItem};
1112
use rustc_index::bit_set::BitSet;
1213
use rustc_index::vec::{Idx, IndexVec};
1314
use rustc_session::{DataTypeKind, FieldInfo, SizeKind, VariantInfo};
@@ -2314,13 +2315,13 @@ impl<'tcx> ty::Instance<'tcx> {
23142315
let env_region = ty::ReLateBound(ty::INNERMOST, ty::BrEnv);
23152316
let env_ty = tcx.mk_mut_ref(tcx.mk_region(env_region), ty);
23162317

2317-
let pin_did = tcx.lang_items().pin_type().unwrap();
2318+
let pin_did = tcx.require_lang_item(PinTypeLangItem, None);
23182319
let pin_adt_ref = tcx.adt_def(pin_did);
23192320
let pin_substs = tcx.intern_substs(&[env_ty.into()]);
23202321
let env_ty = tcx.mk_adt(pin_adt_ref, pin_substs);
23212322

23222323
sig.map_bound(|sig| {
2323-
let state_did = tcx.lang_items().gen_state().unwrap();
2324+
let state_did = tcx.require_lang_item(GeneratorStateLangItem, None);
23242325
let state_adt_ref = tcx.adt_def(state_did);
23252326
let state_substs = tcx.intern_substs(&[
23262327
sig.yield_ty.into(),

src/librustc_mir/borrow_check/type_check/mod.rs

+12-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
1010
use rustc_errors::struct_span_err;
1111
use rustc_hir as hir;
1212
use rustc_hir::def_id::{DefId, LocalDefId};
13+
use rustc_hir::lang_items::{CoerceUnsizedTraitLangItem, CopyTraitLangItem, SizedTraitLangItem};
1314
use rustc_index::vec::{Idx, IndexVec};
1415
use rustc_infer::infer::canonical::QueryRegionConstraints;
1516
use rustc_infer::infer::outlives::env::RegionBoundPairs;
@@ -502,7 +503,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
502503
if let PlaceContext::NonMutatingUse(NonMutatingUseContext::Copy) = context {
503504
let tcx = self.tcx();
504505
let trait_ref = ty::TraitRef {
505-
def_id: tcx.lang_items().copy_trait().unwrap(),
506+
def_id: tcx.require_lang_item(CopyTraitLangItem, Some(self.last_span)),
506507
substs: tcx.mk_substs_trait(place_ty.ty, &[]),
507508
};
508509

@@ -1468,7 +1469,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
14681469
self.check_rvalue(body, rv, location);
14691470
if !self.tcx().features().unsized_locals {
14701471
let trait_ref = ty::TraitRef {
1471-
def_id: tcx.lang_items().sized_trait().unwrap(),
1472+
def_id: tcx.require_lang_item(SizedTraitLangItem, Some(self.last_span)),
14721473
substs: tcx.mk_substs_trait(place_ty, &[]),
14731474
};
14741475
self.prove_trait_ref(
@@ -2013,7 +2014,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
20132014
ty::Predicate::Trait(
20142015
ty::Binder::bind(ty::TraitPredicate {
20152016
trait_ref: ty::TraitRef::new(
2016-
self.tcx().lang_items().copy_trait().unwrap(),
2017+
self.tcx().require_lang_item(
2018+
CopyTraitLangItem,
2019+
Some(self.last_span),
2020+
),
20172021
tcx.mk_substs_trait(ty, &[]),
20182022
),
20192023
}),
@@ -2037,7 +2041,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
20372041
}
20382042

20392043
let trait_ref = ty::TraitRef {
2040-
def_id: tcx.lang_items().sized_trait().unwrap(),
2044+
def_id: tcx.require_lang_item(SizedTraitLangItem, Some(self.last_span)),
20412045
substs: tcx.mk_substs_trait(ty, &[]),
20422046
};
20432047

@@ -2135,7 +2139,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
21352139
CastKind::Pointer(PointerCast::Unsize) => {
21362140
let &ty = ty;
21372141
let trait_ref = ty::TraitRef {
2138-
def_id: tcx.lang_items().coerce_unsized_trait().unwrap(),
2142+
def_id: tcx.require_lang_item(
2143+
CoerceUnsizedTraitLangItem,
2144+
Some(self.last_span),
2145+
),
21392146
substs: tcx.mk_substs_trait(op.ty(body, tcx), &[ty.into()]),
21402147
};
21412148

src/librustc_mir/monomorphize/collector.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -580,10 +580,8 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> {
580580
}
581581
mir::Rvalue::NullaryOp(mir::NullOp::Box, _) => {
582582
let tcx = self.tcx;
583-
let exchange_malloc_fn_def_id = tcx
584-
.lang_items()
585-
.require(ExchangeMallocFnLangItem)
586-
.unwrap_or_else(|e| tcx.sess.fatal(&e));
583+
let exchange_malloc_fn_def_id =
584+
tcx.require_lang_item(ExchangeMallocFnLangItem, None);
587585
let instance = Instance::mono(tcx, exchange_malloc_fn_def_id);
588586
if should_monomorphize_locally(tcx, &instance) {
589587
self.output.push(create_fn_mono_item(instance));

src/librustc_mir/shim.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use rustc_hir as hir;
22
use rustc_hir::def_id::DefId;
3+
use rustc_hir::lang_items::FnMutTraitLangItem;
34
use rustc_middle::mir::*;
45
use rustc_middle::ty::query::Providers;
56
use rustc_middle::ty::subst::{InternalSubsts, Subst};
@@ -70,7 +71,7 @@ fn make_shim<'tcx>(tcx: TyCtxt<'tcx>, instance: ty::InstanceDef<'tcx>) -> Body<'
7071
build_call_shim(tcx, instance, None, CallKind::Direct(def_id), None)
7172
}
7273
ty::InstanceDef::ClosureOnceShim { call_once: _ } => {
73-
let fn_mut = tcx.lang_items().fn_mut_trait().unwrap();
74+
let fn_mut = tcx.require_lang_item(FnMutTraitLangItem, None);
7475
let call_mut = tcx
7576
.associated_items(fn_mut)
7677
.in_definition_order()

src/librustc_mir/transform/generator.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ use crate::util::storage;
6161
use rustc_data_structures::fx::FxHashMap;
6262
use rustc_hir as hir;
6363
use rustc_hir::def_id::DefId;
64+
use rustc_hir::lang_items::{GeneratorStateLangItem, PinTypeLangItem};
6465
use rustc_index::bit_set::{BitMatrix, BitSet};
6566
use rustc_index::vec::{Idx, IndexVec};
6667
use rustc_middle::mir::visit::{MutVisitor, PlaceContext};
@@ -381,7 +382,7 @@ fn make_generator_state_argument_indirect<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Bo
381382
fn make_generator_state_argument_pinned<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
382383
let ref_gen_ty = body.local_decls.raw[1].ty;
383384

384-
let pin_did = tcx.lang_items().pin_type().unwrap();
385+
let pin_did = tcx.require_lang_item(PinTypeLangItem, Some(body.span));
385386
let pin_adt_ref = tcx.adt_def(pin_did);
386387
let substs = tcx.intern_substs(&[ref_gen_ty.into()]);
387388
let pin_ref_gen_ty = tcx.mk_adt(pin_adt_ref, substs);
@@ -1207,7 +1208,7 @@ impl<'tcx> MirPass<'tcx> for StateTransform {
12071208
};
12081209

12091210
// Compute GeneratorState<yield_ty, return_ty>
1210-
let state_did = tcx.lang_items().gen_state().unwrap();
1211+
let state_did = tcx.require_lang_item(GeneratorStateLangItem, None);
12111212
let state_adt_ref = tcx.adt_def(state_did);
12121213
let state_substs = tcx.intern_substs(&[yield_ty.into(), body.return_ty().into()]);
12131214
let ret_ty = tcx.mk_adt(state_adt_ref, state_substs);

src/librustc_mir/util/elaborate_drops.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::util::patch::MirPatch;
22
use rustc_hir as hir;
3-
use rustc_hir::lang_items;
3+
use rustc_hir::lang_items::{BoxFreeFnLangItem, DropTraitLangItem};
44
use rustc_index::vec::Idx;
55
use rustc_middle::mir::*;
66
use rustc_middle::traits::Reveal;
@@ -535,7 +535,7 @@ where
535535
fn destructor_call_block(&mut self, (succ, unwind): (BasicBlock, Unwind)) -> BasicBlock {
536536
debug!("destructor_call_block({:?}, {:?})", self, succ);
537537
let tcx = self.tcx();
538-
let drop_trait = tcx.lang_items().drop_trait().unwrap();
538+
let drop_trait = tcx.require_lang_item(DropTraitLangItem, None);
539539
let drop_fn = tcx.associated_items(drop_trait).in_definition_order().next().unwrap();
540540
let ty = self.place_ty(self.place);
541541
let substs = tcx.mk_substs_trait(ty, &[]);
@@ -877,8 +877,7 @@ where
877877
) -> BasicBlock {
878878
let tcx = self.tcx();
879879
let unit_temp = Place::from(self.new_temp(tcx.mk_unit()));
880-
let free_func =
881-
tcx.require_lang_item(lang_items::BoxFreeFnLangItem, Some(self.source_info.span));
880+
let free_func = tcx.require_lang_item(BoxFreeFnLangItem, Some(self.source_info.span));
882881
let args = adt.variants[VariantIdx::new(0)]
883882
.fields
884883
.iter()

src/librustc_mir_build/hair/pattern/const_to_pat.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use rustc_hir as hir;
2+
use rustc_hir::lang_items::EqTraitLangItem;
23
use rustc_index::vec::Idx;
34
use rustc_infer::infer::{InferCtxt, TyCtxtInferExt};
45
use rustc_middle::mir::Field;
@@ -140,7 +141,7 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> {
140141
// code at the moment, because types like `for <'a> fn(&'a ())` do
141142
// not *yet* implement `PartialEq`. So for now we leave this here.
142143
let ty_is_partial_eq: bool = {
143-
let partial_eq_trait_id = self.tcx().lang_items().eq_trait().unwrap();
144+
let partial_eq_trait_id = self.tcx().require_lang_item(EqTraitLangItem, None);
144145
let obligation: PredicateObligation<'_> = predicate_for_trait_def(
145146
self.tcx(),
146147
self.param_env,

src/librustc_trait_selection/traits/project.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use crate::traits::error_reporting::InferCtxtExt;
2020
use rustc_data_structures::stack::ensure_sufficient_stack;
2121
use rustc_errors::ErrorReported;
2222
use rustc_hir::def_id::DefId;
23+
use rustc_hir::lang_items::{FnOnceTraitLangItem, GeneratorTraitLangItem};
2324
use rustc_middle::ty::fold::{TypeFoldable, TypeFolder};
2425
use rustc_middle::ty::subst::{InternalSubsts, Subst};
2526
use rustc_middle::ty::{self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, WithConstness};
@@ -1222,7 +1223,7 @@ fn confirm_generator_candidate<'cx, 'tcx>(
12221223

12231224
let tcx = selcx.tcx();
12241225

1225-
let gen_def_id = tcx.lang_items().gen_trait().unwrap();
1226+
let gen_def_id = tcx.require_lang_item(GeneratorTraitLangItem, None);
12261227

12271228
let predicate = super::util::generator_trait_ref_and_outputs(
12281229
tcx,
@@ -1309,7 +1310,7 @@ fn confirm_callable_candidate<'cx, 'tcx>(
13091310
debug!("confirm_callable_candidate({:?},{:?})", obligation, fn_sig);
13101311

13111312
// the `Output` associated type is declared on `FnOnce`
1312-
let fn_once_def_id = tcx.lang_items().fn_once_trait().unwrap();
1313+
let fn_once_def_id = tcx.require_lang_item(FnOnceTraitLangItem, None);
13131314

13141315
let predicate = super::util::closure_trait_ref_and_return_type(
13151316
tcx,

src/librustc_typeck/check/demand.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use rustc_trait_selection::traits::{self, ObligationCause};
77
use rustc_ast::util::parser::PREC_POSTFIX;
88
use rustc_errors::{Applicability, DiagnosticBuilder};
99
use rustc_hir as hir;
10+
use rustc_hir::lang_items::DerefTraitLangItem;
1011
use rustc_hir::{is_range_literal, Node};
1112
use rustc_middle::ty::adjustment::AllowTwoPhase;
1213
use rustc_middle::ty::{self, AssocItem, Ty, TypeAndMut};
@@ -634,7 +635,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
634635
_ if sp == expr.span && !is_macro => {
635636
// Check for `Deref` implementations by constructing a predicate to
636637
// prove: `<T as Deref>::Output == U`
637-
let deref_trait = self.tcx.lang_items().deref_trait().unwrap();
638+
let deref_trait = self.tcx.require_lang_item(DerefTraitLangItem, Some(expr.span));
638639
let item_def_id = self
639640
.tcx
640641
.associated_items(deref_trait)

0 commit comments

Comments
 (0)