Skip to content

Commit ccc62c8

Browse files
authored
Rollup merge of rust-lang#72216 - doctorn:require-lang-item, r=lcnr
Remove `lang_items\(\).*\.unwrap\(\)` Follows up rust-lang#72170 to remove the remaining uses of `lang_items\(\).*\.unwrap\(\)` (avoids a bunch of potential ICEs when working in `#![no_core]`). Resolves rust-lang#72195
2 parents 471d6d3 + 00268be commit ccc62c8

File tree

7 files changed

+34
-27
lines changed

7 files changed

+34
-27
lines changed

src/librustc_mir/monomorphize/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ use rustc_middle::traits;
22
use rustc_middle::ty::adjustment::CustomCoerceUnsized;
33
use rustc_middle::ty::{self, Ty, TyCtxt};
44

5+
use rustc_hir::lang_items::CoerceUnsizedTraitLangItem;
6+
57
pub mod collector;
68
pub mod partitioning;
79

@@ -10,7 +12,7 @@ pub fn custom_coerce_unsize_info<'tcx>(
1012
source_ty: Ty<'tcx>,
1113
target_ty: Ty<'tcx>,
1214
) -> CustomCoerceUnsized {
13-
let def_id = tcx.lang_items().coerce_unsized_trait().unwrap();
15+
let def_id = tcx.require_lang_item(CoerceUnsizedTraitLangItem, None);
1416

1517
let trait_ref = ty::Binder::bind(ty::TraitRef {
1618
def_id,

src/librustc_mir_build/hair/pattern/const_to_pat.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,8 @@ impl<'a, 'tcx> ConstToPat<'a, 'tcx> {
141141
// code at the moment, because types like `for <'a> fn(&'a ())` do
142142
// not *yet* implement `PartialEq`. So for now we leave this here.
143143
let ty_is_partial_eq: bool = {
144-
let partial_eq_trait_id = self.tcx().require_lang_item(EqTraitLangItem, None);
144+
let partial_eq_trait_id =
145+
self.tcx().require_lang_item(EqTraitLangItem, Some(self.span));
145146
let obligation: PredicateObligation<'_> = predicate_for_trait_def(
146147
self.tcx(),
147148
self.param_env,

src/librustc_trait_selection/traits/structural_match.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::traits::{self, ConstPatternStructural, TraitEngine};
44

55
use rustc_data_structures::fx::FxHashSet;
66
use rustc_hir as hir;
7+
use rustc_hir::lang_items::{StructuralPeqTraitLangItem, StructuralTeqTraitLangItem};
78
use rustc_middle::ty::{self, AdtDef, Ty, TyCtxt, TypeFoldable, TypeVisitor};
89
use rustc_span::Span;
910

@@ -69,7 +70,7 @@ pub fn type_marked_structural(
6970
let mut fulfillment_cx = traits::FulfillmentContext::new();
7071
let cause = ObligationCause::new(span, id, ConstPatternStructural);
7172
// require `#[derive(PartialEq)]`
72-
let structural_peq_def_id = infcx.tcx.lang_items().structural_peq_trait().unwrap();
73+
let structural_peq_def_id = infcx.tcx.require_lang_item(StructuralPeqTraitLangItem, Some(span));
7374
fulfillment_cx.register_bound(
7475
infcx,
7576
ty::ParamEnv::empty(),
@@ -80,7 +81,7 @@ pub fn type_marked_structural(
8081
// for now, require `#[derive(Eq)]`. (Doing so is a hack to work around
8182
// the type `for<'a> fn(&'a ())` failing to implement `Eq` itself.)
8283
let cause = ObligationCause::new(span, id, ConstPatternStructural);
83-
let structural_teq_def_id = infcx.tcx.lang_items().structural_teq_trait().unwrap();
84+
let structural_teq_def_id = infcx.tcx.require_lang_item(StructuralTeqTraitLangItem, Some(span));
8485
fulfillment_cx.register_bound(
8586
infcx,
8687
ty::ParamEnv::empty(),

src/librustc_typeck/check/closure.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::astconv::AstConv;
66
use crate::middle::region;
77
use rustc_hir as hir;
88
use rustc_hir::def_id::DefId;
9-
use rustc_hir::lang_items;
9+
use rustc_hir::lang_items::{FutureTraitLangItem, GeneratorTraitLangItem};
1010
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
1111
use rustc_infer::infer::LateBoundRegionConversionTime;
1212
use rustc_infer::infer::{InferOk, InferResult};
@@ -245,7 +245,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
245245
let trait_ref = projection.to_poly_trait_ref(tcx);
246246

247247
let is_fn = tcx.fn_trait_kind_from_lang_item(trait_ref.def_id()).is_some();
248-
let gen_trait = tcx.require_lang_item(lang_items::GeneratorTraitLangItem, cause_span);
248+
let gen_trait = tcx.require_lang_item(GeneratorTraitLangItem, cause_span);
249249
let is_gen = gen_trait == trait_ref.def_id();
250250
if !is_fn && !is_gen {
251251
debug!("deduce_sig_from_projection: not fn or generator");
@@ -678,7 +678,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
678678

679679
// Check that this is a projection from the `Future` trait.
680680
let trait_ref = predicate.projection_ty.trait_ref(self.tcx);
681-
let future_trait = self.tcx.lang_items().future_trait().unwrap();
681+
let future_trait = self.tcx.require_lang_item(FutureTraitLangItem, Some(cause_span));
682682
if trait_ref.def_id != future_trait {
683683
debug!("deduce_future_output_from_projection: not a future");
684684
return None;

src/librustc_typeck/check/demand.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +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;
10+
use rustc_hir::lang_items::{CloneTraitLangItem, DerefTraitLangItem};
1111
use rustc_hir::{is_range_literal, Node};
1212
use rustc_middle::ty::adjustment::AllowTwoPhase;
1313
use rustc_middle::ty::{self, AssocItem, Ty, TypeAndMut};
@@ -456,8 +456,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
456456
};
457457
if self.can_coerce(ref_ty, expected) {
458458
let mut sugg_sp = sp;
459-
if let hir::ExprKind::MethodCall(segment, _sp, args) = &expr.kind {
460-
let clone_trait = self.tcx.lang_items().clone_trait().unwrap();
459+
if let hir::ExprKind::MethodCall(ref segment, sp, ref args) = expr.kind {
460+
let clone_trait = self.tcx.require_lang_item(CloneTraitLangItem, Some(sp));
461461
if let ([arg], Some(true), sym::clone) = (
462462
&args[..],
463463
self.tables.borrow().type_dependent_def_id(expr.hir_id).map(|did| {
@@ -635,7 +635,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
635635
_ if sp == expr.span && !is_macro => {
636636
// Check for `Deref` implementations by constructing a predicate to
637637
// prove: `<T as Deref>::Output == U`
638-
let deref_trait = self.tcx.require_lang_item(DerefTraitLangItem, Some(expr.span));
638+
let deref_trait = self.tcx.require_lang_item(DerefTraitLangItem, Some(sp));
639639
let item_def_id = self
640640
.tcx
641641
.associated_items(deref_trait)

src/librustc_typeck/check/mod.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ use rustc_hir::def::{CtorOf, DefKind, Res};
100100
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId, LOCAL_CRATE};
101101
use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor};
102102
use rustc_hir::itemlikevisit::ItemLikeVisitor;
103-
use rustc_hir::lang_items;
103+
use rustc_hir::lang_items::{
104+
FutureTraitLangItem, PinTypeLangItem, SizedTraitLangItem, VaListTypeLangItem,
105+
};
104106
use rustc_hir::{ExprKind, GenericArg, HirIdMap, Item, ItemKind, Node, PatKind, QPath};
105107
use rustc_index::bit_set::BitSet;
106108
use rustc_index::vec::Idx;
@@ -1335,10 +1337,8 @@ fn check_fn<'a, 'tcx>(
13351337
// C-variadic fns also have a `VaList` input that's not listed in `fn_sig`
13361338
// (as it's created inside the body itself, not passed in from outside).
13371339
let maybe_va_list = if fn_sig.c_variadic {
1338-
let va_list_did = tcx.require_lang_item(
1339-
lang_items::VaListTypeLangItem,
1340-
Some(body.params.last().unwrap().span),
1341-
);
1340+
let va_list_did =
1341+
tcx.require_lang_item(VaListTypeLangItem, Some(body.params.last().unwrap().span));
13421342
let region = tcx.mk_region(ty::ReScope(region::Scope {
13431343
id: body.value.hir_id.local_id,
13441344
data: region::ScopeData::CallSite,
@@ -3296,7 +3296,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
32963296
code: traits::ObligationCauseCode<'tcx>,
32973297
) {
32983298
if !ty.references_error() {
3299-
let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem, None);
3299+
let lang_item = self.tcx.require_lang_item(SizedTraitLangItem, None);
33003300
self.require_type_meets(ty, span, code, lang_item);
33013301
}
33023302
}
@@ -5135,7 +5135,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
51355135
_ => {}
51365136
}
51375137
let boxed_found = self.tcx.mk_box(found);
5138-
let new_found = self.tcx.mk_lang_item(boxed_found, lang_items::PinTypeLangItem).unwrap();
5138+
let new_found = self.tcx.mk_lang_item(boxed_found, PinTypeLangItem).unwrap();
51395139
if let (true, Ok(snippet)) = (
51405140
self.can_coerce(new_found, expected),
51415141
self.sess().source_map().span_to_snippet(expr.span),
@@ -5292,7 +5292,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
52925292
let sp = expr.span;
52935293
// Check for `Future` implementations by constructing a predicate to
52945294
// prove: `<T as Future>::Output == U`
5295-
let future_trait = self.tcx.lang_items().future_trait().unwrap();
5295+
let future_trait = self.tcx.require_lang_item(FutureTraitLangItem, Some(sp));
52965296
let item_def_id = self
52975297
.tcx
52985298
.associated_items(future_trait)

src/librustc_typeck/coherence/builtin.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
use rustc_errors::struct_span_err;
55
use rustc_hir as hir;
66
use rustc_hir::def_id::{DefId, LocalDefId};
7-
use rustc_hir::lang_items::UnsizeTraitLangItem;
7+
use rustc_hir::lang_items::{
8+
CoerceUnsizedTraitLangItem, DispatchFromDynTraitLangItem, UnsizeTraitLangItem,
9+
};
810
use rustc_hir::ItemKind;
911
use rustc_infer::infer;
1012
use rustc_infer::infer::outlives::env::OutlivesEnvironment;
@@ -145,11 +147,11 @@ fn visit_implementation_of_coerce_unsized(tcx: TyCtxt<'tcx>, impl_did: LocalDefI
145147
fn visit_implementation_of_dispatch_from_dyn(tcx: TyCtxt<'_>, impl_did: LocalDefId) {
146148
debug!("visit_implementation_of_dispatch_from_dyn: impl_did={:?}", impl_did);
147149

148-
let dispatch_from_dyn_trait = tcx.lang_items().dispatch_from_dyn_trait().unwrap();
149-
150150
let impl_hir_id = tcx.hir().as_local_hir_id(impl_did);
151151
let span = tcx.hir().span(impl_hir_id);
152152

153+
let dispatch_from_dyn_trait = tcx.require_lang_item(DispatchFromDynTraitLangItem, Some(span));
154+
153155
let source = tcx.type_of(impl_did);
154156
assert!(!source.has_escaping_bound_vars());
155157
let target = {
@@ -314,22 +316,23 @@ fn visit_implementation_of_dispatch_from_dyn(tcx: TyCtxt<'_>, impl_did: LocalDef
314316

315317
pub fn coerce_unsized_info(tcx: TyCtxt<'tcx>, impl_did: DefId) -> CoerceUnsizedInfo {
316318
debug!("compute_coerce_unsized_info(impl_did={:?})", impl_did);
317-
let coerce_unsized_trait = tcx.lang_items().coerce_unsized_trait().unwrap();
319+
320+
// this provider should only get invoked for local def-ids
321+
let impl_hir_id = tcx.hir().as_local_hir_id(impl_did.expect_local());
322+
let span = tcx.hir().span(impl_hir_id);
323+
324+
let coerce_unsized_trait = tcx.require_lang_item(CoerceUnsizedTraitLangItem, Some(span));
318325

319326
let unsize_trait = tcx.lang_items().require(UnsizeTraitLangItem).unwrap_or_else(|err| {
320327
tcx.sess.fatal(&format!("`CoerceUnsized` implementation {}", err));
321328
});
322329

323-
// this provider should only get invoked for local def-ids
324-
let impl_hir_id = tcx.hir().as_local_hir_id(impl_did.expect_local());
325-
326330
let source = tcx.type_of(impl_did);
327331
let trait_ref = tcx.impl_trait_ref(impl_did).unwrap();
328332
assert_eq!(trait_ref.def_id, coerce_unsized_trait);
329333
let target = trait_ref.substs.type_at(1);
330334
debug!("visit_implementation_of_coerce_unsized: {:?} -> {:?} (bound)", source, target);
331335

332-
let span = tcx.hir().span(impl_hir_id);
333336
let param_env = tcx.param_env(impl_did);
334337
assert!(!source.has_escaping_bound_vars());
335338

0 commit comments

Comments
 (0)