Skip to content

Commit bc1fe8a

Browse files
committed
inline CanonicalTyVarKind
1 parent 0b359e9 commit bc1fe8a

File tree

5 files changed

+40
-71
lines changed

5 files changed

+40
-71
lines changed

compiler/rustc_infer/src/infer/canonical/canonicalizer.rs

+6-17
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ use tracing::debug;
1717

1818
use crate::infer::InferCtxt;
1919
use crate::infer::canonical::{
20-
Canonical, CanonicalQueryInput, CanonicalTyVarKind, CanonicalVarInfo, CanonicalVarKind,
21-
OriginalQueryValues,
20+
Canonical, CanonicalQueryInput, CanonicalVarInfo, CanonicalVarKind, OriginalQueryValues,
2221
};
2322

2423
impl<'tcx> InferCtxt<'tcx> {
@@ -368,9 +367,7 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
368367
ui = ty::UniverseIndex::ROOT;
369368
}
370369
self.canonicalize_ty_var(
371-
CanonicalVarInfo {
372-
kind: CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui)),
373-
},
370+
CanonicalVarInfo { kind: CanonicalVarKind::Ty(ui) },
374371
t,
375372
)
376373
}
@@ -382,21 +379,15 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
382379
if nt != t {
383380
return self.fold_ty(nt);
384381
} else {
385-
self.canonicalize_ty_var(
386-
CanonicalVarInfo { kind: CanonicalVarKind::Ty(CanonicalTyVarKind::Int) },
387-
t,
388-
)
382+
self.canonicalize_ty_var(CanonicalVarInfo { kind: CanonicalVarKind::Int }, t)
389383
}
390384
}
391385
ty::Infer(ty::FloatVar(vid)) => {
392386
let nt = self.infcx.unwrap().opportunistic_resolve_float_var(vid);
393387
if nt != t {
394388
return self.fold_ty(nt);
395389
} else {
396-
self.canonicalize_ty_var(
397-
CanonicalVarInfo { kind: CanonicalVarKind::Ty(CanonicalTyVarKind::Float) },
398-
t,
399-
)
390+
self.canonicalize_ty_var(CanonicalVarInfo { kind: CanonicalVarKind::Float }, t)
400391
}
401392
}
402393

@@ -690,12 +681,10 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
690681
.iter()
691682
.map(|v| CanonicalVarInfo {
692683
kind: match v.kind {
693-
CanonicalVarKind::Ty(CanonicalTyVarKind::Int | CanonicalTyVarKind::Float) => {
684+
CanonicalVarKind::Int | CanonicalVarKind::Float => {
694685
return *v;
695686
}
696-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(u)) => {
697-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(reverse_universe_map[&u]))
698-
}
687+
CanonicalVarKind::Ty(u) => CanonicalVarKind::Ty(reverse_universe_map[&u]),
699688
CanonicalVarKind::Region(u) => {
700689
CanonicalVarKind::Region(reverse_universe_map[&u])
701690
}

compiler/rustc_infer/src/infer/canonical/mod.rs

+3-12
Original file line numberDiff line numberDiff line change
@@ -108,18 +108,9 @@ impl<'tcx> InferCtxt<'tcx> {
108108
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
109109
) -> GenericArg<'tcx> {
110110
match cv_info.kind {
111-
CanonicalVarKind::Ty(ty_kind) => {
112-
let ty = match ty_kind {
113-
CanonicalTyVarKind::General(ui) => {
114-
self.next_ty_var_in_universe(span, universe_map(ui))
115-
}
116-
117-
CanonicalTyVarKind::Int => self.next_int_var(),
118-
119-
CanonicalTyVarKind::Float => self.next_float_var(),
120-
};
121-
ty.into()
122-
}
111+
CanonicalVarKind::Ty(ui) => self.next_ty_var_in_universe(span, universe_map(ui)).into(),
112+
CanonicalVarKind::Int => self.next_int_var().into(),
113+
CanonicalVarKind::Float => self.next_float_var().into(),
123114

124115
CanonicalVarKind::PlaceholderTy(ty::PlaceholderType { universe, bound }) => {
125116
let universe_mapped = universe_map(universe);

compiler/rustc_middle/src/infer/canonical.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use rustc_data_structures::fx::FxHashMap;
2727
use rustc_data_structures::sync::Lock;
2828
use rustc_macros::{HashStable, TypeFoldable, TypeVisitable};
2929
pub use rustc_type_ir as ir;
30-
pub use rustc_type_ir::{CanonicalTyVarKind, CanonicalVarKind};
30+
pub use rustc_type_ir::CanonicalVarKind;
3131
use smallvec::SmallVec;
3232

3333
use crate::mir::ConstraintCategory;

compiler/rustc_next_trait_solver/src/canonicalizer.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use rustc_type_ir::data_structures::{HashMap, ensure_sufficient_stack};
44
use rustc_type_ir::inherent::*;
55
use rustc_type_ir::solve::{Goal, QueryInput};
66
use rustc_type_ir::{
7-
self as ty, Canonical, CanonicalTyVarKind, CanonicalVarInfo, CanonicalVarKind, InferCtxtLike,
8-
Interner, TypeFoldable, TypeFolder, TypeSuperFoldable, TypeVisitableExt,
7+
self as ty, Canonical, CanonicalVarInfo, CanonicalVarKind, InferCtxtLike, Interner,
8+
TypeFoldable, TypeFolder, TypeSuperFoldable, TypeVisitableExt,
99
};
1010

1111
use crate::delegate::SolverDelegate;
@@ -323,27 +323,27 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
323323
"ty vid should have been resolved fully before canonicalization"
324324
);
325325

326-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(
326+
CanonicalVarKind::Ty(
327327
self.delegate
328328
.universe_of_ty(vid)
329329
.unwrap_or_else(|| panic!("ty var should have been resolved: {t:?}")),
330-
))
330+
)
331331
}
332332
ty::IntVar(vid) => {
333333
assert_eq!(
334334
self.delegate.opportunistic_resolve_int_var(vid),
335335
t,
336336
"ty vid should have been resolved fully before canonicalization"
337337
);
338-
CanonicalVarKind::Ty(CanonicalTyVarKind::Int)
338+
CanonicalVarKind::Int
339339
}
340340
ty::FloatVar(vid) => {
341341
assert_eq!(
342342
self.delegate.opportunistic_resolve_float_var(vid),
343343
t,
344344
"ty vid should have been resolved fully before canonicalization"
345345
);
346-
CanonicalVarKind::Ty(CanonicalTyVarKind::Float)
346+
CanonicalVarKind::Float
347347
}
348348
ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_) => {
349349
panic!("fresh vars not expected in canonicalization")

compiler/rustc_type_ir/src/canonical.rs

+24-35
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ impl<I: Interner> CanonicalVarInfo<I> {
111111

112112
pub fn is_existential(&self) -> bool {
113113
match self.kind {
114-
CanonicalVarKind::Ty(_) => true,
114+
CanonicalVarKind::Ty(_) | CanonicalVarKind::Int | CanonicalVarKind::Float => true,
115115
CanonicalVarKind::PlaceholderTy(_) => false,
116116
CanonicalVarKind::Region(_) => true,
117117
CanonicalVarKind::PlaceholderRegion(..) => false,
@@ -124,6 +124,8 @@ impl<I: Interner> CanonicalVarInfo<I> {
124124
match self.kind {
125125
CanonicalVarKind::Region(_) | CanonicalVarKind::PlaceholderRegion(_) => true,
126126
CanonicalVarKind::Ty(_)
127+
| CanonicalVarKind::Int
128+
| CanonicalVarKind::Float
127129
| CanonicalVarKind::PlaceholderTy(_)
128130
| CanonicalVarKind::Const(_)
129131
| CanonicalVarKind::PlaceholderConst(_) => false,
@@ -132,7 +134,11 @@ impl<I: Interner> CanonicalVarInfo<I> {
132134

133135
pub fn expect_placeholder_index(self) -> usize {
134136
match self.kind {
135-
CanonicalVarKind::Ty(_) | CanonicalVarKind::Region(_) | CanonicalVarKind::Const(_) => {
137+
CanonicalVarKind::Ty(_)
138+
| CanonicalVarKind::Int
139+
| CanonicalVarKind::Float
140+
| CanonicalVarKind::Region(_)
141+
| CanonicalVarKind::Const(_) => {
136142
panic!("expected placeholder: {self:?}")
137143
}
138144

@@ -153,8 +159,14 @@ impl<I: Interner> CanonicalVarInfo<I> {
153159
derive(Decodable_NoContext, Encodable_NoContext, HashStable_NoContext)
154160
)]
155161
pub enum CanonicalVarKind<I: Interner> {
156-
/// Some kind of type inference variable.
157-
Ty(CanonicalTyVarKind),
162+
/// A general type variable `?T` that can be unified with arbitrary types.
163+
Ty(UniverseIndex),
164+
165+
/// Integral type variable `?I` (that can only be unified with integral types).
166+
Int,
167+
168+
/// Floating-point type variable `?F` (that can only be unified with float types).
169+
Float,
158170

159171
/// A "placeholder" that represents "any type".
160172
PlaceholderTy(I::PlaceholderTy),
@@ -177,15 +189,13 @@ pub enum CanonicalVarKind<I: Interner> {
177189
impl<I: Interner> CanonicalVarKind<I> {
178190
pub fn universe(self) -> UniverseIndex {
179191
match self {
180-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui)) => ui,
192+
CanonicalVarKind::Ty(ui) => ui,
181193
CanonicalVarKind::Region(ui) => ui,
182194
CanonicalVarKind::Const(ui) => ui,
183195
CanonicalVarKind::PlaceholderTy(placeholder) => placeholder.universe(),
184196
CanonicalVarKind::PlaceholderRegion(placeholder) => placeholder.universe(),
185197
CanonicalVarKind::PlaceholderConst(placeholder) => placeholder.universe(),
186-
CanonicalVarKind::Ty(CanonicalTyVarKind::Float | CanonicalTyVarKind::Int) => {
187-
UniverseIndex::ROOT
188-
}
198+
CanonicalVarKind::Int | CanonicalVarKind::Float => UniverseIndex::ROOT,
189199
}
190200
}
191201

@@ -195,9 +205,7 @@ impl<I: Interner> CanonicalVarKind<I> {
195205
/// the updated universe is not the root.
196206
pub fn with_updated_universe(self, ui: UniverseIndex) -> CanonicalVarKind<I> {
197207
match self {
198-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(_)) => {
199-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui))
200-
}
208+
CanonicalVarKind::Ty(_) => CanonicalVarKind::Ty(ui),
201209
CanonicalVarKind::Region(_) => CanonicalVarKind::Region(ui),
202210
CanonicalVarKind::Const(_) => CanonicalVarKind::Const(ui),
203211

@@ -210,36 +218,14 @@ impl<I: Interner> CanonicalVarKind<I> {
210218
CanonicalVarKind::PlaceholderConst(placeholder) => {
211219
CanonicalVarKind::PlaceholderConst(placeholder.with_updated_universe(ui))
212220
}
213-
CanonicalVarKind::Ty(CanonicalTyVarKind::Int | CanonicalTyVarKind::Float) => {
221+
CanonicalVarKind::Int | CanonicalVarKind::Float => {
214222
assert_eq!(ui, UniverseIndex::ROOT);
215223
self
216224
}
217225
}
218226
}
219227
}
220228

221-
/// Rust actually has more than one category of type variables;
222-
/// notably, the type variables we create for literals (e.g., 22 or
223-
/// 22.) can only be instantiated with integral/float types (e.g.,
224-
/// usize or f32). In order to faithfully reproduce a type, we need to
225-
/// know what set of types a given type variable can be unified with.
226-
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
227-
#[derive(TypeVisitable_Generic, TypeFoldable_Generic)]
228-
#[cfg_attr(
229-
feature = "nightly",
230-
derive(Decodable_NoContext, Encodable_NoContext, HashStable_NoContext)
231-
)]
232-
pub enum CanonicalTyVarKind {
233-
/// General type variable `?T` that can be unified with arbitrary types.
234-
General(UniverseIndex),
235-
236-
/// Integral type variable `?I` (that can only be unified with integral types).
237-
Int,
238-
239-
/// Floating-point type variable `?F` (that can only be unified with float types).
240-
Float,
241-
}
242-
243229
/// A set of values corresponding to the canonical variables from some
244230
/// `Canonical`. You can give these values to
245231
/// `canonical_value.instantiate` to instantiate them into the canonical
@@ -313,7 +299,10 @@ impl<I: Interner> CanonicalVarValues<I> {
313299
var_values: cx.mk_args_from_iter(infos.iter().enumerate().map(
314300
|(i, info)| -> I::GenericArg {
315301
match info.kind {
316-
CanonicalVarKind::Ty(_) | CanonicalVarKind::PlaceholderTy(_) => {
302+
CanonicalVarKind::Ty(_)
303+
| CanonicalVarKind::Int
304+
| CanonicalVarKind::Float
305+
| CanonicalVarKind::PlaceholderTy(_) => {
317306
Ty::new_anon_bound(cx, ty::INNERMOST, ty::BoundVar::from_usize(i))
318307
.into()
319308
}

0 commit comments

Comments
 (0)