Skip to content

Commit aa6761c

Browse files
committed
Use specialisation in explicit traversable impls
1 parent 553e737 commit aa6761c

File tree

4 files changed

+129
-71
lines changed

4 files changed

+129
-71
lines changed

compiler/rustc_middle/src/ty/mod.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1582,16 +1582,19 @@ impl<'tcx> TypeFoldable<TyCtxt<'tcx>> for ParamEnv<'tcx> {
15821582
folder: &mut F,
15831583
) -> Result<Self, F::Error> {
15841584
Ok(ParamEnv::new(
1585-
self.caller_bounds().try_fold_with(folder)?,
1586-
self.reveal().try_fold_with(folder)?,
1585+
rustc_type_ir::noop_traversal_if_boring!(
1586+
{ self.caller_bounds() }.try_fold_with(folder)
1587+
)?,
1588+
rustc_type_ir::noop_traversal_if_boring!({ self.reveal() }.try_fold_with(folder))?,
15871589
))
15881590
}
15891591
}
15901592

15911593
impl<'tcx> TypeVisitable<TyCtxt<'tcx>> for ParamEnv<'tcx> {
15921594
fn visit_with<V: TypeVisitor<TyCtxt<'tcx>>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
1593-
self.caller_bounds().visit_with(visitor)?;
1594-
self.reveal().visit_with(visitor)
1595+
rustc_type_ir::noop_traversal_if_boring!({ &self.caller_bounds() }.visit_with(visitor))?;
1596+
rustc_type_ir::noop_traversal_if_boring!({ &self.reveal() }.visit_with(visitor))?;
1597+
ControlFlow::Continue(())
15951598
}
15961599
}
15971600

compiler/rustc_middle/src/ty/structural_impls.rs

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ use crate::mir::interpret;
77
use crate::ty::fold::{FallibleTypeFolder, TypeFoldable, TypeSuperFoldable};
88
use crate::ty::print::{with_no_trimmed_paths, FmtPrinter, Printer};
99
use crate::ty::visit::{TypeSuperVisitable, TypeVisitable, TypeVisitor};
10-
use crate::ty::{self, AliasTy, InferConst, Lift, Term, TermKind, Ty, TyCtxt};
10+
use crate::ty::{
11+
self, noop_traversal_if_boring, AliasTy, InferConst, Lift, Term, TermKind, Ty, TyCtxt,
12+
};
1113
use rustc_hir::def::Namespace;
1214
use rustc_target::abi::TyAndLayout;
1315
use rustc_type_ir::{ConstKind, DebugWithInfcx, InferCtxtLike, WithInfcx};
@@ -770,16 +772,31 @@ impl<'tcx> TypeSuperFoldable<TyCtxt<'tcx>> for ty::Const<'tcx> {
770772
) -> Result<Self, F::Error> {
771773
let ty = self.ty().try_fold_with(folder)?;
772774
let kind = match self.kind() {
773-
ConstKind::Param(p) => ConstKind::Param(p.try_fold_with(folder)?),
774-
ConstKind::Infer(i) => ConstKind::Infer(i.try_fold_with(folder)?),
775-
ConstKind::Bound(d, b) => {
776-
ConstKind::Bound(d.try_fold_with(folder)?, b.try_fold_with(folder)?)
775+
ConstKind::Param(p) => {
776+
ConstKind::Param(noop_traversal_if_boring!(p.try_fold_with(folder))?)
777+
}
778+
ConstKind::Infer(i) => {
779+
ConstKind::Infer(noop_traversal_if_boring!(i.try_fold_with(folder))?)
780+
}
781+
ConstKind::Bound(d, b) => ConstKind::Bound(
782+
noop_traversal_if_boring!(d.try_fold_with(folder))?,
783+
noop_traversal_if_boring!(b.try_fold_with(folder))?,
784+
),
785+
ConstKind::Placeholder(p) => {
786+
ConstKind::Placeholder(noop_traversal_if_boring!(p.try_fold_with(folder))?)
787+
}
788+
ConstKind::Unevaluated(uv) => {
789+
ConstKind::Unevaluated(noop_traversal_if_boring!(uv.try_fold_with(folder))?)
790+
}
791+
ConstKind::Value(v) => {
792+
ConstKind::Value(noop_traversal_if_boring!(v.try_fold_with(folder))?)
793+
}
794+
ConstKind::Error(e) => {
795+
ConstKind::Error(noop_traversal_if_boring!(e.try_fold_with(folder))?)
796+
}
797+
ConstKind::Expr(e) => {
798+
ConstKind::Expr(noop_traversal_if_boring!(e.try_fold_with(folder))?)
777799
}
778-
ConstKind::Placeholder(p) => ConstKind::Placeholder(p.try_fold_with(folder)?),
779-
ConstKind::Unevaluated(uv) => ConstKind::Unevaluated(uv.try_fold_with(folder)?),
780-
ConstKind::Value(v) => ConstKind::Value(v.try_fold_with(folder)?),
781-
ConstKind::Error(e) => ConstKind::Error(e.try_fold_with(folder)?),
782-
ConstKind::Expr(e) => ConstKind::Expr(e.try_fold_with(folder)?),
783800
};
784801
if ty != self.ty() || kind != self.kind() {
785802
Ok(folder.interner().mk_ct_from_kind(kind, ty))
@@ -795,18 +812,22 @@ impl<'tcx> TypeSuperVisitable<TyCtxt<'tcx>> for ty::Const<'tcx> {
795812
visitor: &mut V,
796813
) -> ControlFlow<V::BreakTy> {
797814
self.ty().visit_with(visitor)?;
798-
match self.kind() {
799-
ConstKind::Param(p) => p.visit_with(visitor),
800-
ConstKind::Infer(i) => i.visit_with(visitor),
815+
match &self.kind() {
816+
ConstKind::Param(p) => noop_traversal_if_boring!(p.visit_with(visitor)),
817+
ConstKind::Infer(i) => noop_traversal_if_boring!(i.visit_with(visitor)),
801818
ConstKind::Bound(d, b) => {
802-
d.visit_with(visitor)?;
803-
b.visit_with(visitor)
819+
noop_traversal_if_boring!(d.visit_with(visitor))?;
820+
noop_traversal_if_boring!(b.visit_with(visitor))
821+
}
822+
ConstKind::Placeholder(p) => {
823+
noop_traversal_if_boring!(p.visit_with(visitor))
824+
}
825+
ConstKind::Unevaluated(uv) => {
826+
noop_traversal_if_boring!(uv.visit_with(visitor))
804827
}
805-
ConstKind::Placeholder(p) => p.visit_with(visitor),
806-
ConstKind::Unevaluated(uv) => uv.visit_with(visitor),
807-
ConstKind::Value(v) => v.visit_with(visitor),
808-
ConstKind::Error(e) => e.visit_with(visitor),
809-
ConstKind::Expr(e) => e.visit_with(visitor),
828+
ConstKind::Value(v) => noop_traversal_if_boring!(v.visit_with(visitor)),
829+
ConstKind::Error(e) => noop_traversal_if_boring!(e.visit_with(visitor)),
830+
ConstKind::Expr(e) => noop_traversal_if_boring!(e.visit_with(visitor)),
810831
}
811832
}
812833
}

compiler/rustc_type_ir/src/canonical.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,9 @@ where
110110
{
111111
fn try_fold_with<F: FallibleTypeFolder<I>>(self, folder: &mut F) -> Result<Self, F::Error> {
112112
Ok(Canonical {
113-
value: self.value.try_fold_with(folder)?,
114-
max_universe: self.max_universe.try_fold_with(folder)?,
115-
variables: self.variables.try_fold_with(folder)?,
113+
value: noop_traversal_if_boring!({ self.value }.try_fold_with(folder))?,
114+
max_universe: noop_traversal_if_boring!({ self.max_universe }.try_fold_with(folder))?,
115+
variables: noop_traversal_if_boring!({ self.variables }.try_fold_with(folder))?,
116116
})
117117
}
118118
}
@@ -121,10 +121,10 @@ impl<I: Interner, V: TypeVisitable<I>> TypeVisitable<I> for Canonical<I, V>
121121
where
122122
I::CanonicalVars: TypeVisitable<I>,
123123
{
124-
fn visit_with<F: TypeVisitor<I>>(&self, folder: &mut F) -> ControlFlow<F::BreakTy> {
125-
self.value.visit_with(folder)?;
126-
self.max_universe.visit_with(folder)?;
127-
self.variables.visit_with(folder)
124+
fn visit_with<F: TypeVisitor<I>>(&self, visitor: &mut F) -> ControlFlow<F::BreakTy> {
125+
noop_traversal_if_boring!({ &self.value }.visit_with(visitor))?;
126+
noop_traversal_if_boring!({ &self.max_universe }.visit_with(visitor))?;
127+
noop_traversal_if_boring!({ &self.variables }.visit_with(visitor))
128128
}
129129
}
130130

compiler/rustc_type_ir/src/predicate_kind.rs

Lines changed: 74 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -120,16 +120,27 @@ where
120120
{
121121
fn try_fold_with<F: FallibleTypeFolder<I>>(self, folder: &mut F) -> Result<Self, F::Error> {
122122
Ok(match self {
123-
ClauseKind::Trait(p) => ClauseKind::Trait(p.try_fold_with(folder)?),
124-
ClauseKind::RegionOutlives(p) => ClauseKind::RegionOutlives(p.try_fold_with(folder)?),
125-
ClauseKind::TypeOutlives(p) => ClauseKind::TypeOutlives(p.try_fold_with(folder)?),
126-
ClauseKind::Projection(p) => ClauseKind::Projection(p.try_fold_with(folder)?),
127-
ClauseKind::ConstArgHasType(c, t) => {
128-
ClauseKind::ConstArgHasType(c.try_fold_with(folder)?, t.try_fold_with(folder)?)
123+
ClauseKind::Trait(p) => {
124+
ClauseKind::Trait(noop_traversal_if_boring!(p.try_fold_with(folder))?)
125+
}
126+
ClauseKind::RegionOutlives(p) => {
127+
ClauseKind::RegionOutlives(noop_traversal_if_boring!(p.try_fold_with(folder))?)
128+
}
129+
ClauseKind::TypeOutlives(p) => {
130+
ClauseKind::TypeOutlives(noop_traversal_if_boring!(p.try_fold_with(folder))?)
131+
}
132+
ClauseKind::Projection(p) => {
133+
ClauseKind::Projection(noop_traversal_if_boring!(p.try_fold_with(folder))?)
134+
}
135+
ClauseKind::ConstArgHasType(c, t) => ClauseKind::ConstArgHasType(
136+
noop_traversal_if_boring!(c.try_fold_with(folder))?,
137+
noop_traversal_if_boring!(t.try_fold_with(folder))?,
138+
),
139+
ClauseKind::WellFormed(p) => {
140+
ClauseKind::WellFormed(noop_traversal_if_boring!(p.try_fold_with(folder))?)
129141
}
130-
ClauseKind::WellFormed(p) => ClauseKind::WellFormed(p.try_fold_with(folder)?),
131142
ClauseKind::ConstEvaluatable(p) => {
132-
ClauseKind::ConstEvaluatable(p.try_fold_with(folder)?)
143+
ClauseKind::ConstEvaluatable(noop_traversal_if_boring!(p.try_fold_with(folder))?)
133144
}
134145
})
135146
}
@@ -147,16 +158,26 @@ where
147158
{
148159
fn visit_with<V: TypeVisitor<I>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
149160
match self {
150-
ClauseKind::Trait(p) => p.visit_with(visitor),
151-
ClauseKind::RegionOutlives(p) => p.visit_with(visitor),
152-
ClauseKind::TypeOutlives(p) => p.visit_with(visitor),
153-
ClauseKind::Projection(p) => p.visit_with(visitor),
161+
ClauseKind::Trait(p) => noop_traversal_if_boring!(p.visit_with(visitor)),
162+
ClauseKind::RegionOutlives(p) => {
163+
noop_traversal_if_boring!(p.visit_with(visitor))
164+
}
165+
ClauseKind::TypeOutlives(p) => {
166+
noop_traversal_if_boring!(p.visit_with(visitor))
167+
}
168+
ClauseKind::Projection(p) => {
169+
noop_traversal_if_boring!(p.visit_with(visitor))
170+
}
154171
ClauseKind::ConstArgHasType(c, t) => {
155-
c.visit_with(visitor)?;
156-
t.visit_with(visitor)
172+
noop_traversal_if_boring!(c.visit_with(visitor))?;
173+
noop_traversal_if_boring!(t.visit_with(visitor))
174+
}
175+
ClauseKind::WellFormed(p) => {
176+
noop_traversal_if_boring!(p.visit_with(visitor))
177+
}
178+
ClauseKind::ConstEvaluatable(p) => {
179+
noop_traversal_if_boring!(p.visit_with(visitor))
157180
}
158-
ClauseKind::WellFormed(p) => p.visit_with(visitor),
159-
ClauseKind::ConstEvaluatable(p) => p.visit_with(visitor),
160181
}
161182
}
162183
}
@@ -360,23 +381,32 @@ where
360381
{
361382
fn try_fold_with<F: FallibleTypeFolder<I>>(self, folder: &mut F) -> Result<Self, F::Error> {
362383
Ok(match self {
363-
PredicateKind::Clause(c) => PredicateKind::Clause(c.try_fold_with(folder)?),
364-
PredicateKind::ObjectSafe(d) => PredicateKind::ObjectSafe(d.try_fold_with(folder)?),
384+
PredicateKind::Clause(c) => {
385+
PredicateKind::Clause(noop_traversal_if_boring!(c.try_fold_with(folder))?)
386+
}
387+
PredicateKind::ObjectSafe(d) => {
388+
PredicateKind::ObjectSafe(noop_traversal_if_boring!(d.try_fold_with(folder))?)
389+
}
365390
PredicateKind::ClosureKind(d, g, k) => PredicateKind::ClosureKind(
366-
d.try_fold_with(folder)?,
367-
g.try_fold_with(folder)?,
368-
k.try_fold_with(folder)?,
391+
noop_traversal_if_boring!(d.try_fold_with(folder))?,
392+
noop_traversal_if_boring!(g.try_fold_with(folder))?,
393+
noop_traversal_if_boring!(k.try_fold_with(folder))?,
369394
),
370-
PredicateKind::Subtype(s) => PredicateKind::Subtype(s.try_fold_with(folder)?),
371-
PredicateKind::Coerce(s) => PredicateKind::Coerce(s.try_fold_with(folder)?),
372-
PredicateKind::ConstEquate(a, b) => {
373-
PredicateKind::ConstEquate(a.try_fold_with(folder)?, b.try_fold_with(folder)?)
395+
PredicateKind::Subtype(s) => {
396+
PredicateKind::Subtype(noop_traversal_if_boring!(s.try_fold_with(folder))?)
374397
}
398+
PredicateKind::Coerce(s) => {
399+
PredicateKind::Coerce(noop_traversal_if_boring!(s.try_fold_with(folder))?)
400+
}
401+
PredicateKind::ConstEquate(a, b) => PredicateKind::ConstEquate(
402+
noop_traversal_if_boring!(a.try_fold_with(folder))?,
403+
noop_traversal_if_boring!(b.try_fold_with(folder))?,
404+
),
375405
PredicateKind::Ambiguous => PredicateKind::Ambiguous,
376406
PredicateKind::AliasRelate(a, b, d) => PredicateKind::AliasRelate(
377-
a.try_fold_with(folder)?,
378-
b.try_fold_with(folder)?,
379-
d.try_fold_with(folder)?,
407+
noop_traversal_if_boring!(a.try_fold_with(folder))?,
408+
noop_traversal_if_boring!(b.try_fold_with(folder))?,
409+
noop_traversal_if_boring!(d.try_fold_with(folder))?,
380410
),
381411
})
382412
}
@@ -395,24 +425,28 @@ where
395425
{
396426
fn visit_with<V: TypeVisitor<I>>(&self, visitor: &mut V) -> ControlFlow<V::BreakTy> {
397427
match self {
398-
PredicateKind::Clause(p) => p.visit_with(visitor),
399-
PredicateKind::ObjectSafe(d) => d.visit_with(visitor),
428+
PredicateKind::Clause(p) => noop_traversal_if_boring!(p.visit_with(visitor)),
429+
PredicateKind::ObjectSafe(d) => {
430+
noop_traversal_if_boring!(d.visit_with(visitor))
431+
}
400432
PredicateKind::ClosureKind(d, g, k) => {
401-
d.visit_with(visitor)?;
402-
g.visit_with(visitor)?;
403-
k.visit_with(visitor)
433+
noop_traversal_if_boring!(d.visit_with(visitor))?;
434+
noop_traversal_if_boring!(g.visit_with(visitor))?;
435+
noop_traversal_if_boring!(k.visit_with(visitor))
436+
}
437+
PredicateKind::Subtype(s) => {
438+
noop_traversal_if_boring!(s.visit_with(visitor))
404439
}
405-
PredicateKind::Subtype(s) => s.visit_with(visitor),
406-
PredicateKind::Coerce(s) => s.visit_with(visitor),
440+
PredicateKind::Coerce(s) => noop_traversal_if_boring!(s.visit_with(visitor)),
407441
PredicateKind::ConstEquate(a, b) => {
408-
a.visit_with(visitor)?;
409-
b.visit_with(visitor)
442+
noop_traversal_if_boring!(a.visit_with(visitor))?;
443+
noop_traversal_if_boring!(b.visit_with(visitor))
410444
}
411445
PredicateKind::Ambiguous => ControlFlow::Continue(()),
412446
PredicateKind::AliasRelate(a, b, d) => {
413-
a.visit_with(visitor)?;
414-
b.visit_with(visitor)?;
415-
d.visit_with(visitor)
447+
noop_traversal_if_boring!(a.visit_with(visitor))?;
448+
noop_traversal_if_boring!(b.visit_with(visitor))?;
449+
noop_traversal_if_boring!(d.visit_with(visitor))
416450
}
417451
}
418452
}

0 commit comments

Comments
 (0)