Skip to content

Commit b02062e

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 4d4a369 + 6118ee3 commit b02062e

File tree

109 files changed

+315
-236
lines changed

Some content is hidden

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

109 files changed

+315
-236
lines changed

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

+54-27
Original file line numberDiff line numberDiff line change
@@ -1562,7 +1562,9 @@ pub struct FmtPrinterData<'a, 'tcx> {
15621562
in_value: bool,
15631563
pub print_alloc_ids: bool,
15641564

1565+
// set of all named (non-anonymous) region names
15651566
used_region_names: FxHashSet<Symbol>,
1567+
15661568
region_index: usize,
15671569
binder_depth: usize,
15681570
printed_type_count: usize,
@@ -2118,23 +2120,31 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
21182120
where
21192121
T: Print<'tcx, Self, Output = Self, Error = fmt::Error> + TypeFoldable<'tcx>,
21202122
{
2121-
fn name_by_region_index(index: usize) -> Symbol {
2122-
match index {
2123-
0 => Symbol::intern("'r"),
2124-
1 => Symbol::intern("'s"),
2125-
i => Symbol::intern(&format!("'t{}", i - 2)),
2123+
fn name_by_region_index(
2124+
index: usize,
2125+
available_names: &mut Vec<Symbol>,
2126+
num_available: usize,
2127+
) -> Symbol {
2128+
if let Some(name) = available_names.pop() {
2129+
name
2130+
} else {
2131+
Symbol::intern(&format!("'z{}", index - num_available))
21262132
}
21272133
}
21282134

2135+
debug!("name_all_regions");
2136+
21292137
// Replace any anonymous late-bound regions with named
21302138
// variants, using new unique identifiers, so that we can
21312139
// clearly differentiate between named and unnamed regions in
21322140
// the output. We'll probably want to tweak this over time to
21332141
// decide just how much information to give.
21342142
if self.binder_depth == 0 {
2135-
self.prepare_late_bound_region_info(value);
2143+
self.prepare_region_info(value);
21362144
}
21372145

2146+
debug!("self.used_region_names: {:?}", &self.used_region_names);
2147+
21382148
let mut empty = true;
21392149
let mut start_or_continue = |cx: &mut Self, start: &str, cont: &str| {
21402150
let w = if empty {
@@ -2151,13 +2161,24 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
21512161

21522162
define_scoped_cx!(self);
21532163

2164+
let possible_names =
2165+
('a'..='z').rev().map(|s| Symbol::intern(&format!("'{s}"))).collect::<Vec<_>>();
2166+
2167+
let mut available_names = possible_names
2168+
.into_iter()
2169+
.filter(|name| !self.used_region_names.contains(&name))
2170+
.collect::<Vec<_>>();
2171+
debug!(?available_names);
2172+
let num_available = available_names.len();
2173+
21542174
let mut region_index = self.region_index;
2155-
let mut next_name = |this: &Self| loop {
2156-
let name = name_by_region_index(region_index);
2175+
let mut next_name = |this: &Self| {
2176+
let name = name_by_region_index(region_index, &mut available_names, num_available);
2177+
debug!(?name);
21572178
region_index += 1;
2158-
if !this.used_region_names.contains(&name) {
2159-
break name;
2160-
}
2179+
assert!(!this.used_region_names.contains(&name));
2180+
2181+
name
21612182
};
21622183

21632184
// If we want to print verbosely, then print *all* binders, even if they
@@ -2178,6 +2199,7 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
21782199
ty::BrAnon(_) | ty::BrEnv => {
21792200
start_or_continue(&mut self, "for<", ", ");
21802201
let name = next_name(&self);
2202+
debug!(?name);
21812203
do_continue(&mut self, name);
21822204
ty::BrNamed(CRATE_DEF_ID.to_def_id(), name)
21832205
}
@@ -2271,29 +2293,37 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
22712293
Ok(inner)
22722294
}
22732295

2274-
fn prepare_late_bound_region_info<T>(&mut self, value: &ty::Binder<'tcx, T>)
2296+
fn prepare_region_info<T>(&mut self, value: &ty::Binder<'tcx, T>)
22752297
where
22762298
T: TypeVisitable<'tcx>,
22772299
{
2278-
struct LateBoundRegionNameCollector<'a, 'tcx> {
2279-
used_region_names: &'a mut FxHashSet<Symbol>,
2300+
struct RegionNameCollector<'tcx> {
2301+
used_region_names: FxHashSet<Symbol>,
22802302
type_collector: SsoHashSet<Ty<'tcx>>,
22812303
}
22822304

2283-
impl<'tcx> ty::visit::TypeVisitor<'tcx> for LateBoundRegionNameCollector<'_, 'tcx> {
2305+
impl<'tcx> RegionNameCollector<'tcx> {
2306+
fn new() -> Self {
2307+
RegionNameCollector {
2308+
used_region_names: Default::default(),
2309+
type_collector: SsoHashSet::new(),
2310+
}
2311+
}
2312+
}
2313+
2314+
impl<'tcx> ty::visit::TypeVisitor<'tcx> for RegionNameCollector<'tcx> {
22842315
type BreakTy = ();
22852316

22862317
fn visit_region(&mut self, r: ty::Region<'tcx>) -> ControlFlow<Self::BreakTy> {
22872318
trace!("address: {:p}", r.0.0);
2288-
if let ty::ReLateBound(_, ty::BoundRegion { kind: ty::BrNamed(_, name), .. }) = *r {
2289-
self.used_region_names.insert(name);
2290-
} else if let ty::RePlaceholder(ty::PlaceholderRegion {
2291-
name: ty::BrNamed(_, name),
2292-
..
2293-
}) = *r
2294-
{
2319+
2320+
// Collect all named lifetimes. These allow us to prevent duplication
2321+
// of already existing lifetime names when introducing names for
2322+
// anonymous late-bound regions.
2323+
if let Some(name) = r.get_name() {
22952324
self.used_region_names.insert(name);
22962325
}
2326+
22972327
r.super_visit_with(self)
22982328
}
22992329

@@ -2309,12 +2339,9 @@ impl<'tcx> FmtPrinter<'_, 'tcx> {
23092339
}
23102340
}
23112341

2312-
self.used_region_names.clear();
2313-
let mut collector = LateBoundRegionNameCollector {
2314-
used_region_names: &mut self.used_region_names,
2315-
type_collector: SsoHashSet::new(),
2316-
};
2342+
let mut collector = RegionNameCollector::new();
23172343
value.visit_with(&mut collector);
2344+
self.used_region_names = collector.used_region_names;
23182345
self.region_index = 0;
23192346
}
23202347
}

compiler/rustc_middle/src/ty/sty.rs

+28
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 {
@@ -1445,6 +1456,23 @@ impl<'tcx> Region<'tcx> {
14451456
*self.0.0
14461457
}
14471458

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

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

+3-3
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

+1-1
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

+1-1
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

+1-1
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

+1-1
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

+2-2
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

+4-4
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

+1-1
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

+3-3
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

+1-1
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

+2-2
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)