Skip to content

Commit fcce4d1

Browse files
committed
add is_type_const to AliasTermKind consts
1 parent 57cb10a commit fcce4d1

11 files changed

Lines changed: 58 additions & 51 deletions

File tree

compiler/rustc_infer/src/infer/relate/generalize.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ impl<'tcx> InferCtxt<'tcx> {
188188
bug!("generalized `{source_term:?} to infer, not an alias");
189189
};
190190
match source_alias.kind(self.tcx) {
191-
ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst => {
191+
ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst { .. } => {
192192
// FIXME: This does not handle subtyping correctly, we could
193193
// instead create a new inference variable `?normalized_source`, emitting
194194
// `Projection(normalized_source, ?ty_normalized)` and
@@ -204,8 +204,8 @@ impl<'tcx> InferCtxt<'tcx> {
204204
| ty::AliasTermKind::OpaqueTy => {
205205
return Err(TypeError::CyclicTy(source_term.expect_type()));
206206
}
207-
ty::AliasTermKind::InherentConst
208-
| ty::AliasTermKind::FreeConst
207+
ty::AliasTermKind::InherentConst { .. }
208+
| ty::AliasTermKind::FreeConst { .. }
209209
| ty::AliasTermKind::UnevaluatedConst => {
210210
return Err(TypeError::CyclicConst(source_term.expect_const()));
211211
}

compiler/rustc_middle/src/ty/context/impl_interner.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,17 +212,17 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
212212
ty::AliasTermKind::ProjectionTy
213213
}
214214
}
215-
DefKind::AssocConst { .. } => {
215+
DefKind::AssocConst { is_type_const } => {
216216
if let DefKind::Impl { of_trait: false } = self.def_kind(self.parent(alias.def_id))
217217
{
218-
ty::AliasTermKind::InherentConst
218+
ty::AliasTermKind::InherentConst { is_type_const }
219219
} else {
220-
ty::AliasTermKind::ProjectionConst
220+
ty::AliasTermKind::ProjectionConst { is_type_const }
221221
}
222222
}
223223
DefKind::OpaqueTy => ty::AliasTermKind::OpaqueTy,
224224
DefKind::TyAlias => ty::AliasTermKind::FreeTy,
225-
DefKind::Const { .. } => ty::AliasTermKind::FreeConst,
225+
DefKind::Const { is_type_const } => ty::AliasTermKind::FreeConst { is_type_const },
226226
DefKind::AnonConst | DefKind::Ctor(_, CtorKind::Const) => {
227227
ty::AliasTermKind::UnevaluatedConst
228228
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3152,7 +3152,7 @@ define_print! {
31523152

31533153
ty::AliasTerm<'tcx> {
31543154
match self.kind(p.tcx()) {
3155-
ty::AliasTermKind::InherentTy | ty::AliasTermKind::InherentConst => p.pretty_print_inherent_projection(*self)?,
3155+
ty::AliasTermKind::InherentTy | ty::AliasTermKind::InherentConst { .. } => p.pretty_print_inherent_projection(*self)?,
31563156
ty::AliasTermKind::ProjectionTy => {
31573157
if !(p.should_print_verbose() || with_reduced_queries())
31583158
&& p.tcx().is_impl_trait_in_trait(self.def_id)
@@ -3163,10 +3163,10 @@ define_print! {
31633163
}
31643164
}
31653165
ty::AliasTermKind::FreeTy
3166-
| ty::AliasTermKind::FreeConst
3166+
| ty::AliasTermKind::FreeConst { .. }
31673167
| ty::AliasTermKind::OpaqueTy
31683168
| ty::AliasTermKind::UnevaluatedConst
3169-
| ty::AliasTermKind::ProjectionConst => {
3169+
| ty::AliasTermKind::ProjectionConst { .. } => {
31703170
p.print_def_path(self.def_id, self.args)?;
31713171
}
31723172
}

compiler/rustc_middle/src/ty/util.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -948,11 +948,11 @@ impl<'tcx> TyCtxt<'tcx> {
948948
}
949949
ty::AliasTermKind::OpaqueTy => Some(self.variances_of(def_id)),
950950
ty::AliasTermKind::InherentTy
951-
| ty::AliasTermKind::InherentConst
951+
| ty::AliasTermKind::InherentConst { .. }
952952
| ty::AliasTermKind::FreeTy
953-
| ty::AliasTermKind::FreeConst
953+
| ty::AliasTermKind::FreeConst { .. }
954954
| ty::AliasTermKind::UnevaluatedConst
955-
| ty::AliasTermKind::ProjectionConst => None,
955+
| ty::AliasTermKind::ProjectionConst { .. } => None,
956956
}
957957
}
958958
}

compiler/rustc_next_trait_solver/src/solve/normalizes_to/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ where
3232
debug_assert!(self.term_is_fully_unconstrained(goal));
3333
let cx = self.cx();
3434
match goal.predicate.alias.kind(cx) {
35-
ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst => {
35+
ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst { .. } => {
3636
let trait_ref = goal.predicate.alias.trait_ref(cx);
3737
let (_, proven_via) =
3838
self.probe(|_| ProbeKind::ShadowedEnvProbing).enter(|ecx| {
@@ -83,11 +83,11 @@ where
8383
},
8484
)
8585
}
86-
ty::AliasTermKind::InherentTy | ty::AliasTermKind::InherentConst => {
86+
ty::AliasTermKind::InherentTy | ty::AliasTermKind::InherentConst { .. } => {
8787
self.normalize_inherent_associated_term(goal)
8888
}
8989
ty::AliasTermKind::OpaqueTy => self.normalize_opaque_type(goal),
90-
ty::AliasTermKind::FreeTy | ty::AliasTermKind::FreeConst => {
90+
ty::AliasTermKind::FreeTy | ty::AliasTermKind::FreeConst { .. } => {
9191
self.normalize_free_alias(goal)
9292
}
9393
ty::AliasTermKind::UnevaluatedConst => self.normalize_anon_const(goal),
@@ -264,7 +264,7 @@ where
264264
let error_response = |ecx: &mut EvalCtxt<'_, D>, guar| {
265265
let error_term = match goal.predicate.alias.kind(cx) {
266266
ty::AliasTermKind::ProjectionTy => Ty::new_error(cx, guar).into(),
267-
ty::AliasTermKind::ProjectionConst => Const::new_error(cx, guar).into(),
267+
ty::AliasTermKind::ProjectionConst { .. } => Const::new_error(cx, guar).into(),
268268
kind => panic!("expected projection, found {kind:?}"),
269269
};
270270
ecx.instantiate_normalizes_to_term(goal, error_term);
@@ -382,7 +382,7 @@ where
382382
ty::AliasTermKind::ProjectionTy => {
383383
cx.type_of(target_item_def_id).map_bound(|ty| ty.into())
384384
}
385-
ty::AliasTermKind::ProjectionConst => {
385+
ty::AliasTermKind::ProjectionConst { .. } => {
386386
cx.const_of_item(target_item_def_id).map_bound(|ct| ct.into())
387387
}
388388
kind => panic!("expected projection, found {kind:?}"),

compiler/rustc_trait_selection/src/error_reporting/traits/fulfillment_errors.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1588,7 +1588,8 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
15881588
};
15891589

15901590
if let Some(lhs) = lhs.to_alias_term()
1591-
&& let ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst = lhs.kind(self.tcx)
1591+
&& let ty::AliasTermKind::ProjectionTy
1592+
| ty::AliasTermKind::ProjectionConst { .. } = lhs.kind(self.tcx)
15921593
&& let Some((better_type_err, expected_term)) =
15931594
derive_better_type_error(lhs, rhs)
15941595
{
@@ -1597,7 +1598,8 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> {
15971598
better_type_err,
15981599
)
15991600
} else if let Some(rhs) = rhs.to_alias_term()
1600-
&& let ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst = rhs.kind(self.tcx)
1601+
&& let ty::AliasTermKind::ProjectionTy
1602+
| ty::AliasTermKind::ProjectionConst { .. } = rhs.kind(self.tcx)
16011603
&& let Some((better_type_err, expected_term)) =
16021604
derive_better_type_error(rhs, lhs)
16031605
{

compiler/rustc_trait_selection/src/solve/fulfill/derive_errors.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,8 @@ impl<'tcx> BestObligation<'tcx> {
388388
self.detect_error_in_self_ty_normalization(goal, pred.self_ty())?;
389389
}
390390
Some(ty::PredicateKind::NormalizesTo(pred))
391-
if let ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst =
392-
pred.alias.kind(tcx) =>
391+
if let ty::AliasTermKind::ProjectionTy
392+
| ty::AliasTermKind::ProjectionConst { .. } = pred.alias.kind(tcx) =>
393393
{
394394
self.detect_error_in_self_ty_normalization(goal, pred.alias.self_ty())?;
395395
self.detect_non_well_formed_assoc_item(goal, pred.alias)?;
@@ -450,7 +450,7 @@ impl<'tcx> ProofTreeVisitor<'tcx> for BestObligation<'tcx> {
450450
ty::PredicateKind::NormalizesTo(normalizes_to)
451451
if matches!(
452452
normalizes_to.alias.kind(tcx),
453-
ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst
453+
ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst { .. }
454454
) =>
455455
{
456456
ChildMode::Trait(pred.kind().rebind(ty::TraitPredicate {

compiler/rustc_trait_selection/src/traits/project.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -467,10 +467,12 @@ fn normalize_to_error<'a, 'tcx>(
467467
| ty::AliasTermKind::InherentTy
468468
| ty::AliasTermKind::OpaqueTy
469469
| ty::AliasTermKind::FreeTy => selcx.infcx.next_ty_var(cause.span).into(),
470-
ty::AliasTermKind::FreeConst
471-
| ty::AliasTermKind::InherentConst
470+
ty::AliasTermKind::FreeConst { .. }
471+
| ty::AliasTermKind::InherentConst { .. }
472472
| ty::AliasTermKind::UnevaluatedConst
473-
| ty::AliasTermKind::ProjectionConst => selcx.infcx.next_const_var(cause.span).into(),
473+
| ty::AliasTermKind::ProjectionConst { .. } => {
474+
selcx.infcx.next_const_var(cause.span).into()
475+
}
474476
};
475477
let mut obligations = PredicateObligations::new();
476478
obligations.push(Obligation {

compiler/rustc_trait_selection/src/traits/query/normalize.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,13 +326,13 @@ impl<'a, 'tcx> QueryNormalizer<'a, 'tcx> {
326326
debug!("QueryNormalizer: c_term = {:#?}", c_term);
327327
debug!("QueryNormalizer: orig_values = {:#?}", orig_values);
328328
let result = match term.kind(tcx) {
329-
ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst => {
329+
ty::AliasTermKind::ProjectionTy | ty::AliasTermKind::ProjectionConst { .. } => {
330330
tcx.normalize_canonicalized_projection(c_term)
331331
}
332-
ty::AliasTermKind::FreeTy | ty::AliasTermKind::FreeConst => {
332+
ty::AliasTermKind::FreeTy | ty::AliasTermKind::FreeConst { .. } => {
333333
tcx.normalize_canonicalized_free_alias(c_term)
334334
}
335-
ty::AliasTermKind::InherentTy | ty::AliasTermKind::InherentConst => {
335+
ty::AliasTermKind::InherentTy | ty::AliasTermKind::InherentConst { .. } => {
336336
tcx.normalize_canonicalized_inherent_projection(c_term)
337337
}
338338
kind @ (ty::AliasTermKind::OpaqueTy | ty::AliasTermKind::UnevaluatedConst) => {
@@ -379,7 +379,7 @@ impl<'a, 'tcx> QueryNormalizer<'a, 'tcx> {
379379
&& (res.has_type_flags(ty::TypeFlags::HAS_CT_PROJECTION)
380380
|| matches!(
381381
term.kind(tcx),
382-
ty::AliasTermKind::FreeTy | ty::AliasTermKind::FreeConst
382+
ty::AliasTermKind::FreeTy | ty::AliasTermKind::FreeConst { .. }
383383
))
384384
{
385385
res.try_fold_with(self)

compiler/rustc_type_ir/src/predicate.rs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -518,23 +518,26 @@ pub enum AliasTermKind {
518518
/// An unevaluated anonymous constants.
519519
UnevaluatedConst,
520520
/// An unevaluated const coming from an associated const.
521-
ProjectionConst,
521+
ProjectionConst { is_type_const: bool },
522522
/// A top level const item not part of a trait or impl.
523-
FreeConst,
523+
FreeConst { is_type_const: bool },
524524
/// An associated const in an inherent `impl`
525-
InherentConst,
525+
InherentConst { is_type_const: bool },
526526
}
527527

528528
impl AliasTermKind {
529529
pub fn descr(self) -> &'static str {
530530
match self {
531531
AliasTermKind::ProjectionTy => "associated type",
532-
AliasTermKind::ProjectionConst => "associated const",
532+
AliasTermKind::ProjectionConst { is_type_const: true } => "associated const",
533+
AliasTermKind::ProjectionConst { is_type_const: false } => "associated const",
533534
AliasTermKind::InherentTy => "inherent associated type",
534-
AliasTermKind::InherentConst => "inherent associated const",
535+
AliasTermKind::InherentConst { is_type_const: true } => "inherent associated const",
536+
AliasTermKind::InherentConst { is_type_const: false } => "inherent associated const",
535537
AliasTermKind::OpaqueTy => "opaque type",
536538
AliasTermKind::FreeTy => "type alias",
537-
AliasTermKind::FreeConst => "unevaluated constant",
539+
AliasTermKind::FreeConst { is_type_const: true } => "unevaluated constant",
540+
AliasTermKind::FreeConst { is_type_const: false } => "unevaluated constant",
538541
AliasTermKind::UnevaluatedConst => "unevaluated constant",
539542
}
540543
}
@@ -547,9 +550,9 @@ impl AliasTermKind {
547550
| AliasTermKind::FreeTy => true,
548551

549552
AliasTermKind::UnevaluatedConst
550-
| AliasTermKind::ProjectionConst
551-
| AliasTermKind::InherentConst
552-
| AliasTermKind::FreeConst => false,
553+
| AliasTermKind::ProjectionConst { .. }
554+
| AliasTermKind::InherentConst { .. }
555+
| AliasTermKind::FreeConst { .. } => false,
553556
}
554557
}
555558
}
@@ -629,11 +632,11 @@ impl<I: Interner> AliasTerm<I> {
629632
AliasTermKind::InherentTy => AliasTyKind::Inherent { def_id: self.def_id },
630633
AliasTermKind::OpaqueTy => AliasTyKind::Opaque { def_id: self.def_id },
631634
AliasTermKind::FreeTy => AliasTyKind::Free { def_id: self.def_id },
632-
AliasTermKind::InherentConst
633-
| AliasTermKind::FreeConst
635+
kind @ (AliasTermKind::InherentConst { .. }
636+
| AliasTermKind::FreeConst { .. }
634637
| AliasTermKind::UnevaluatedConst
635-
| AliasTermKind::ProjectionConst => {
636-
panic!("Cannot turn `UnevaluatedConst` into `AliasTy`")
638+
| AliasTermKind::ProjectionConst { .. }) => {
639+
panic!("Cannot turn `{}` into `AliasTy`", kind.descr())
637640
}
638641
};
639642
ty::AliasTy { kind, args: self.args, _use_alias_ty_new_instead: () }
@@ -645,10 +648,10 @@ impl<I: Interner> AliasTerm<I> {
645648

646649
pub fn to_term(self, interner: I) -> I::Term {
647650
let alias_ty_kind = match self.kind(interner) {
648-
AliasTermKind::FreeConst
649-
| AliasTermKind::InherentConst
651+
AliasTermKind::FreeConst { .. }
652+
| AliasTermKind::InherentConst { .. }
650653
| AliasTermKind::UnevaluatedConst
651-
| AliasTermKind::ProjectionConst => {
654+
| AliasTermKind::ProjectionConst { .. } => {
652655
return I::Const::new_unevaluated(
653656
interner,
654657
ty::UnevaluatedConst::new(self.def_id.try_into().unwrap(), self.args),
@@ -685,7 +688,7 @@ impl<I: Interner> AliasTerm<I> {
685688
assert!(
686689
matches!(
687690
self.kind(interner),
688-
AliasTermKind::ProjectionTy | AliasTermKind::ProjectionConst
691+
AliasTermKind::ProjectionTy | AliasTermKind::ProjectionConst { .. }
689692
),
690693
"expected a projection"
691694
);
@@ -738,7 +741,7 @@ impl<I: Interner> AliasTerm<I> {
738741
) -> I::GenericArgs {
739742
debug_assert!(matches!(
740743
self.kind(interner),
741-
AliasTermKind::InherentTy | AliasTermKind::InherentConst
744+
AliasTermKind::InherentTy | AliasTermKind::InherentConst { .. }
742745
));
743746
interner.mk_args_from_iter(impl_args.iter().chain(self.args.iter().skip(1)))
744747
}

0 commit comments

Comments
 (0)