Skip to content

Commit 70c1b6c

Browse files
committed
Define generator discriminant type in only one place
1 parent 9e06f25 commit 70c1b6c

File tree

3 files changed

+25
-17
lines changed

3 files changed

+25
-17
lines changed

src/librustc/ty/sty.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -298,14 +298,10 @@ static_assert!(MEM_SIZE_OF_TY_KIND: ::std::mem::size_of::<TyKind<'_>>() == 24);
298298
///
299299
/// ## Generators
300300
///
301-
/// Perhaps surprisingly, `ClosureSubsts` are also used for
302-
/// generators. In that case, what is written above is only half-true
303-
/// -- the set of type parameters is similar, but the role of CK and
304-
/// CS are different. CK represents the "yield type" and CS
305-
/// represents the "return type" of the generator.
306-
///
307-
/// It'd be nice to split this struct into ClosureSubsts and
308-
/// GeneratorSubsts, I believe. -nmatsakis
301+
/// Generators are handled similarly in `GeneratorSubsts`. The set of
302+
/// type parameters is similar, but the role of CK and CS are
303+
/// different. CK represents the "yield type" and CS represents the
304+
/// "return type" of the generator.
309305
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
310306
Debug, RustcEncodable, RustcDecodable, HashStable)]
311307
pub struct ClosureSubsts<'tcx> {
@@ -391,6 +387,7 @@ impl<'tcx> ClosureSubsts<'tcx> {
391387
}
392388
}
393389

390+
/// Similar to `ClosureSubsts`; see the above documentation for more.
394391
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug,
395392
RustcEncodable, RustcDecodable, HashStable)]
396393
pub struct GeneratorSubsts<'tcx> {
@@ -470,6 +467,11 @@ impl<'tcx> GeneratorSubsts<'tcx> {
470467
}
471468

472469
impl<'a, 'gcx, 'tcx> GeneratorSubsts<'tcx> {
470+
/// The type of the state "discriminant" used in the generator type.
471+
pub fn discr_ty(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> Ty<'tcx> {
472+
tcx.types.u32
473+
}
474+
473475
/// This returns the types of the MIR locals which had to be stored across suspension points.
474476
/// It is calculated in rustc_mir::transform::generator::StateTransform.
475477
/// All the types here must be in the tuple in GeneratorInterior.
@@ -484,15 +486,15 @@ impl<'a, 'gcx, 'tcx> GeneratorSubsts<'tcx> {
484486

485487
/// This is the types of the fields of a generate which
486488
/// is available before the generator transformation.
487-
/// It includes the upvars and the state discriminant which is u32.
489+
/// It includes the upvars and the state discriminant.
488490
pub fn pre_transforms_tys(self, def_id: DefId, tcx: TyCtxt<'a, 'gcx, 'tcx>) ->
489491
impl Iterator<Item=Ty<'tcx>> + 'a
490492
{
491-
self.upvar_tys(def_id, tcx).chain(iter::once(tcx.types.u32))
493+
self.upvar_tys(def_id, tcx).chain(iter::once(self.discr_ty(tcx)))
492494
}
493495

494496
/// This is the types of all the fields stored in a generator.
495-
/// It includes the upvars, state types and the state discriminant which is u32.
497+
/// It includes the upvars, state types and the state discriminant.
496498
pub fn field_tys(self, def_id: DefId, tcx: TyCtxt<'a, 'gcx, 'tcx>) ->
497499
impl Iterator<Item=Ty<'tcx>> + Captures<'gcx> + 'a
498500
{

src/librustc_mir/build/expr/as_rvalue.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,15 +255,16 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
255255
let movability = movability.unwrap();
256256
// Add the state operand since it follows the upvars in the generator
257257
// struct. See librustc_mir/transform/generator.rs for more details.
258+
let discr_ty = substs.discr_ty(this.hir.tcx());
258259
operands.push(Operand::Constant(box Constant {
259260
span: expr_span,
260-
ty: this.hir.tcx().types.u32,
261+
ty: discr_ty,
261262
user_ty: None,
262263
literal: this.hir.tcx().mk_const(
263264
ty::Const::from_bits(
264265
this.hir.tcx(),
265266
0,
266-
ty::ParamEnv::empty().and(this.hir.tcx().types.u32),
267+
ty::ParamEnv::empty().and(discr_ty),
267268
),
268269
),
269270
}));

src/librustc_mir/transform/generator.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,9 @@ struct TransformVisitor<'a, 'tcx: 'a> {
166166
// The index of the generator state in the generator struct
167167
state_field: usize,
168168

169+
// The type of the generator state in the generator struct
170+
discr_ty: Ty<'tcx>,
171+
169172
// Mapping from Local to (type of local, generator struct index)
170173
// FIXME(eddyb) This should use `IndexVec<Local, Option<_>>`.
171174
remap: FxHashMap<Local, (Ty<'tcx>, usize)>,
@@ -200,15 +203,15 @@ impl<'a, 'tcx> TransformVisitor<'a, 'tcx> {
200203

201204
// Create a statement which changes the generator state
202205
fn set_state(&self, state_disc: u32, source_info: SourceInfo) -> Statement<'tcx> {
203-
let state = self.make_field(self.state_field, self.tcx.types.u32);
206+
let state = self.make_field(self.state_field, self.discr_ty);
204207
let val = Operand::Constant(box Constant {
205208
span: source_info.span,
206-
ty: self.tcx.types.u32,
209+
ty: self.discr_ty,
207210
user_ty: None,
208211
literal: self.tcx.mk_const(ty::Const::from_bits(
209212
self.tcx,
210213
state_disc.into(),
211-
ty::ParamEnv::empty().and(self.tcx.types.u32)
214+
ty::ParamEnv::empty().and(self.discr_ty)
212215
)),
213216
});
214217
Statement {
@@ -889,10 +892,11 @@ impl MirPass for StateTransform {
889892
let gen_ty = mir.local_decls.raw[1].ty;
890893

891894
// Get the interior types and substs which typeck computed
892-
let (upvars, interior, movable) = match gen_ty.sty {
895+
let (upvars, interior, discr_ty, movable) = match gen_ty.sty {
893896
ty::Generator(_, substs, movability) => {
894897
(substs.upvar_tys(def_id, tcx).collect(),
895898
substs.witness(def_id, tcx),
899+
substs.discr_ty(tcx),
896900
movability == hir::GeneratorMovability::Movable)
897901
}
898902
_ => bug!(),
@@ -937,6 +941,7 @@ impl MirPass for StateTransform {
937941
suspension_points: Vec::new(),
938942
new_ret_local,
939943
state_field,
944+
discr_ty,
940945
};
941946
transform.visit_mir(mir);
942947

0 commit comments

Comments
 (0)