Skip to content

Commit 47f6a9d

Browse files
authored
Rollup merge of #74276 - lcnr:discriminant-kind-what, r=nagisa
improve DiscriminantKind handling Adds a lang item `discriminant_type` for the associated type `DiscriminantKind::Discriminant`. Changes the discriminant of generators from `i32` to `u32`, which should not be observable to fix an oversight where MIR was using `u32` and codegen and typeck used `i32`.
2 parents 0d07db9 + fcf52c1 commit 47f6a9d

File tree

5 files changed

+12
-17
lines changed

5 files changed

+12
-17
lines changed

src/libcore/marker.rs

+1
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,7 @@ mod impls {
693693
pub trait DiscriminantKind {
694694
/// The type of the discriminant, which must satisfy the trait
695695
/// bounds required by `mem::Discriminant`.
696+
#[cfg_attr(not(bootstrap), lang = "discriminant_type")]
696697
type Discriminant: Clone + Copy + Debug + Eq + PartialEq + Hash + Send + Sync + Unpin;
697698
}
698699

src/librustc_hir/lang_items.rs

+3
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,9 @@ language_item_table! {
193193
CloneTraitLangItem, sym::clone, clone_trait, Target::Trait;
194194
SyncTraitLangItem, sym::sync, sync_trait, Target::Trait;
195195
DiscriminantKindTraitLangItem, sym::discriminant_kind, discriminant_kind_trait, Target::Trait;
196+
// The associated item of `trait DiscriminantKind`.
197+
DiscriminantTypeLangItem, sym::discriminant_type, discriminant_type, Target::AssocTy;
198+
196199
FreezeTraitLangItem, sym::freeze, freeze_trait, Target::Trait;
197200

198201
DropTraitLangItem, sym::drop, drop_trait, Target::Trait;

src/librustc_span/symbol.rs

+1
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ symbols! {
327327
diagnostic,
328328
direct,
329329
discriminant_kind,
330+
discriminant_type,
330331
discriminant_value,
331332
dispatch_from_dyn,
332333
div,

src/librustc_trait_selection/traits/project.rs

+5-15
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@ use crate::traits::error_reporting::InferCtxtExt;
2323
use rustc_data_structures::stack::ensure_sufficient_stack;
2424
use rustc_errors::ErrorReported;
2525
use rustc_hir::def_id::DefId;
26-
use rustc_hir::lang_items::{FnOnceOutputLangItem, FnOnceTraitLangItem, GeneratorTraitLangItem};
26+
use rustc_hir::lang_items::{
27+
DiscriminantTypeLangItem, FnOnceOutputLangItem, FnOnceTraitLangItem, GeneratorTraitLangItem,
28+
};
2729
use rustc_infer::infer::resolve::OpportunisticRegionResolver;
2830
use rustc_middle::ty::fold::{TypeFoldable, TypeFolder};
2931
use rustc_middle::ty::subst::Subst;
30-
use rustc_middle::ty::util::IntTypeExt;
3132
use rustc_middle::ty::{self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, WithConstness};
3233
use rustc_span::symbol::sym;
3334
use rustc_span::DUMMY_SP;
@@ -1324,22 +1325,11 @@ fn confirm_discriminant_kind_candidate<'cx, 'tcx>(
13241325
let self_ty = selcx.infcx().shallow_resolve(obligation.predicate.self_ty());
13251326
let substs = tcx.mk_substs([self_ty.into()].iter());
13261327

1327-
let assoc_items = tcx.associated_items(tcx.lang_items().discriminant_kind_trait().unwrap());
1328-
// FIXME: emit an error if the trait definition is wrong
1329-
let discriminant_def_id = assoc_items.in_definition_order().next().unwrap().def_id;
1330-
1331-
let discriminant_ty = match self_ty.kind {
1332-
// Use the discriminant type for enums.
1333-
ty::Adt(adt, _) if adt.is_enum() => adt.repr.discr_type().to_ty(tcx),
1334-
// Default to `i32` for generators.
1335-
ty::Generator(..) => tcx.types.i32,
1336-
// Use `u8` for all other types.
1337-
_ => tcx.types.u8,
1338-
};
1328+
let discriminant_def_id = tcx.require_lang_item(DiscriminantTypeLangItem, None);
13391329

13401330
let predicate = ty::ProjectionPredicate {
13411331
projection_ty: ty::ProjectionTy { substs, item_def_id: discriminant_def_id },
1342-
ty: discriminant_ty,
1332+
ty: self_ty.discriminant_ty(tcx),
13431333
};
13441334

13451335
confirm_param_env_candidate(selcx, obligation, ty::Binder::bind(predicate))

src/test/ui/generator/discriminant.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ macro_rules! yield250 {
6666
}
6767

6868
fn cycle(
69-
gen: impl Generator<()> + Unpin + DiscriminantKind<Discriminant = i32>,
70-
expected_max_discr: i32
69+
gen: impl Generator<()> + Unpin + DiscriminantKind<Discriminant = u32>,
70+
expected_max_discr: u32
7171
) {
7272
let mut gen = Box::pin(gen);
7373
let mut max_discr = 0;

0 commit comments

Comments
 (0)