Skip to content

Commit 4e6d2d9

Browse files
authored
Rollup merge of #101996 - b-naber:binder-print, r=lcnr
Don't duplicate region names for late-bound regions in print of Binder Fixes #101280
2 parents 6763980 + 953d88b commit 4e6d2d9

File tree

108 files changed

+313
-234
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+313
-234
lines changed

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

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1572,7 +1572,9 @@ pub struct FmtPrinterData<'a, 'tcx> {
15721572
in_value: bool,
15731573
pub print_alloc_ids: bool,
15741574

1575+
// set of all named (non-anonymous) region names
15751576
used_region_names: FxHashSet<Symbol>,
1577+
15761578
region_index: usize,
15771579
binder_depth: usize,
15781580
printed_type_count: usize,
@@ -2139,23 +2141,31 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
21392141
where
21402142
T: Print<'tcx, Self, Output = Self, Error = fmt::Error> + TypeFoldable<'tcx>,
21412143
{
2142-
fn name_by_region_index(index: usize) -> Symbol {
2143-
match index {
2144-
0 => Symbol::intern("'r"),
2145-
1 => Symbol::intern("'s"),
2146-
i => Symbol::intern(&format!("'t{}", i - 2)),
2144+
fn name_by_region_index(
2145+
index: usize,
2146+
available_names: &mut Vec<Symbol>,
2147+
num_available: usize,
2148+
) -> Symbol {
2149+
if let Some(name) = available_names.pop() {
2150+
name
2151+
} else {
2152+
Symbol::intern(&format!("'z{}", index - num_available))
21472153
}
21482154
}
21492155

2156+
debug!("name_all_regions");
2157+
21502158
// Replace any anonymous late-bound regions with named
21512159
// variants, using new unique identifiers, so that we can
21522160
// clearly differentiate between named and unnamed regions in
21532161
// the output. We'll probably want to tweak this over time to
21542162
// decide just how much information to give.
21552163
if self.binder_depth == 0 {
2156-
self.prepare_late_bound_region_info(value);
2164+
self.prepare_region_info(value);
21572165
}
21582166

2167+
debug!("self.used_region_names: {:?}", &self.used_region_names);
2168+
21592169
let mut empty = true;
21602170
let mut start_or_continue = |cx: &mut Self, start: &str, cont: &str| {
21612171
let w = if empty {
@@ -2172,13 +2182,24 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
21722182

21732183
define_scoped_cx!(self);
21742184

2185+
let possible_names =
2186+
('a'..='z').rev().map(|s| Symbol::intern(&format!("'{s}"))).collect::<Vec<_>>();
2187+
2188+
let mut available_names = possible_names
2189+
.into_iter()
2190+
.filter(|name| !self.used_region_names.contains(&name))
2191+
.collect::<Vec<_>>();
2192+
debug!(?available_names);
2193+
let num_available = available_names.len();
2194+
21752195
let mut region_index = self.region_index;
2176-
let mut next_name = |this: &Self| loop {
2177-
let name = name_by_region_index(region_index);
2196+
let mut next_name = |this: &Self| {
2197+
let name = name_by_region_index(region_index, &mut available_names, num_available);
2198+
debug!(?name);
21782199
region_index += 1;
2179-
if !this.used_region_names.contains(&name) {
2180-
break name;
2181-
}
2200+
assert!(!this.used_region_names.contains(&name));
2201+
2202+
name
21822203
};
21832204

21842205
// If we want to print verbosely, then print *all* binders, even if they
@@ -2199,6 +2220,7 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
21992220
ty::BrAnon(_) | ty::BrEnv => {
22002221
start_or_continue(&mut self, "for<", ", ");
22012222
let name = next_name(&self);
2223+
debug!(?name);
22022224
do_continue(&mut self, name);
22032225
ty::BrNamed(CRATE_DEF_ID.to_def_id(), name)
22042226
}
@@ -2292,29 +2314,37 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
22922314
Ok(inner)
22932315
}
22942316

2295-
fn prepare_late_bound_region_info<T>(&mut self, value: &ty::Binder<'tcx, T>)
2317+
fn prepare_region_info<T>(&mut self, value: &ty::Binder<'tcx, T>)
22962318
where
22972319
T: TypeVisitable<'tcx>,
22982320
{
2299-
struct LateBoundRegionNameCollector<'a, 'tcx> {
2300-
used_region_names: &'a mut FxHashSet<Symbol>,
2321+
struct RegionNameCollector<'tcx> {
2322+
used_region_names: FxHashSet<Symbol>,
23012323
type_collector: SsoHashSet<Ty<'tcx>>,
23022324
}
23032325

2304-
impl<'tcx> ty::visit::TypeVisitor<'tcx> for LateBoundRegionNameCollector<'_, 'tcx> {
2326+
impl<'tcx> RegionNameCollector<'tcx> {
2327+
fn new() -> Self {
2328+
RegionNameCollector {
2329+
used_region_names: Default::default(),
2330+
type_collector: SsoHashSet::new(),
2331+
}
2332+
}
2333+
}
2334+
2335+
impl<'tcx> ty::visit::TypeVisitor<'tcx> for RegionNameCollector<'tcx> {
23052336
type BreakTy = ();
23062337

23072338
fn visit_region(&mut self, r: ty::Region<'tcx>) -> ControlFlow<Self::BreakTy> {
23082339
trace!("address: {:p}", r.0.0);
2309-
if let ty::ReLateBound(_, ty::BoundRegion { kind: ty::BrNamed(_, name), .. }) = *r {
2310-
self.used_region_names.insert(name);
2311-
} else if let ty::RePlaceholder(ty::PlaceholderRegion {
2312-
name: ty::BrNamed(_, name),
2313-
..
2314-
}) = *r
2315-
{
2340+
2341+
// Collect all named lifetimes. These allow us to prevent duplication
2342+
// of already existing lifetime names when introducing names for
2343+
// anonymous late-bound regions.
2344+
if let Some(name) = r.get_name() {
23162345
self.used_region_names.insert(name);
23172346
}
2347+
23182348
r.super_visit_with(self)
23192349
}
23202350

@@ -2330,12 +2360,9 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
23302360
}
23312361
}
23322362

2333-
self.used_region_names.clear();
2334-
let mut collector = LateBoundRegionNameCollector {
2335-
used_region_names: &mut self.used_region_names,
2336-
type_collector: SsoHashSet::new(),
2337-
};
2363+
let mut collector = RegionNameCollector::new();
23382364
value.visit_with(&mut collector);
2365+
self.used_region_names = collector.used_region_names;
23392366
self.region_index = 0;
23402367
}
23412368
}

compiler/rustc_middle/src/ty/sty.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,17 @@ impl BoundRegionKind {
8585
_ => false,
8686
}
8787
}
88+
89+
pub fn get_name(&self) -> Option<Symbol> {
90+
if self.is_named() {
91+
match *self {
92+
BoundRegionKind::BrNamed(_, name) => return Some(name),
93+
_ => unreachable!(),
94+
}
95+
}
96+
97+
None
98+
}
8899
}
89100

90101
pub trait Article {
@@ -1441,6 +1452,23 @@ impl<'tcx> Region<'tcx> {
14411452
*self.0.0
14421453
}
14431454

1455+
pub fn get_name(self) -> Option<Symbol> {
1456+
if self.has_name() {
1457+
let name = match *self {
1458+
ty::ReEarlyBound(ebr) => Some(ebr.name),
1459+
ty::ReLateBound(_, br) => br.kind.get_name(),
1460+
ty::ReFree(fr) => fr.bound_region.get_name(),
1461+
ty::ReStatic => Some(kw::StaticLifetime),
1462+
ty::RePlaceholder(placeholder) => placeholder.name.get_name(),
1463+
_ => None,
1464+
};
1465+
1466+
return name;
1467+
}
1468+
1469+
None
1470+
}
1471+
14441472
/// Is this region named by the user?
14451473
pub fn has_name(self) -> bool {
14461474
match *self {

src/test/mir-opt/combine_clone_of_primitives.{impl#0}-clone.InstCombine.diff

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
_2 = <T as Clone>::clone(move _3) -> bb1; // scope 0 at $DIR/combine_clone_of_primitives.rs:8:5: 8:9
2525
// mir::Constant
2626
// + span: $DIR/combine_clone_of_primitives.rs:8:5: 8:9
27-
// + literal: Const { ty: for<'r> fn(&'r T) -> T {<T as Clone>::clone}, val: Value(<ZST>) }
27+
// + literal: Const { ty: for<'a> fn(&'a T) -> T {<T as Clone>::clone}, val: Value(<ZST>) }
2828
}
2929

3030
bb1: {
@@ -37,7 +37,7 @@
3737
- _5 = <u64 as Clone>::clone(move _6) -> [return: bb2, unwind: bb4]; // scope 0 at $DIR/combine_clone_of_primitives.rs:9:5: 9:11
3838
- // mir::Constant
3939
- // + span: $DIR/combine_clone_of_primitives.rs:9:5: 9:11
40-
- // + literal: Const { ty: for<'r> fn(&'r u64) -> u64 {<u64 as Clone>::clone}, val: Value(<ZST>) }
40+
- // + literal: Const { ty: for<'a> fn(&'a u64) -> u64 {<u64 as Clone>::clone}, val: Value(<ZST>) }
4141
+ _6 = _7; // scope 0 at $DIR/combine_clone_of_primitives.rs:9:5: 9:11
4242
+ _5 = (*_6); // scope 0 at $DIR/combine_clone_of_primitives.rs:9:5: 9:11
4343
+ goto -> bb2; // scope 0 at $DIR/combine_clone_of_primitives.rs:9:5: 9:11
@@ -53,7 +53,7 @@
5353
- _8 = <[f32; 3] as Clone>::clone(move _9) -> [return: bb3, unwind: bb4]; // scope 0 at $DIR/combine_clone_of_primitives.rs:10:5: 10:16
5454
- // mir::Constant
5555
- // + span: $DIR/combine_clone_of_primitives.rs:10:5: 10:16
56-
- // + literal: Const { ty: for<'r> fn(&'r [f32; 3]) -> [f32; 3] {<[f32; 3] as Clone>::clone}, val: Value(<ZST>) }
56+
- // + literal: Const { ty: for<'a> fn(&'a [f32; 3]) -> [f32; 3] {<[f32; 3] as Clone>::clone}, val: Value(<ZST>) }
5757
+ _9 = _10; // scope 0 at $DIR/combine_clone_of_primitives.rs:10:5: 10:16
5858
+ _8 = (*_9); // scope 0 at $DIR/combine_clone_of_primitives.rs:10:5: 10:16
5959
+ goto -> bb3; // scope 0 at $DIR/combine_clone_of_primitives.rs:10:5: 10:16

src/test/mir-opt/const_promotion_extern_static.BAR.PromoteTemps.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
_0 = core::slice::<impl [&i32]>::as_ptr(move _1) -> [return: bb1, unwind: bb2]; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:31: +0:44
3434
// mir::Constant
3535
// + span: $DIR/const-promotion-extern-static.rs:9:36: 9:42
36-
// + literal: Const { ty: for<'r> fn(&'r [&i32]) -> *const &i32 {core::slice::<impl [&i32]>::as_ptr}, val: Value(<ZST>) }
36+
// + literal: Const { ty: for<'a> fn(&'a [&i32]) -> *const &i32 {core::slice::<impl [&i32]>::as_ptr}, val: Value(<ZST>) }
3737
}
3838

3939
bb1: {

src/test/mir-opt/const_promotion_extern_static.FOO.PromoteTemps.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
_0 = core::slice::<impl [&i32]>::as_ptr(move _1) -> [return: bb1, unwind: bb2]; // scope 0 at $DIR/const-promotion-extern-static.rs:+0:31: +0:55
3636
// mir::Constant
3737
// + span: $DIR/const-promotion-extern-static.rs:13:47: 13:53
38-
// + literal: Const { ty: for<'r> fn(&'r [&i32]) -> *const &i32 {core::slice::<impl [&i32]>::as_ptr}, val: Value(<ZST>) }
38+
// + literal: Const { ty: for<'a> fn(&'a [&i32]) -> *const &i32 {core::slice::<impl [&i32]>::as_ptr}, val: Value(<ZST>) }
3939
}
4040

4141
bb1: {

src/test/mir-opt/deduplicate_blocks.is_line_doc_comment_2.DeduplicateBlocks.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
_2 = core::str::<impl str>::as_bytes(move _3) -> bb1; // scope 0 at $DIR/deduplicate_blocks.rs:+1:11: +1:23
2121
// mir::Constant
2222
// + span: $DIR/deduplicate_blocks.rs:5:13: 5:21
23-
// + literal: Const { ty: for<'r> fn(&'r str) -> &'r [u8] {core::str::<impl str>::as_bytes}, val: Value(<ZST>) }
23+
// + literal: Const { ty: for<'a> fn(&'a str) -> &'a [u8] {core::str::<impl str>::as_bytes}, val: Value(<ZST>) }
2424
}
2525

2626
bb1: {

src/test/mir-opt/derefer_complex_case.main.Derefer.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
_7 = <std::slice::Iter<i32> as Iterator>::next(move _8) -> bb3; // scope 1 at $DIR/derefer_complex_case.rs:+1:17: +1:26
5757
// mir::Constant
5858
// + span: $DIR/derefer_complex_case.rs:6:17: 6:26
59-
// + literal: Const { ty: for<'r> fn(&'r mut std::slice::Iter<i32>) -> Option<<std::slice::Iter<i32> as Iterator>::Item> {<std::slice::Iter<i32> as Iterator>::next}, val: Value(<ZST>) }
59+
// + literal: Const { ty: for<'a> fn(&'a mut std::slice::Iter<i32>) -> Option<<std::slice::Iter<i32> as Iterator>::Item> {<std::slice::Iter<i32> as Iterator>::next}, val: Value(<ZST>) }
6060
}
6161

6262
bb3: {

src/test/mir-opt/dest-prop/simple.nrvo.DestinationPropagation.diff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
- // MIR for `nrvo` before DestinationPropagation
22
+ // MIR for `nrvo` after DestinationPropagation
33

4-
fn nrvo(_1: for<'r> fn(&'r mut [u8; 1024])) -> [u8; 1024] {
4+
fn nrvo(_1: for<'a> fn(&'a mut [u8; 1024])) -> [u8; 1024] {
55
debug init => _1; // in scope 0 at $DIR/simple.rs:+0:9: +0:13
66
let mut _0: [u8; 1024]; // return place in scope 0 at $DIR/simple.rs:+0:39: +0:49
77
let mut _2: [u8; 1024]; // in scope 0 at $DIR/simple.rs:+1:9: +1:16
88
let _3: (); // in scope 0 at $DIR/simple.rs:+2:5: +2:19
9-
let mut _4: for<'r> fn(&'r mut [u8; 1024]); // in scope 0 at $DIR/simple.rs:+2:5: +2:9
9+
let mut _4: for<'a> fn(&'a mut [u8; 1024]); // in scope 0 at $DIR/simple.rs:+2:5: +2:9
1010
let mut _5: &mut [u8; 1024]; // in scope 0 at $DIR/simple.rs:+2:10: +2:18
1111
let mut _6: &mut [u8; 1024]; // in scope 0 at $DIR/simple.rs:+2:10: +2:18
1212
scope 1 {

src/test/mir-opt/funky_arms.float_to_exponential_common.ConstProp.diff

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
_4 = Formatter::sign_plus(move _5) -> bb1; // scope 0 at $DIR/funky_arms.rs:+4:22: +4:37
4242
// mir::Constant
4343
// + span: $DIR/funky_arms.rs:15:26: 15:35
44-
// + literal: Const { ty: for<'r> fn(&'r Formatter) -> bool {Formatter::sign_plus}, val: Value(<ZST>) }
44+
// + literal: Const { ty: for<'a> fn(&'a Formatter) -> bool {Formatter::sign_plus}, val: Value(<ZST>) }
4545
}
4646

4747
bb1: {
@@ -69,7 +69,7 @@
6969
_7 = Formatter::precision(move _8) -> bb5; // scope 3 at $DIR/funky_arms.rs:+13:30: +13:45
7070
// mir::Constant
7171
// + span: $DIR/funky_arms.rs:24:34: 24:43
72-
// + literal: Const { ty: for<'r> fn(&'r Formatter) -> Option<usize> {Formatter::precision}, val: Value(<ZST>) }
72+
// + literal: Const { ty: for<'a> fn(&'a Formatter) -> Option<usize> {Formatter::precision}, val: Value(<ZST>) }
7373
}
7474

7575
bb5: {
@@ -100,7 +100,7 @@
100100
_0 = float_to_exponential_common_exact::<T>(move _11, move _12, move _13, move _14, move _17) -> bb7; // scope 3 at $DIR/funky_arms.rs:+15:9: +15:87
101101
// mir::Constant
102102
// + span: $DIR/funky_arms.rs:26:9: 26:42
103-
// + literal: Const { ty: for<'r, 's, 't0> fn(&'r mut Formatter<'s>, &'t0 T, Sign, u32, bool) -> Result<(), std::fmt::Error> {float_to_exponential_common_exact::<T>}, val: Value(<ZST>) }
103+
// + literal: Const { ty: for<'a, 'b, 'c> fn(&'a mut Formatter<'b>, &'c T, Sign, u32, bool) -> Result<(), std::fmt::Error> {float_to_exponential_common_exact::<T>}, val: Value(<ZST>) }
104104
}
105105

106106
bb7: {
@@ -125,7 +125,7 @@
125125
_0 = float_to_exponential_common_shortest::<T>(move _18, move _19, move _20, move _21) -> bb9; // scope 2 at $DIR/funky_arms.rs:+17:9: +17:68
126126
// mir::Constant
127127
// + span: $DIR/funky_arms.rs:28:9: 28:45
128-
// + literal: Const { ty: for<'r, 's, 't0> fn(&'r mut Formatter<'s>, &'t0 T, Sign, bool) -> Result<(), std::fmt::Error> {float_to_exponential_common_shortest::<T>}, val: Value(<ZST>) }
128+
// + literal: Const { ty: for<'a, 'b, 'c> fn(&'a mut Formatter<'b>, &'c T, Sign, bool) -> Result<(), std::fmt::Error> {float_to_exponential_common_shortest::<T>}, val: Value(<ZST>) }
129129
}
130130

131131
bb9: {

src/test/mir-opt/inline/cycle.f.Inline.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
_2 = <impl Fn() as Fn<()>>::call(move _3, move _4) -> [return: bb1, unwind: bb3]; // scope 0 at $DIR/cycle.rs:+1:5: +1:8
1818
// mir::Constant
1919
// + span: $DIR/cycle.rs:6:5: 6:6
20-
// + literal: Const { ty: for<'r> extern "rust-call" fn(&'r impl Fn(), ()) -> <impl Fn() as FnOnce<()>>::Output {<impl Fn() as Fn<()>>::call}, val: Value(<ZST>) }
20+
// + literal: Const { ty: for<'a> extern "rust-call" fn(&'a impl Fn(), ()) -> <impl Fn() as FnOnce<()>>::Output {<impl Fn() as Fn<()>>::call}, val: Value(<ZST>) }
2121
}
2222

2323
bb1: {

src/test/mir-opt/inline/dyn_trait.get_query.Inline.diff

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
// mir::Constant
2929
// + span: $DIR/dyn-trait.rs:33:13: 33:21
3030
// + user_ty: UserType(0)
31-
// + literal: Const { ty: for<'r> fn(&'r T) -> &'r <Q as Query>::C {<Q as Query>::cache::<T>}, val: Value(<ZST>) }
31+
// + literal: Const { ty: for<'a> fn(&'a T) -> &'a <Q as Query>::C {<Q as Query>::cache::<T>}, val: Value(<ZST>) }
3232
}
3333

3434
bb1: {
@@ -46,9 +46,9 @@
4646
+ _0 = <dyn Cache<V = <Q as Query>::V> as Cache>::store_nocache(move _7) -> bb2; // scope 3 at $DIR/dyn-trait.rs:21:5: 21:22
4747
// mir::Constant
4848
- // + span: $DIR/dyn-trait.rs:34:5: 34:22
49-
- // + literal: Const { ty: for<'r> fn(&'r <Q as Query>::C) {try_execute_query::<<Q as Query>::C>}, val: Value(<ZST>) }
49+
- // + literal: Const { ty: for<'a> fn(&'a <Q as Query>::C) {try_execute_query::<<Q as Query>::C>}, val: Value(<ZST>) }
5050
+ // + span: $DIR/dyn-trait.rs:21:7: 21:20
51-
+ // + literal: Const { ty: for<'r> fn(&'r dyn Cache<V = <Q as Query>::V>) {<dyn Cache<V = <Q as Query>::V> as Cache>::store_nocache}, val: Value(<ZST>) }
51+
+ // + literal: Const { ty: for<'a> fn(&'a dyn Cache<V = <Q as Query>::V>) {<dyn Cache<V = <Q as Query>::V> as Cache>::store_nocache}, val: Value(<ZST>) }
5252
}
5353

5454
bb2: {

src/test/mir-opt/inline/dyn_trait.mk_cycle.Inline.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
_0 = <dyn Cache<V = V> as Cache>::store_nocache(move _2) -> bb1; // scope 0 at $DIR/dyn-trait.rs:+1:5: +1:22
1313
// mir::Constant
1414
// + span: $DIR/dyn-trait.rs:21:7: 21:20
15-
// + literal: Const { ty: for<'r> fn(&'r dyn Cache<V = V>) {<dyn Cache<V = V> as Cache>::store_nocache}, val: Value(<ZST>) }
15+
// + literal: Const { ty: for<'a> fn(&'a dyn Cache<V = V>) {<dyn Cache<V = V> as Cache>::store_nocache}, val: Value(<ZST>) }
1616
}
1717

1818
bb1: {

src/test/mir-opt/inline/dyn_trait.try_execute_query.Inline.diff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
+ _0 = <dyn Cache<V = <C as Cache>::V> as Cache>::store_nocache(move _4) -> bb1; // scope 1 at $DIR/dyn-trait.rs:21:5: 21:22
2424
// mir::Constant
2525
- // + span: $DIR/dyn-trait.rs:27:5: 27:13
26-
- // + literal: Const { ty: for<'r> fn(&'r (dyn Cache<V = <C as Cache>::V> + 'r)) {mk_cycle::<<C as Cache>::V>}, val: Value(<ZST>) }
26+
- // + literal: Const { ty: for<'a> fn(&'a (dyn Cache<V = <C as Cache>::V> + 'a)) {mk_cycle::<<C as Cache>::V>}, val: Value(<ZST>) }
2727
+ // + span: $DIR/dyn-trait.rs:21:7: 21:20
28-
+ // + literal: Const { ty: for<'r> fn(&'r dyn Cache<V = <C as Cache>::V>) {<dyn Cache<V = <C as Cache>::V> as Cache>::store_nocache}, val: Value(<ZST>) }
28+
+ // + literal: Const { ty: for<'a> fn(&'a dyn Cache<V = <C as Cache>::V>) {<dyn Cache<V = <C as Cache>::V> as Cache>::store_nocache}, val: Value(<ZST>) }
2929
}
3030

3131
bb1: {

0 commit comments

Comments
 (0)