Skip to content

Commit 43ebac1

Browse files
committed
extract ConstKind::Unevaluated into a struct
1 parent 41b315a commit 43ebac1

File tree

25 files changed

+129
-86
lines changed

25 files changed

+129
-86
lines changed

compiler/rustc_codegen_ssa/src/mir/constant.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
3030
mir::ConstantKind::Val(val, _) => return Ok(val),
3131
};
3232
match ct.val {
33-
ty::ConstKind::Unevaluated(def, substs, promoted) => self
33+
ty::ConstKind::Unevaluated(ty::Unevaluated { def, substs, promoted }) => self
3434
.cx
3535
.tcx()
3636
.const_eval_resolve(ty::ParamEnv::reveal_all(), def, substs, promoted, None)

compiler/rustc_middle/src/ty/consts.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,18 +98,18 @@ impl<'tcx> Const<'tcx> {
9898
let name = tcx.hir().name(hir_id);
9999
ty::ConstKind::Param(ty::ParamConst::new(index, name))
100100
}
101-
_ => ty::ConstKind::Unevaluated(
102-
def.to_global(),
103-
InternalSubsts::identity_for_item(tcx, def.did.to_def_id()),
104-
None,
105-
),
101+
_ => ty::ConstKind::Unevaluated(ty::Unevaluated {
102+
def: def.to_global(),
103+
substs: InternalSubsts::identity_for_item(tcx, def.did.to_def_id()),
104+
promoted: None,
105+
}),
106106
};
107107

108108
tcx.mk_const(ty::Const { val, ty })
109109
}
110110

111-
#[inline]
112111
/// Interns the given value as a constant.
112+
#[inline]
113113
pub fn from_value(tcx: TyCtxt<'tcx>, val: ConstValue<'tcx>, ty: Ty<'tcx>) -> &'tcx Self {
114114
tcx.mk_const(Self { val: ConstKind::Value(val), ty })
115115
}

compiler/rustc_middle/src/ty/consts/kind.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,18 @@ use rustc_macros::HashStable;
1212
use rustc_target::abi::Size;
1313

1414
use super::ScalarInt;
15+
/// An unevaluated, potentially generic, constant.
16+
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, TyEncodable, TyDecodable)]
17+
#[derive(Hash, HashStable)]
18+
pub struct Unevaluated<'tcx> {
19+
pub def: ty::WithOptConstParam<DefId>,
20+
pub substs: SubstsRef<'tcx>,
21+
pub promoted: Option<Promoted>,
22+
}
1523

1624
/// Represents a constant in Rust.
17-
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, TyEncodable, TyDecodable, Hash)]
18-
#[derive(HashStable)]
25+
#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, TyEncodable, TyDecodable)]
26+
#[derive(Hash, HashStable)]
1927
pub enum ConstKind<'tcx> {
2028
/// A const generic parameter.
2129
Param(ty::ParamConst),
@@ -31,7 +39,7 @@ pub enum ConstKind<'tcx> {
3139

3240
/// Used in the HIR by using `Unevaluated` everywhere and later normalizing to one of the other
3341
/// variants when the code is monomorphic enough for that.
34-
Unevaluated(ty::WithOptConstParam<DefId>, SubstsRef<'tcx>, Option<Promoted>),
42+
Unevaluated(Unevaluated<'tcx>),
3543

3644
/// Used to hold computed value.
3745
Value(ConstValue<'tcx>),
@@ -102,7 +110,7 @@ impl<'tcx> ConstKind<'tcx> {
102110
tcx: TyCtxt<'tcx>,
103111
param_env: ParamEnv<'tcx>,
104112
) -> Option<Result<ConstValue<'tcx>, ErrorReported>> {
105-
if let ConstKind::Unevaluated(def, substs, promoted) = self {
113+
if let ConstKind::Unevaluated(Unevaluated { def, substs, promoted }) = self {
106114
use crate::mir::interpret::ErrorHandled;
107115

108116
// HACK(eddyb) this erases lifetimes even though `const_eval_resolve`

compiler/rustc_middle/src/ty/flags.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,7 @@ impl FlagComputation {
270270
fn add_const(&mut self, c: &ty::Const<'_>) {
271271
self.add_ty(c.ty);
272272
match c.val {
273-
ty::ConstKind::Unevaluated(_, substs, _) => {
274-
self.add_substs(substs);
275-
self.add_flags(TypeFlags::HAS_CT_PROJECTION);
276-
}
273+
ty::ConstKind::Unevaluated(unevaluated) => self.add_unevaluated_const(unevaluated),
277274
ty::ConstKind::Infer(infer) => {
278275
self.add_flags(TypeFlags::STILL_FURTHER_SPECIALIZABLE);
279276
match infer {
@@ -297,6 +294,11 @@ impl FlagComputation {
297294
}
298295
}
299296

297+
fn add_unevaluated_const(&mut self, ct: ty::Unevaluated<'tcx>) {
298+
self.add_substs(ct.substs);
299+
self.add_flags(TypeFlags::HAS_CT_PROJECTION);
300+
}
301+
300302
fn add_existential_projection(&mut self, projection: &ty::ExistentialProjection<'_>) {
301303
self.add_substs(projection.substs);
302304
self.add_ty(projection.ty);

compiler/rustc_middle/src/ty/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ pub use rustc_type_ir::*;
5555

5656
pub use self::binding::BindingMode;
5757
pub use self::binding::BindingMode::*;
58-
pub use self::consts::{Const, ConstInt, ConstKind, InferConst, ScalarInt, ValTree};
58+
pub use self::consts::{Const, ConstInt, ConstKind, InferConst, ScalarInt, Unevaluated, ValTree};
5959
pub use self::context::{
6060
tls, CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations,
6161
CtxtInterners, DelaySpanBugEmitted, FreeRegionInfo, GeneratorInteriorTypeCause, GlobalCtxt,

compiler/rustc_middle/src/ty/print/pretty.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -915,7 +915,7 @@ pub trait PrettyPrinter<'tcx>:
915915
}
916916

917917
match ct.val {
918-
ty::ConstKind::Unevaluated(def, substs, promoted) => {
918+
ty::ConstKind::Unevaluated(ty::Unevaluated { def, substs, promoted }) => {
919919
if let Some(promoted) = promoted {
920920
p!(print_value_path(def.did, substs));
921921
p!(write("::{:?}", promoted));

compiler/rustc_middle/src/ty/relate.rs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -531,24 +531,26 @@ pub fn super_relate_consts<R: TypeRelation<'tcx>>(
531531
check_const_value_eq(relation, a_val, b_val, a, b)?
532532
}
533533

534-
(
535-
ty::ConstKind::Unevaluated(a_def, a_substs, None),
536-
ty::ConstKind::Unevaluated(b_def, b_substs, None),
537-
) if tcx.features().const_evaluatable_checked && !relation.visit_ct_substs() => {
538-
tcx.try_unify_abstract_consts(((a_def, a_substs), (b_def, b_substs)))
534+
(ty::ConstKind::Unevaluated(au), ty::ConstKind::Unevaluated(bu))
535+
if tcx.features().const_evaluatable_checked && !relation.visit_ct_substs() =>
536+
{
537+
tcx.try_unify_abstract_consts(((au.def, au.substs), (bu.def, bu.substs)))
539538
}
540539

541540
// While this is slightly incorrect, it shouldn't matter for `min_const_generics`
542541
// and is the better alternative to waiting until `const_evaluatable_checked` can
543542
// be stabilized.
544-
(
545-
ty::ConstKind::Unevaluated(a_def, a_substs, a_promoted),
546-
ty::ConstKind::Unevaluated(b_def, b_substs, b_promoted),
547-
) if a_def == b_def && a_promoted == b_promoted => {
543+
(ty::ConstKind::Unevaluated(au), ty::ConstKind::Unevaluated(bu))
544+
if au.def == bu.def && au.promoted == bu.promoted =>
545+
{
548546
let substs =
549-
relation.relate_with_variance(ty::Variance::Invariant, a_substs, b_substs)?;
547+
relation.relate_with_variance(ty::Variance::Invariant, au.substs, bu.substs)?;
550548
return Ok(tcx.mk_const(ty::Const {
551-
val: ty::ConstKind::Unevaluated(a_def, substs, a_promoted),
549+
val: ty::ConstKind::Unevaluated(ty::Unevaluated {
550+
def: au.def,
551+
substs,
552+
promoted: au.promoted,
553+
}),
552554
ty: a.ty,
553555
}));
554556
}

compiler/rustc_middle/src/ty/structural_impls.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,8 +1031,12 @@ impl<'tcx> TypeFoldable<'tcx> for ty::ConstKind<'tcx> {
10311031
match self {
10321032
ty::ConstKind::Infer(ic) => ty::ConstKind::Infer(ic.fold_with(folder)),
10331033
ty::ConstKind::Param(p) => ty::ConstKind::Param(p.fold_with(folder)),
1034-
ty::ConstKind::Unevaluated(did, substs, promoted) => {
1035-
ty::ConstKind::Unevaluated(did, substs.fold_with(folder), promoted)
1034+
ty::ConstKind::Unevaluated(ty::Unevaluated { def, substs, promoted }) => {
1035+
ty::ConstKind::Unevaluated(ty::Unevaluated {
1036+
def,
1037+
substs: substs.fold_with(folder),
1038+
promoted,
1039+
})
10361040
}
10371041
ty::ConstKind::Value(_)
10381042
| ty::ConstKind::Bound(..)
@@ -1045,7 +1049,7 @@ impl<'tcx> TypeFoldable<'tcx> for ty::ConstKind<'tcx> {
10451049
match *self {
10461050
ty::ConstKind::Infer(ic) => ic.visit_with(visitor),
10471051
ty::ConstKind::Param(p) => p.visit_with(visitor),
1048-
ty::ConstKind::Unevaluated(_, substs, _) => substs.visit_with(visitor),
1052+
ty::ConstKind::Unevaluated(ct) => ct.substs.visit_with(visitor),
10491053
ty::ConstKind::Value(_)
10501054
| ty::ConstKind::Bound(..)
10511055
| ty::ConstKind::Placeholder(_)

compiler/rustc_middle/src/ty/walk.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,8 @@ fn push_inner<'tcx>(stack: &mut TypeWalkerStack<'tcx>, parent: GenericArg<'tcx>)
195195
| ty::ConstKind::Value(_)
196196
| ty::ConstKind::Error(_) => {}
197197

198-
ty::ConstKind::Unevaluated(_, substs, _) => {
199-
stack.extend(substs.iter().rev());
198+
ty::ConstKind::Unevaluated(ct) => {
199+
stack.extend(ct.substs.iter().rev());
200200
}
201201
}
202202
}

compiler/rustc_mir/src/borrow_check/type_check/mod.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -316,14 +316,12 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
316316
let tcx = self.tcx();
317317
let maybe_uneval = match constant.literal {
318318
ConstantKind::Ty(ct) => match ct.val {
319-
ty::ConstKind::Unevaluated(def, substs, promoted) => {
320-
Some((def, substs, promoted))
321-
}
319+
ty::ConstKind::Unevaluated(uv) => Some(uv),
322320
_ => None,
323321
},
324322
_ => None,
325323
};
326-
if let Some((def, substs, promoted)) = maybe_uneval {
324+
if let Some(ty::Unevaluated { def, substs, promoted }) = maybe_uneval {
327325
if let Some(promoted) = promoted {
328326
let check_err = |verifier: &mut TypeVerifier<'a, 'b, 'tcx>,
329327
promoted: &Body<'tcx>,

compiler/rustc_mir/src/interpret/operand.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
560560
match val.val {
561561
ty::ConstKind::Param(_) | ty::ConstKind::Bound(..) => throw_inval!(TooGeneric),
562562
ty::ConstKind::Error(_) => throw_inval!(AlreadyReported(ErrorReported)),
563-
ty::ConstKind::Unevaluated(def, substs, promoted) => {
563+
ty::ConstKind::Unevaluated(ty::Unevaluated { def, substs, promoted }) => {
564564
let instance = self.resolve(def, substs)?;
565565
Ok(self.eval_to_allocation(GlobalId { instance, promoted })?.into())
566566
}

compiler/rustc_mir/src/monomorphize/collector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> {
646646

647647
match substituted_constant.val {
648648
ty::ConstKind::Value(val) => collect_const_value(self.tcx, val, self.output),
649-
ty::ConstKind::Unevaluated(def, substs, promoted) => {
649+
ty::ConstKind::Unevaluated(ty::Unevaluated { def, substs, promoted }) => {
650650
match self.tcx.const_eval_resolve(param_env, def, substs, promoted, None) {
651651
Ok(val) => collect_const_value(self.tcx, val, self.output),
652652
Err(ErrorHandled::Reported(ErrorReported) | ErrorHandled::Linted) => {}

compiler/rustc_mir/src/monomorphize/polymorphize.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> {
299299
self.unused_parameters.clear(param.index);
300300
ControlFlow::CONTINUE
301301
}
302-
ty::ConstKind::Unevaluated(def, _, Some(p))
302+
ty::ConstKind::Unevaluated(ty::Unevaluated { def, substs: _, promoted: Some(p)})
303303
// Avoid considering `T` unused when constants are of the form:
304304
// `<Self as Foo<T>>::foo::promoted[p]`
305305
if self.def_id == def.did && !self.tcx.generics_of(def.did).has_self =>
@@ -310,10 +310,10 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> {
310310
self.visit_body(&promoted[p]);
311311
ControlFlow::CONTINUE
312312
}
313-
ty::ConstKind::Unevaluated(def, unevaluated_substs, None)
313+
ty::ConstKind::Unevaluated(ty::Unevaluated { def, substs, promoted: None })
314314
if self.tcx.def_kind(def.did) == DefKind::AnonConst =>
315315
{
316-
self.visit_child_body(def.did, unevaluated_substs);
316+
self.visit_child_body(def.did, substs);
317317
ControlFlow::CONTINUE
318318
}
319319
_ => c.super_visit_with(self),

compiler/rustc_mir/src/transform/check_consts/qualifs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ where
247247

248248
// Check the qualifs of the value of `const` items.
249249
if let Some(ct) = constant.literal.const_for_ty() {
250-
if let ty::ConstKind::Unevaluated(def, _, promoted) = ct.val {
250+
if let ty::ConstKind::Unevaluated(ty::Unevaluated { def, substs: _, promoted }) = ct.val {
251251
assert!(promoted.is_none());
252252
// Don't peek inside trait associated constants.
253253
if cx.tcx.trait_of_item(def.did).is_none() {

compiler/rustc_mir/src/transform/const_prop.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,11 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
491491
let lint_only = match c.literal {
492492
ConstantKind::Ty(ct) => match ct.val {
493493
// Promoteds must lint and not error as the user didn't ask for them
494-
ConstKind::Unevaluated(_, _, Some(_)) => true,
494+
ConstKind::Unevaluated(ty::Unevaluated {
495+
def: _,
496+
substs: _,
497+
promoted: Some(_),
498+
}) => true,
495499
// Out of backwards compatibility we cannot report hard errors in unused
496500
// generic functions using associated constants of the generic parameters.
497501
_ => c.literal.needs_subst(),

compiler/rustc_mir/src/transform/inline.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,7 @@ impl Inliner<'tcx> {
630630
caller_body.required_consts.extend(
631631
callee_body.required_consts.iter().copied().filter(|&ct| {
632632
match ct.literal.const_for_ty() {
633-
Some(ct) => matches!(ct.val, ConstKind::Unevaluated(_, _, _)),
633+
Some(ct) => matches!(ct.val, ConstKind::Unevaluated(_)),
634634
None => true,
635635
}
636636
}),

compiler/rustc_mir/src/transform/promote_consts.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,17 +1001,17 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> {
10011001
literal: tcx
10021002
.mk_const(ty::Const {
10031003
ty,
1004-
val: ty::ConstKind::Unevaluated(
1004+
val: ty::ConstKind::Unevaluated(ty::Unevaluated {
10051005
def,
1006-
InternalSubsts::for_item(tcx, def.did, |param, _| {
1006+
substs: InternalSubsts::for_item(tcx, def.did, |param, _| {
10071007
if let ty::GenericParamDefKind::Lifetime = param.kind {
10081008
tcx.lifetimes.re_erased.into()
10091009
} else {
10101010
tcx.mk_param_from_def(param)
10111011
}
10121012
}),
1013-
Some(promoted_id),
1014-
),
1013+
promoted: Some(promoted_id),
1014+
}),
10151015
})
10161016
.into(),
10171017
}))

compiler/rustc_mir/src/transform/required_consts.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ impl<'a, 'tcx> RequiredConstsVisitor<'a, 'tcx> {
1515
impl<'a, 'tcx> Visitor<'tcx> for RequiredConstsVisitor<'a, 'tcx> {
1616
fn visit_constant(&mut self, constant: &Constant<'tcx>, _: Location) {
1717
if let Some(ct) = constant.literal.const_for_ty() {
18-
if let ConstKind::Unevaluated(_, _, _) = ct.val {
18+
if let ConstKind::Unevaluated(_) = ct.val {
1919
self.required_consts.push(*constant);
2020
}
2121
}

compiler/rustc_mir_build/src/thir/cx/expr.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -707,11 +707,11 @@ impl<'thir, 'tcx> Cx<'thir, 'tcx> {
707707
// and not the beginning of discriminants (which is always `0`)
708708
let substs = InternalSubsts::identity_for_item(self.tcx(), did);
709709
let lhs = mk_const(self.tcx().mk_const(ty::Const {
710-
val: ty::ConstKind::Unevaluated(
711-
ty::WithOptConstParam::unknown(did),
710+
val: ty::ConstKind::Unevaluated(ty::Unevaluated {
711+
def: ty::WithOptConstParam::unknown(did),
712712
substs,
713-
None,
714-
),
713+
promoted: None,
714+
}),
715715
ty: var_ty,
716716
}));
717717
let bin =
@@ -905,11 +905,11 @@ impl<'thir, 'tcx> Cx<'thir, 'tcx> {
905905
debug!("convert_path_expr: (const) user_ty={:?}", user_ty);
906906
ExprKind::Literal {
907907
literal: self.tcx.mk_const(ty::Const {
908-
val: ty::ConstKind::Unevaluated(
909-
ty::WithOptConstParam::unknown(def_id),
908+
val: ty::ConstKind::Unevaluated(ty::Unevaluated {
909+
def: ty::WithOptConstParam::unknown(def_id),
910910
substs,
911-
None,
912-
),
911+
promoted: None,
912+
}),
913913
ty: self.typeck_results().node_type(expr.hir_id),
914914
}),
915915
user_ty,

compiler/rustc_trait_selection/src/traits/auto_trait.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,12 @@ impl AutoTraitFinder<'tcx> {
803803
}
804804
ty::PredicateKind::ConstEquate(c1, c2) => {
805805
let evaluate = |c: &'tcx ty::Const<'tcx>| {
806-
if let ty::ConstKind::Unevaluated(def, substs, promoted) = c.val {
806+
if let ty::ConstKind::Unevaluated(ty::Unevaluated {
807+
def,
808+
substs,
809+
promoted,
810+
}) = c.val
811+
{
807812
match select.infcx().const_eval_resolve(
808813
obligation.param_env,
809814
def,

0 commit comments

Comments
 (0)