Skip to content

Commit d4757d5

Browse files
authored
Rollup merge of rust-lang#63961 - JohnTitor:improve-require-lang-item, r=estebank
Add Option<Span> to `require_lang_item` Fixes rust-lang#63954 I'm not sure where to take `Some(span)` or something so I use `None` in many places. r? @estebank
2 parents 99d271f + ede7a77 commit d4757d5

File tree

19 files changed

+42
-28
lines changed

19 files changed

+42
-28
lines changed

src/librustc/infer/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1460,7 +1460,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
14601460
}
14611461
}
14621462

1463-
let copy_def_id = self.tcx.require_lang_item(lang_items::CopyTraitLangItem);
1463+
let copy_def_id = self.tcx.require_lang_item(lang_items::CopyTraitLangItem, None);
14641464

14651465
// this can get called from typeck (by euv), and moves_by_default
14661466
// rightly refuses to work with inference variables, but

src/librustc/middle/lang_items.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -381,9 +381,13 @@ language_item_table! {
381381
impl<'tcx> TyCtxt<'tcx> {
382382
/// Returns the `DefId` for a given `LangItem`.
383383
/// If not found, fatally abort compilation.
384-
pub fn require_lang_item(&self, lang_item: LangItem) -> DefId {
384+
pub fn require_lang_item(&self, lang_item: LangItem, span: Option<Span>) -> DefId {
385385
self.lang_items().require(lang_item).unwrap_or_else(|msg| {
386-
self.sess.fatal(&msg)
386+
if let Some(span) = span {
387+
self.sess.span_fatal(span, &msg)
388+
} else {
389+
self.sess.fatal(&msg)
390+
}
387391
})
388392
}
389393
}

src/librustc/traits/select.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3513,7 +3513,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
35133513

35143514
// We can only make objects from sized types.
35153515
let tr = ty::TraitRef {
3516-
def_id: tcx.require_lang_item(lang_items::SizedTraitLangItem),
3516+
def_id: tcx.require_lang_item(lang_items::SizedTraitLangItem, None),
35173517
substs: tcx.mk_substs_trait(source, &[]),
35183518
};
35193519
nested.push(predicate_to_obligation(tr.to_predicate()));

src/librustc/ty/context.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -2385,13 +2385,13 @@ impl<'tcx> TyCtxt<'tcx> {
23852385

23862386
#[inline]
23872387
pub fn mk_box(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2388-
let def_id = self.require_lang_item(lang_items::OwnedBoxLangItem);
2388+
let def_id = self.require_lang_item(lang_items::OwnedBoxLangItem, None);
23892389
self.mk_generic_adt(def_id, ty)
23902390
}
23912391

23922392
#[inline]
23932393
pub fn mk_maybe_uninit(self, ty: Ty<'tcx>) -> Ty<'tcx> {
2394-
let def_id = self.require_lang_item(lang_items::MaybeUninitLangItem);
2394+
let def_id = self.require_lang_item(lang_items::MaybeUninitLangItem, None);
23952395
self.mk_generic_adt(def_id, ty)
23962396
}
23972397

src/librustc/ty/instance.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ impl<'tcx> Instance<'tcx> {
327327
}
328328

329329
pub fn resolve_drop_in_place(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> ty::Instance<'tcx> {
330-
let def_id = tcx.require_lang_item(DropInPlaceFnLangItem);
330+
let def_id = tcx.require_lang_item(DropInPlaceFnLangItem, None);
331331
let substs = tcx.intern_substs(&[ty.into()]);
332332
Instance::resolve(tcx, ty::ParamEnv::reveal_all(), def_id, substs).unwrap()
333333
}

src/librustc/ty/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2588,12 +2588,12 @@ impl<'tcx> ClosureKind {
25882588

25892589
pub fn trait_did(&self, tcx: TyCtxt<'tcx>) -> DefId {
25902590
match *self {
2591-
ClosureKind::Fn => tcx.require_lang_item(FnTraitLangItem),
2591+
ClosureKind::Fn => tcx.require_lang_item(FnTraitLangItem, None),
25922592
ClosureKind::FnMut => {
2593-
tcx.require_lang_item(FnMutTraitLangItem)
2593+
tcx.require_lang_item(FnMutTraitLangItem, None)
25942594
}
25952595
ClosureKind::FnOnce => {
2596-
tcx.require_lang_item(FnOnceTraitLangItem)
2596+
tcx.require_lang_item(FnOnceTraitLangItem, None)
25972597
}
25982598
}
25992599
}

src/librustc/ty/util.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -998,7 +998,7 @@ impl<'tcx> ty::TyS<'tcx> {
998998

999999
fn is_copy_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
10001000
let (param_env, ty) = query.into_parts();
1001-
let trait_def_id = tcx.require_lang_item(lang_items::CopyTraitLangItem);
1001+
let trait_def_id = tcx.require_lang_item(lang_items::CopyTraitLangItem, None);
10021002
tcx.infer_ctxt()
10031003
.enter(|infcx| traits::type_known_to_meet_bound_modulo_regions(
10041004
&infcx,
@@ -1011,7 +1011,7 @@ fn is_copy_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>)
10111011

10121012
fn is_sized_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
10131013
let (param_env, ty) = query.into_parts();
1014-
let trait_def_id = tcx.require_lang_item(lang_items::SizedTraitLangItem);
1014+
let trait_def_id = tcx.require_lang_item(lang_items::SizedTraitLangItem, None);
10151015
tcx.infer_ctxt()
10161016
.enter(|infcx| traits::type_known_to_meet_bound_modulo_regions(
10171017
&infcx,
@@ -1024,7 +1024,7 @@ fn is_sized_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>)
10241024

10251025
fn is_freeze_raw<'tcx>(tcx: TyCtxt<'tcx>, query: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool {
10261026
let (param_env, ty) = query.into_parts();
1027-
let trait_def_id = tcx.require_lang_item(lang_items::FreezeTraitLangItem);
1027+
let trait_def_id = tcx.require_lang_item(lang_items::FreezeTraitLangItem, None);
10281028
tcx.infer_ctxt()
10291029
.enter(|infcx| traits::type_known_to_meet_bound_modulo_regions(
10301030
&infcx,

src/librustc/ty/wf.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ impl<'a, 'tcx> WfPredicates<'a, 'tcx> {
221221
if !subty.has_escaping_bound_vars() {
222222
let cause = self.cause(cause);
223223
let trait_ref = ty::TraitRef {
224-
def_id: self.infcx.tcx.require_lang_item(lang_items::SizedTraitLangItem),
224+
def_id: self.infcx.tcx.require_lang_item(lang_items::SizedTraitLangItem, None),
225225
substs: self.infcx.tcx.mk_substs_trait(subty, &[]),
226226
};
227227
self.out.push(traits::Obligation::new(cause, self.param_env, trait_ref.to_predicate()));

src/librustc_codegen_ssa/base.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ pub fn maybe_create_entry_wrapper<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(cx: &'
456456
let arg_argv = param_argv;
457457

458458
let (start_fn, args) = if use_start_lang_item {
459-
let start_def_id = cx.tcx().require_lang_item(StartFnLangItem);
459+
let start_def_id = cx.tcx().require_lang_item(StartFnLangItem, None);
460460
let start_fn = callee::resolve_and_get_fn(
461461
cx,
462462
start_def_id,

src/librustc_mir/build/matches/test.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
443443
_ => bug!("non_scalar_compare called on non-reference type: {}", ty),
444444
};
445445

446-
let eq_def_id = self.hir.tcx().require_lang_item(EqTraitLangItem);
446+
let eq_def_id = self.hir.tcx().require_lang_item(EqTraitLangItem, None);
447447
let method = self.hir.trait_method(eq_def_id, sym::eq, deref_ty, &[deref_ty.into()]);
448448

449449
let bool_ty = self.hir.bool_ty();

src/librustc_mir/transform/qualify_consts.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1752,7 +1752,10 @@ impl<'tcx> MirPass<'tcx> for QualifyAndPromoteConstants<'tcx> {
17521752
fulfillment_cx.register_bound(&infcx,
17531753
param_env,
17541754
ty,
1755-
tcx.require_lang_item(lang_items::SyncTraitLangItem),
1755+
tcx.require_lang_item(
1756+
lang_items::SyncTraitLangItem,
1757+
Some(body.span)
1758+
),
17561759
cause);
17571760
if let Err(err) = fulfillment_cx.select_all_or_error(&infcx) {
17581761
infcx.report_fulfillment_errors(&err, None, false);

src/librustc_mir/util/elaborate_drops.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,10 @@ where
897897
) -> BasicBlock {
898898
let tcx = self.tcx();
899899
let unit_temp = Place::from(self.new_temp(tcx.mk_unit()));
900-
let free_func = tcx.require_lang_item(lang_items::BoxFreeFnLangItem);
900+
let free_func = tcx.require_lang_item(
901+
lang_items::BoxFreeFnLangItem,
902+
Some(self.source_info.span)
903+
);
901904
let args = adt.variants[VariantIdx::new(0)].fields.iter().enumerate().map(|(i, f)| {
902905
let field = Field::new(i);
903906
let field_ty = f.ty(self.tcx(), substs);

src/librustc_typeck/check/cast.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ impl<'a, 'tcx> CastCheck<'tcx> {
649649

650650
impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
651651
fn type_is_known_to_be_sized_modulo_regions(&self, ty: Ty<'tcx>, span: Span) -> bool {
652-
let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem);
652+
let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem, None);
653653
traits::type_known_to_meet_bound_modulo_regions(self, self.param_env, ty, lang_item, span)
654654
}
655655
}

src/librustc_typeck/check/closure.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
266266
let trait_ref = projection.to_poly_trait_ref(tcx);
267267

268268
let is_fn = tcx.lang_items().fn_trait_kind(trait_ref.def_id()).is_some();
269-
let gen_trait = tcx.require_lang_item(lang_items::GeneratorTraitLangItem);
269+
let gen_trait = tcx.require_lang_item(lang_items::GeneratorTraitLangItem, cause_span);
270270
let is_gen = gen_trait == trait_ref.def_id();
271271
if !is_fn && !is_gen {
272272
debug!("deduce_sig_from_projection: not fn or generator");

src/librustc_typeck/check/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2622,7 +2622,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
26222622
span: Span,
26232623
code: traits::ObligationCauseCode<'tcx>)
26242624
{
2625-
let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem);
2625+
let lang_item = self.tcx.require_lang_item(lang_items::SizedTraitLangItem, None);
26262626
self.require_type_meets(ty, span, code, lang_item);
26272627
}
26282628

src/librustc_typeck/check/wfcheck.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ fn check_type_defn<'tcx, F>(
287287
let last = idx == variant.fields.len() - 1;
288288
fcx.register_bound(
289289
field.ty,
290-
fcx.tcx.require_lang_item(lang_items::SizedTraitLangItem),
290+
fcx.tcx.require_lang_item(lang_items::SizedTraitLangItem, None),
291291
traits::ObligationCause::new(
292292
field.span,
293293
fcx.body_id,
@@ -375,7 +375,7 @@ fn check_item_type(
375375
if forbid_unsized {
376376
fcx.register_bound(
377377
item_ty,
378-
fcx.tcx.require_lang_item(lang_items::SizedTraitLangItem),
378+
fcx.tcx.require_lang_item(lang_items::SizedTraitLangItem, None),
379379
traits::ObligationCause::new(ty_span, fcx.body_id, traits::MiscObligation),
380380
);
381381
}

src/librustdoc/clean/auto_trait.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
464464
// it is *not* required (i.e., '?Sized')
465465
let sized_trait = self.cx
466466
.tcx
467-
.require_lang_item(lang_items::SizedTraitLangItem);
467+
.require_lang_item(lang_items::SizedTraitLangItem, None);
468468

469469
let mut replacer = RegionReplacer {
470470
vid_to_region: &vid_to_region,
@@ -777,9 +777,9 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
777777
fn is_fn_ty(&self, tcx: TyCtxt<'_>, ty: &Type) -> bool {
778778
match &ty {
779779
&&Type::ResolvedPath { ref did, .. } => {
780-
*did == tcx.require_lang_item(lang_items::FnTraitLangItem)
781-
|| *did == tcx.require_lang_item(lang_items::FnMutTraitLangItem)
782-
|| *did == tcx.require_lang_item(lang_items::FnOnceTraitLangItem)
780+
*did == tcx.require_lang_item(lang_items::FnTraitLangItem, None)
781+
|| *did == tcx.require_lang_item(lang_items::FnMutTraitLangItem, None)
782+
|| *did == tcx.require_lang_item(lang_items::FnOnceTraitLangItem, None)
783783
}
784784
_ => false,
785785
}

src/librustdoc/clean/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,7 @@ pub enum GenericBound {
10371037

10381038
impl GenericBound {
10391039
fn maybe_sized(cx: &DocContext<'_>) -> GenericBound {
1040-
let did = cx.tcx.require_lang_item(lang_items::SizedTraitLangItem);
1040+
let did = cx.tcx.require_lang_item(lang_items::SizedTraitLangItem, None);
10411041
let empty = cx.tcx.intern_substs(&[]);
10421042
let path = external_path(cx, &cx.tcx.item_name(did).as_str(),
10431043
Some(did), false, vec![], empty);
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
error: requires `generator` lang_item
2+
--> $DIR/lang-item-missing-generator.rs:15:17
3+
|
4+
LL | pub fn abc() -> impl FnOnce(f32) {
5+
| ^^^^^^^^^^^^^^^^
26

37
error: aborting due to previous error
48

0 commit comments

Comments
 (0)