Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 03e4228

Browse files
committed
inline CanonicalTyVarKind
1 parent 077f081 commit 03e4228

File tree

6 files changed

+58
-83
lines changed

6 files changed

+58
-83
lines changed

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

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use tracing::debug;
1717

1818
use crate::infer::InferCtxt;
1919
use crate::infer::canonical::{
20-
Canonical, CanonicalQueryInput, CanonicalTyVarKind,CanonicalVarKind, OriginalQueryValues,
20+
Canonical, CanonicalQueryInput, CanonicalVarKind, OriginalQueryValues,
2121
};
2222

2323
impl<'tcx> InferCtxt<'tcx> {
@@ -361,10 +361,7 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
361361
// FIXME: perf problem described in #55921.
362362
ui = ty::UniverseIndex::ROOT;
363363
}
364-
self.canonicalize_ty_var(
365-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui)),
366-
t,
367-
)
364+
self.canonicalize_ty_var(CanonicalVarKind::Ty(ui), t)
368365
}
369366
}
370367
}
@@ -374,15 +371,15 @@ impl<'cx, 'tcx> TypeFolder<TyCtxt<'tcx>> for Canonicalizer<'cx, 'tcx> {
374371
if nt != t {
375372
return self.fold_ty(nt);
376373
} else {
377-
self.canonicalize_ty_var(CanonicalVarKind::Ty(CanonicalTyVarKind::Int), t)
374+
self.canonicalize_ty_var(CanonicalVarKind::Int, t)
378375
}
379376
}
380377
ty::Infer(ty::FloatVar(vid)) => {
381378
let nt = self.infcx.unwrap().opportunistic_resolve_float_var(vid);
382379
if nt != t {
383380
return self.fold_ty(nt);
384381
} else {
385-
self.canonicalize_ty_var(CanonicalVarKind::Ty(CanonicalTyVarKind::Float), t)
382+
self.canonicalize_ty_var(CanonicalVarKind::Float, t)
386383
}
387384
}
388385

@@ -679,12 +676,10 @@ impl<'cx, 'tcx> Canonicalizer<'cx, 'tcx> {
679676
self.variables
680677
.iter()
681678
.map(|&kind| match kind {
682-
CanonicalVarKind::Ty(CanonicalTyVarKind::Int | CanonicalTyVarKind::Float) => {
679+
CanonicalVarKind::Int | CanonicalVarKind::Float => {
683680
return kind;
684681
}
685-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(u)) => {
686-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(reverse_universe_map[&u]))
687-
}
682+
CanonicalVarKind::Ty(u) => CanonicalVarKind::Ty(reverse_universe_map[&u]),
688683
CanonicalVarKind::Region(u) => CanonicalVarKind::Region(reverse_universe_map[&u]),
689684
CanonicalVarKind::Const(u) => CanonicalVarKind::Const(reverse_universe_map[&u]),
690685
CanonicalVarKind::PlaceholderTy(placeholder) => {

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

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,18 +108,11 @@ impl<'tcx> InferCtxt<'tcx> {
108108
universe_map: impl Fn(ty::UniverseIndex) -> ty::UniverseIndex,
109109
) -> GenericArg<'tcx> {
110110
match 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-
}
111+
CanonicalVarKind::Ty(ui) => self.next_ty_var_in_universe(span, universe_map(ui)).into(),
116112

117-
CanonicalTyVarKind::Int => self.next_int_var(),
113+
CanonicalVarKind::Int => self.next_int_var().into(),
118114

119-
CanonicalTyVarKind::Float => self.next_float_var(),
120-
};
121-
ty.into()
122-
}
115+
CanonicalVarKind::Float => self.next_float_var().into(),
123116

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

‎compiler/rustc_middle/src/infer/canonical.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ 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;
3130
use smallvec::SmallVec;
3231

3332
use crate::mir::ConstraintCategory;

‎compiler/rustc_next_trait_solver/src/canonicalizer.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ use rustc_type_ir::data_structures::{HashMap, ensure_sufficient_stack};
22
use rustc_type_ir::inherent::*;
33
use rustc_type_ir::solve::{Goal, QueryInput};
44
use rustc_type_ir::{
5-
self as ty, Canonical, CanonicalParamEnvCacheEntry, CanonicalTyVarKind, CanonicalVarKind,
6-
Flags, InferCtxtLike, Interner, TypeFlags, TypeFoldable, TypeFolder, TypeSuperFoldable,
7-
TypeVisitableExt,
5+
self as ty, Canonical, CanonicalParamEnvCacheEntry, CanonicalVarKind, Flags, InferCtxtLike,
6+
Interner, TypeFlags, TypeFoldable, TypeFolder, TypeSuperFoldable, TypeVisitableExt,
87
};
98

109
use crate::delegate::SolverDelegate;
@@ -314,14 +313,12 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
314313
);
315314

316315
match self.canonicalize_mode {
317-
CanonicalizeMode::Input { .. } => CanonicalVarKind::Ty(
318-
CanonicalTyVarKind::General(ty::UniverseIndex::ROOT),
319-
),
316+
CanonicalizeMode::Input { .. } => {
317+
CanonicalVarKind::Ty(ty::UniverseIndex::ROOT)
318+
}
320319
CanonicalizeMode::Response { .. } => {
321-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(
322-
self.delegate.universe_of_ty(vid).unwrap_or_else(|| {
323-
panic!("ty var should have been resolved: {t:?}")
324-
}),
320+
CanonicalVarKind::Ty(self.delegate.universe_of_ty(vid).unwrap_or_else(
321+
|| panic!("ty var should have been resolved: {t:?}"),
325322
))
326323
}
327324
}
@@ -332,15 +329,15 @@ impl<'a, D: SolverDelegate<Interner = I>, I: Interner> Canonicalizer<'a, D, I> {
332329
t,
333330
"ty vid should have been resolved fully before canonicalization"
334331
);
335-
CanonicalVarKind::Ty(CanonicalTyVarKind::Int)
332+
CanonicalVarKind::Int
336333
}
337334
ty::FloatVar(vid) => {
338335
debug_assert_eq!(
339336
self.delegate.opportunistic_resolve_float_var(vid),
340337
t,
341338
"ty vid should have been resolved fully before canonicalization"
342339
);
343-
CanonicalVarKind::Ty(CanonicalTyVarKind::Float)
340+
CanonicalVarKind::Float
344341
}
345342
ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_) => {
346343
panic!("fresh vars not expected in canonicalization")

‎compiler/rustc_type_ir/src/canonical.rs

Lines changed: 31 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use std::fmt;
2-
use std::hash::Hash;
32
use std::ops::Index;
43

54
use derive_where::derive_where;
@@ -91,8 +90,14 @@ impl<I: Interner, V: fmt::Display> fmt::Display for Canonical<I, V> {
9190
derive(Decodable_NoContext, Encodable_NoContext, HashStable_NoContext)
9291
)]
9392
pub enum CanonicalVarKind<I: Interner> {
94-
/// Some kind of type inference variable.
95-
Ty(CanonicalTyVarKind),
93+
/// General type variable `?T` that can be unified with arbitrary types.
94+
Ty(UniverseIndex),
95+
96+
/// Integral type variable `?I` (that can only be unified with integral types).
97+
Int,
98+
99+
/// Floating-point type variable `?F` (that can only be unified with float types).
100+
Float,
96101

97102
/// A "placeholder" that represents "any type".
98103
PlaceholderTy(I::PlaceholderTy),
@@ -117,15 +122,13 @@ impl<I: Interner> Eq for CanonicalVarKind<I> {}
117122
impl<I: Interner> CanonicalVarKind<I> {
118123
pub fn universe(self) -> UniverseIndex {
119124
match self {
120-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui)) => ui,
125+
CanonicalVarKind::Ty(ui) => ui,
121126
CanonicalVarKind::Region(ui) => ui,
122127
CanonicalVarKind::Const(ui) => ui,
123128
CanonicalVarKind::PlaceholderTy(placeholder) => placeholder.universe(),
124129
CanonicalVarKind::PlaceholderRegion(placeholder) => placeholder.universe(),
125130
CanonicalVarKind::PlaceholderConst(placeholder) => placeholder.universe(),
126-
CanonicalVarKind::Ty(CanonicalTyVarKind::Float | CanonicalTyVarKind::Int) => {
127-
UniverseIndex::ROOT
128-
}
131+
CanonicalVarKind::Float | CanonicalVarKind::Int => UniverseIndex::ROOT,
129132
}
130133
}
131134

@@ -135,9 +138,7 @@ impl<I: Interner> CanonicalVarKind<I> {
135138
/// the updated universe is not the root.
136139
pub fn with_updated_universe(self, ui: UniverseIndex) -> CanonicalVarKind<I> {
137140
match self {
138-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(_)) => {
139-
CanonicalVarKind::Ty(CanonicalTyVarKind::General(ui))
140-
}
141+
CanonicalVarKind::Ty(_) => CanonicalVarKind::Ty(ui),
141142
CanonicalVarKind::Region(_) => CanonicalVarKind::Region(ui),
142143
CanonicalVarKind::Const(_) => CanonicalVarKind::Const(ui),
143144

@@ -150,7 +151,7 @@ impl<I: Interner> CanonicalVarKind<I> {
150151
CanonicalVarKind::PlaceholderConst(placeholder) => {
151152
CanonicalVarKind::PlaceholderConst(placeholder.with_updated_universe(ui))
152153
}
153-
CanonicalVarKind::Ty(CanonicalTyVarKind::Int | CanonicalTyVarKind::Float) => {
154+
CanonicalVarKind::Int | CanonicalVarKind::Float => {
154155
assert_eq!(ui, UniverseIndex::ROOT);
155156
self
156157
}
@@ -159,19 +160,23 @@ impl<I: Interner> CanonicalVarKind<I> {
159160

160161
pub fn is_existential(self) -> bool {
161162
match self {
162-
CanonicalVarKind::Ty(_) => true,
163-
CanonicalVarKind::PlaceholderTy(_) => false,
164-
CanonicalVarKind::Region(_) => true,
165-
CanonicalVarKind::PlaceholderRegion(..) => false,
166-
CanonicalVarKind::Const(_) => true,
167-
CanonicalVarKind::PlaceholderConst(_) => false,
163+
CanonicalVarKind::Ty(_)
164+
| CanonicalVarKind::Int
165+
| CanonicalVarKind::Float
166+
| CanonicalVarKind::Region(_)
167+
| CanonicalVarKind::Const(_) => true,
168+
CanonicalVarKind::PlaceholderTy(_)
169+
| CanonicalVarKind::PlaceholderRegion(..)
170+
| CanonicalVarKind::PlaceholderConst(_) => false,
168171
}
169172
}
170173

171174
pub fn is_region(self) -> bool {
172175
match self {
173176
CanonicalVarKind::Region(_) | CanonicalVarKind::PlaceholderRegion(_) => true,
174177
CanonicalVarKind::Ty(_)
178+
| CanonicalVarKind::Int
179+
| CanonicalVarKind::Float
175180
| CanonicalVarKind::PlaceholderTy(_)
176181
| CanonicalVarKind::Const(_)
177182
| CanonicalVarKind::PlaceholderConst(_) => false,
@@ -180,7 +185,11 @@ impl<I: Interner> CanonicalVarKind<I> {
180185

181186
pub fn expect_placeholder_index(self) -> usize {
182187
match self {
183-
CanonicalVarKind::Ty(_) | CanonicalVarKind::Region(_) | CanonicalVarKind::Const(_) => {
188+
CanonicalVarKind::Ty(_)
189+
| CanonicalVarKind::Int
190+
| CanonicalVarKind::Float
191+
| CanonicalVarKind::Region(_)
192+
| CanonicalVarKind::Const(_) => {
184193
panic!("expected placeholder: {self:?}")
185194
}
186195

@@ -191,27 +200,6 @@ impl<I: Interner> CanonicalVarKind<I> {
191200
}
192201
}
193202

194-
/// Rust actually has more than one category of type variables;
195-
/// notably, the type variables we create for literals (e.g., 22 or
196-
/// 22.) can only be instantiated with integral/float types (e.g.,
197-
/// usize or f32). In order to faithfully reproduce a type, we need to
198-
/// know what set of types a given type variable can be unified with.
199-
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
200-
#[cfg_attr(
201-
feature = "nightly",
202-
derive(Decodable_NoContext, Encodable_NoContext, HashStable_NoContext)
203-
)]
204-
pub enum CanonicalTyVarKind {
205-
/// General type variable `?T` that can be unified with arbitrary types.
206-
General(UniverseIndex),
207-
208-
/// Integral type variable `?I` (that can only be unified with integral types).
209-
Int,
210-
211-
/// Floating-point type variable `?F` (that can only be unified with float types).
212-
Float,
213-
}
214-
215203
/// A set of values corresponding to the canonical variables from some
216204
/// `Canonical`. You can give these values to
217205
/// `canonical_value.instantiate` to instantiate them into the canonical
@@ -287,7 +275,10 @@ impl<I: Interner> CanonicalVarValues<I> {
287275
var_values: cx.mk_args_from_iter(infos.iter().enumerate().map(
288276
|(i, kind)| -> I::GenericArg {
289277
match kind {
290-
CanonicalVarKind::Ty(_) | CanonicalVarKind::PlaceholderTy(_) => {
278+
CanonicalVarKind::Ty(_)
279+
| CanonicalVarKind::Int
280+
| CanonicalVarKind::Float
281+
| CanonicalVarKind::PlaceholderTy(_) => {
291282
Ty::new_anon_bound(cx, ty::INNERMOST, ty::BoundVar::from_usize(i))
292283
.into()
293284
}

‎tests/mir-opt/address_of.address_of_reborrow.SimplifyCfg-initial.after.mir

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
// MIR for `address_of_reborrow` after SimplifyCfg-initial
22

33
| User Type Annotations
4-
| 0: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:8:10: 8:18, inferred_ty: *const [i32; 10]
4+
| 0: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:8:10: 8:18, inferred_ty: *const [i32; 10]
55
| 1: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:10:10: 10:25, inferred_ty: *const dyn std::marker::Send
6-
| 2: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
7-
| 3: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
6+
| 2: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
7+
| 3: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:14:12: 14:20, inferred_ty: *const [i32; 10]
88
| 4: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:15:12: 15:28, inferred_ty: *const [i32; 10]
99
| 5: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:15:12: 15:28, inferred_ty: *const [i32; 10]
1010
| 6: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:16:12: 16:27, inferred_ty: *const dyn std::marker::Send
1111
| 7: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:16:12: 16:27, inferred_ty: *const dyn std::marker::Send
1212
| 8: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:17:12: 17:24, inferred_ty: *const [i32]
1313
| 9: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:17:12: 17:24, inferred_ty: *const [i32]
14-
| 10: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:19:10: 19:18, inferred_ty: *const [i32; 10]
14+
| 10: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:19:10: 19:18, inferred_ty: *const [i32; 10]
1515
| 11: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:21:10: 21:25, inferred_ty: *const dyn std::marker::Send
16-
| 12: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
17-
| 13: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
16+
| 12: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
17+
| 13: user_ty: Canonical { value: Ty(*const ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:24:12: 24:20, inferred_ty: *const [i32; 10]
1818
| 14: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:25:12: 25:28, inferred_ty: *const [i32; 10]
1919
| 15: user_ty: Canonical { value: Ty(*const [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:25:12: 25:28, inferred_ty: *const [i32; 10]
2020
| 16: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:26:12: 26:27, inferred_ty: *const dyn std::marker::Send
2121
| 17: user_ty: Canonical { value: Ty(*const dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:26:12: 26:27, inferred_ty: *const dyn std::marker::Send
2222
| 18: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:27:12: 27:24, inferred_ty: *const [i32]
2323
| 19: user_ty: Canonical { value: Ty(*const [i32]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:27:12: 27:24, inferred_ty: *const [i32]
24-
| 20: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:29:10: 29:16, inferred_ty: *mut [i32; 10]
24+
| 20: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:29:10: 29:16, inferred_ty: *mut [i32; 10]
2525
| 21: user_ty: Canonical { value: Ty(*mut dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:31:10: 31:23, inferred_ty: *mut dyn std::marker::Send
26-
| 22: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
27-
| 23: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(General(U0))] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
26+
| 22: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
27+
| 23: user_ty: Canonical { value: Ty(*mut ^0), max_universe: U0, variables: [Ty(U0)] }, span: $DIR/address_of.rs:34:12: 34:18, inferred_ty: *mut [i32; 10]
2828
| 24: user_ty: Canonical { value: Ty(*mut [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:35:12: 35:26, inferred_ty: *mut [i32; 10]
2929
| 25: user_ty: Canonical { value: Ty(*mut [i32; 10]), max_universe: U0, variables: [] }, span: $DIR/address_of.rs:35:12: 35:26, inferred_ty: *mut [i32; 10]
3030
| 26: user_ty: Canonical { value: Ty(*mut dyn std::marker::Send), max_universe: U0, variables: [Region(U0)] }, span: $DIR/address_of.rs:36:12: 36:25, inferred_ty: *mut dyn std::marker::Send

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /