Skip to content

Commit 1fff995

Browse files
lcnrcompiler-errors
authored andcommitted
inline CanonicalTyVarKind
1 parent 47842dd commit 1fff995

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
@@ -110,7 +110,7 @@ impl<I: Interner> CanonicalVarInfo<I> {
110110

111111
pub fn is_existential(&self) -> bool {
112112
match self.kind {
113-
CanonicalVarKind::Ty(_) => true,
113+
CanonicalVarKind::Ty(_) | CanonicalVarKind::Int | CanonicalVarKind::Float => true,
114114
CanonicalVarKind::PlaceholderTy(_) => false,
115115
CanonicalVarKind::Region(_) => true,
116116
CanonicalVarKind::PlaceholderRegion(..) => false,
@@ -123,6 +123,8 @@ impl<I: Interner> CanonicalVarInfo<I> {
123123
match self.kind {
124124
CanonicalVarKind::Region(_) | CanonicalVarKind::PlaceholderRegion(_) => true,
125125
CanonicalVarKind::Ty(_)
126+
| CanonicalVarKind::Int
127+
| CanonicalVarKind::Float
126128
| CanonicalVarKind::PlaceholderTy(_)
127129
| CanonicalVarKind::Const(_)
128130
| CanonicalVarKind::PlaceholderConst(_) => false,
@@ -131,7 +133,11 @@ impl<I: Interner> CanonicalVarInfo<I> {
131133

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

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

157169
/// A "placeholder" that represents "any type".
158170
PlaceholderTy(I::PlaceholderTy),
@@ -175,15 +187,13 @@ pub enum CanonicalVarKind<I: Interner> {
175187
impl<I: Interner> CanonicalVarKind<I> {
176188
pub fn universe(self) -> UniverseIndex {
177189
match self {
178-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui)) => ui,
190+
CanonicalVarKind::Ty(ui) => ui,
179191
CanonicalVarKind::Region(ui) => ui,
180192
CanonicalVarKind::Const(ui) => ui,
181193
CanonicalVarKind::PlaceholderTy(placeholder) => placeholder.universe(),
182194
CanonicalVarKind::PlaceholderRegion(placeholder) => placeholder.universe(),
183195
CanonicalVarKind::PlaceholderConst(placeholder) => placeholder.universe(),
184-
CanonicalVarKind::Ty(CanonicalTyVarKind::Float | CanonicalTyVarKind::Int) => {
185-
UniverseIndex::ROOT
186-
}
196+
CanonicalVarKind::Int | CanonicalVarKind::Float => UniverseIndex::ROOT,
187197
}
188198
}
189199

@@ -193,9 +203,7 @@ impl<I: Interner> CanonicalVarKind<I> {
193203
/// the updated universe is not the root.
194204
pub fn with_updated_universe(self, ui: UniverseIndex) -> CanonicalVarKind<I> {
195205
match self {
196-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(_)) => {
197-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui))
198-
}
206+
CanonicalVarKind::Ty(_) => CanonicalVarKind::Ty(ui),
199207
CanonicalVarKind::Region(_) => CanonicalVarKind::Region(ui),
200208
CanonicalVarKind::Const(_) => CanonicalVarKind::Const(ui),
201209

@@ -208,36 +216,14 @@ impl<I: Interner> CanonicalVarKind<I> {
208216
CanonicalVarKind::PlaceholderConst(placeholder) => {
209217
CanonicalVarKind::PlaceholderConst(placeholder.with_updated_universe(ui))
210218
}
211-
CanonicalVarKind::Ty(CanonicalTyVarKind::Int | CanonicalTyVarKind::Float) => {
219+
CanonicalVarKind::Int | CanonicalVarKind::Float => {
212220
assert_eq!(ui, UniverseIndex::ROOT);
213221
self
214222
}
215223
}
216224
}
217225
}
218226

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

0 commit comments

Comments
 (0)