Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit ea3158c

Browse files
committedSep 24, 2023
Auto merge of rust-lang#116119 - GuillaumeGomez:rollup-ohwianb, r=GuillaumeGomez
Rollup of 6 pull requests Successful merges: - rust-lang#114454 (Replace `HashMap` with `IndexMap` in pattern binding resolve ) - rust-lang#116069 (Fix debug printing of tuple) - rust-lang#116076 (Add Zba, Zbb, and Zbs as target features for riscv64-linux-android) - rust-lang#116078 (Add assembly test to make sure that inlining works as expected when closures inherit target features) - rust-lang#116096 (Make FnDef 1-ZST in LLVM debuginfo.) - rust-lang#116116 (Rename the legacy feature gating macro) r? `@ghost` `@rustbot` modify labels: rollup
2 parents c7224e3 + 2f5d95c commit ea3158c

File tree

10 files changed

+197
-117
lines changed

10 files changed

+197
-117
lines changed
 

‎compiler/rustc_ast_passes/src/feature_gate.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -578,25 +578,31 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session, features: &Features) {
578578
}
579579
}
580580

581-
// All uses of `gate_all!` below this point were added in #65742,
581+
// All uses of `gate_all_legacy_dont_use!` below this point were added in #65742,
582582
// and subsequently disabled (with the non-early gating readded).
583583
// We emit an early future-incompatible warning for these.
584584
// New syntax gates should go above here to get a hard error gate.
585-
macro_rules! gate_all {
585+
macro_rules! gate_all_legacy_dont_use {
586586
($gate:ident, $msg:literal) => {
587587
for span in spans.get(&sym::$gate).unwrap_or(&vec![]) {
588588
gate_feature_post!(future_incompatible; &visitor, $gate, *span, $msg);
589589
}
590590
};
591591
}
592592

593-
gate_all!(trait_alias, "trait aliases are experimental");
594-
gate_all!(associated_type_bounds, "associated type bounds are unstable");
595-
gate_all!(return_type_notation, "return type notation is experimental");
596-
gate_all!(decl_macro, "`macro` is experimental");
597-
gate_all!(box_patterns, "box pattern syntax is experimental");
598-
gate_all!(exclusive_range_pattern, "exclusive range pattern syntax is experimental");
599-
gate_all!(try_blocks, "`try` blocks are unstable");
593+
gate_all_legacy_dont_use!(trait_alias, "trait aliases are experimental");
594+
gate_all_legacy_dont_use!(associated_type_bounds, "associated type bounds are unstable");
595+
// Despite being a new feature, `where T: Trait<Assoc(): Sized>`, which is RTN syntax now,
596+
// used to be gated under associated_type_bounds, which are right above, so RTN needs to
597+
// be too.
598+
gate_all_legacy_dont_use!(return_type_notation, "return type notation is experimental");
599+
gate_all_legacy_dont_use!(decl_macro, "`macro` is experimental");
600+
gate_all_legacy_dont_use!(box_patterns, "box pattern syntax is experimental");
601+
gate_all_legacy_dont_use!(
602+
exclusive_range_pattern,
603+
"exclusive range pattern syntax is experimental"
604+
);
605+
gate_all_legacy_dont_use!(try_blocks, "`try` blocks are unstable");
600606

601607
visit::walk_crate(&mut visitor, krate);
602608
}

‎compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,12 +335,20 @@ fn build_subroutine_type_di_node<'ll, 'tcx>(
335335

336336
// This is actually a function pointer, so wrap it in pointer DI.
337337
let name = compute_debuginfo_type_name(cx.tcx, fn_ty, false);
338+
let (size, align) = match fn_ty.kind() {
339+
ty::FnDef(..) => (0, 1),
340+
ty::FnPtr(..) => (
341+
cx.tcx.data_layout.pointer_size.bits(),
342+
cx.tcx.data_layout.pointer_align.abi.bits() as u32,
343+
),
344+
_ => unreachable!(),
345+
};
338346
let di_node = unsafe {
339347
llvm::LLVMRustDIBuilderCreatePointerType(
340348
DIB(cx),
341349
fn_di_node,
342-
cx.tcx.data_layout.pointer_size.bits(),
343-
cx.tcx.data_layout.pointer_align.abi.bits() as u32,
350+
size,
351+
align,
344352
0, // Ignore DWARF address space.
345353
name.as_ptr().cast(),
346354
name.len(),

‎compiler/rustc_resolve/src/late.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3201,8 +3201,8 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
32013201
/// Checks that all of the arms in an or-pattern have exactly the
32023202
/// same set of bindings, with the same binding modes for each.
32033203
fn check_consistent_bindings(&mut self, pats: &[P<Pat>]) -> Vec<BindingMap> {
3204-
let mut missing_vars = FxHashMap::default();
3205-
let mut inconsistent_vars = FxHashMap::default();
3204+
let mut missing_vars = FxIndexMap::default();
3205+
let mut inconsistent_vars = FxIndexMap::default();
32063206

32073207
// 1) Compute the binding maps of all arms.
32083208
let maps = pats.iter().map(|pat| self.binding_mode_map(pat)).collect::<Vec<_>>();
@@ -3244,10 +3244,7 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
32443244
}
32453245

32463246
// 3) Report all missing variables we found.
3247-
let mut missing_vars = missing_vars.into_iter().collect::<Vec<_>>();
3248-
missing_vars.sort_by_key(|&(sym, ref _err)| sym);
3249-
3250-
for (name, mut v) in missing_vars.into_iter() {
3247+
for (name, mut v) in missing_vars {
32513248
if inconsistent_vars.contains_key(&name) {
32523249
v.could_be_path = false;
32533250
}
@@ -3258,10 +3255,8 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
32583255
}
32593256

32603257
// 4) Report all inconsistencies in binding modes we found.
3261-
let mut inconsistent_vars = inconsistent_vars.iter().collect::<Vec<_>>();
3262-
inconsistent_vars.sort();
32633258
for (name, v) in inconsistent_vars {
3264-
self.report_error(v.0, ResolutionError::VariableBoundWithDifferentMode(*name, v.1));
3259+
self.report_error(v.0, ResolutionError::VariableBoundWithDifferentMode(name, v.1));
32653260
}
32663261

32673262
// 5) Finally bubble up all the binding maps.

‎compiler/rustc_target/src/spec/riscv64_linux_android.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub fn target() -> Target {
99
options: TargetOptions {
1010
code_model: Some(CodeModel::Medium),
1111
cpu: "generic-rv64".into(),
12-
features: "+m,+a,+f,+d,+c".into(),
12+
features: "+m,+a,+f,+d,+c,+Zba,+Zbb,+Zbs".into(),
1313
llvm_abiname: "lp64d".into(),
1414
supported_sanitizers: SanitizerSet::ADDRESS,
1515
max_atomic_width: Some(64),

‎compiler/rustc_type_ir/src/sty.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -531,22 +531,18 @@ impl<I: Interner> DebugWithInfcx<I> for TyKind<I> {
531531
}
532532
Never => write!(f, "!"),
533533
Tuple(t) => {
534-
let mut iter = t.clone().into_iter();
535-
536534
write!(f, "(")?;
537-
538-
match iter.next() {
539-
None => return write!(f, ")"),
540-
Some(ty) => write!(f, "{:?}", &this.wrap(ty))?,
541-
};
542-
543-
match iter.next() {
544-
None => return write!(f, ",)"),
545-
Some(ty) => write!(f, "{:?})", &this.wrap(ty))?,
535+
let mut count = 0;
536+
for ty in t.clone() {
537+
if count > 0 {
538+
write!(f, ", ")?;
539+
}
540+
write!(f, "{:?}", &this.wrap(ty))?;
541+
count += 1;
546542
}
547-
548-
for ty in iter {
549-
write!(f, ", {:?}", &this.wrap(ty))?;
543+
// unary tuples need a trailing comma
544+
if count == 1 {
545+
write!(f, ",")?;
550546
}
551547
write!(f, ")")
552548
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// only-x86_64
2+
// assembly-output: emit-asm
3+
// make sure the feature is not enabled at compile-time
4+
// compile-flags: -C target-feature=-sse4.1 -C llvm-args=-x86-asm-syntax=intel
5+
6+
#![feature(target_feature_11)]
7+
#![crate_type = "rlib"]
8+
9+
use std::arch::x86_64::{__m128, _mm_blend_ps};
10+
11+
#[no_mangle]
12+
pub unsafe fn sse41_blend_nofeature(x: __m128, y: __m128) -> __m128 {
13+
let f = {
14+
// check that _mm_blend_ps is not being inlined into the closure
15+
// CHECK-LABEL: {{sse41_blend_nofeature.*closure.*:}}
16+
// CHECK-NOT: blendps
17+
// CHECK: {{call .*_mm_blend_ps.*}}
18+
// CHECK-NOT: blendps
19+
// CHECK: ret
20+
#[inline(never)] |x, y| _mm_blend_ps(x, y, 0b0101)
21+
};
22+
f(x, y)
23+
}
24+
25+
#[target_feature(enable = "sse4.1")]
26+
pub fn sse41_blend_noinline(x: __m128, y: __m128) -> __m128 {
27+
let f = {
28+
// check that _mm_blend_ps is being inlined into the closure
29+
// CHECK-LABEL: {{sse41_blend_noinline.*closure.*:}}
30+
// CHECK-NOT: _mm_blend_ps
31+
// CHECK: blendps
32+
// CHECK-NOT: _mm_blend_ps
33+
// CHECK: ret
34+
#[inline(never)] |x, y| unsafe {
35+
_mm_blend_ps(x, y, 0b0101)
36+
}
37+
};
38+
f(x, y)
39+
}
40+
41+
#[no_mangle]
42+
#[target_feature(enable = "sse4.1")]
43+
pub fn sse41_blend_doinline(x: __m128, y: __m128) -> __m128 {
44+
// check that the closure and _mm_blend_ps are being inlined into the function
45+
// CHECK-LABEL: sse41_blend_doinline:
46+
// CHECK-NOT: {{sse41_blend_doinline.*closure.*}}
47+
// CHECK-NOT: _mm_blend_ps
48+
// CHECK: blendps
49+
// CHECK-NOT: {{sse41_blend_doinline.*closure.*}}
50+
// CHECK-NOT: _mm_blend_ps
51+
// CHECK: ret
52+
let f = {
53+
#[inline] |x, y| unsafe {
54+
_mm_blend_ps(x, y, 0b0101)
55+
}
56+
};
57+
f(x, y)
58+
}

‎tests/codegen/debug-fndef-size.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Verify that `i32::cmp` FnDef type is declared with size 0 and align 1 in LLVM debuginfo.
2+
// compile-flags: -O -g -Cno-prepopulate-passes
3+
4+
use std::cmp::Ordering;
5+
6+
fn foo<F: FnOnce(&i32, &i32) -> Ordering>(v1: i32, v2: i32, compare: F) -> Ordering {
7+
compare(&v1, &v2)
8+
}
9+
10+
pub fn main() {
11+
foo(0, 1, i32::cmp);
12+
}
13+
14+
// CHECK: %compare.dbg.spill = alloca {}, align 1
15+
// CHECK: call void @llvm.dbg.declare(metadata ptr %compare.dbg.spill, metadata ![[VAR:.*]], metadata !DIExpression()), !dbg !{{.*}}
16+
// CHECK: ![[TYPE:.*]] = !DIDerivedType(tag: DW_TAG_pointer_type, name: "fn(&i32, &i32) -> core::cmp::Ordering", baseType: !{{.*}}, align: 1, dwarfAddressSpace: {{.*}})
17+
// CHECK: ![[VAR]] = !DILocalVariable(name: "compare", scope: !{{.*}}, file: !{{.*}}, line: {{.*}}, type: ![[TYPE]], align: 1)

‎tests/ui/or-patterns/missing-bindings.stderr

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ LL | let (A(A(a, b) | B(c), d) | B(e)) = Y;
8787
| |
8888
| pattern doesn't bind `c`
8989

90+
error[E0408]: variable `b` is not bound in all patterns
91+
--> $DIR/missing-bindings.rs:45:22
92+
|
93+
LL | let (A(A(a, b) | B(c), d) | B(e)) = Y;
94+
| - ^^^^ pattern doesn't bind `b`
95+
| |
96+
| variable not in all patterns
97+
9098
error[E0408]: variable `a` is not bound in all patterns
9199
--> $DIR/missing-bindings.rs:45:22
92100
|
@@ -95,11 +103,19 @@ LL | let (A(A(a, b) | B(c), d) | B(e)) = Y;
95103
| |
96104
| variable not in all patterns
97105

106+
error[E0408]: variable `e` is not bound in all patterns
107+
--> $DIR/missing-bindings.rs:45:10
108+
|
109+
LL | let (A(A(a, b) | B(c), d) | B(e)) = Y;
110+
| ^^^^^^^^^^^^^^^^^^^^ - variable not in all patterns
111+
| |
112+
| pattern doesn't bind `e`
113+
98114
error[E0408]: variable `b` is not bound in all patterns
99-
--> $DIR/missing-bindings.rs:45:22
115+
--> $DIR/missing-bindings.rs:45:33
100116
|
101117
LL | let (A(A(a, b) | B(c), d) | B(e)) = Y;
102-
| - ^^^^ pattern doesn't bind `b`
118+
| - ^^^^ pattern doesn't bind `b`
103119
| |
104120
| variable not in all patterns
105121

@@ -119,14 +135,6 @@ LL | let (A(A(a, b) | B(c), d) | B(e)) = Y;
119135
| |
120136
| variable not in all patterns
121137

122-
error[E0408]: variable `e` is not bound in all patterns
123-
--> $DIR/missing-bindings.rs:45:10
124-
|
125-
LL | let (A(A(a, b) | B(c), d) | B(e)) = Y;
126-
| ^^^^^^^^^^^^^^^^^^^^ - variable not in all patterns
127-
| |
128-
| pattern doesn't bind `e`
129-
130138
error[E0408]: variable `a` is not bound in all patterns
131139
--> $DIR/missing-bindings.rs:45:33
132140
|
@@ -135,14 +143,6 @@ LL | let (A(A(a, b) | B(c), d) | B(e)) = Y;
135143
| |
136144
| variable not in all patterns
137145

138-
error[E0408]: variable `b` is not bound in all patterns
139-
--> $DIR/missing-bindings.rs:45:33
140-
|
141-
LL | let (A(A(a, b) | B(c), d) | B(e)) = Y;
142-
| - ^^^^ pattern doesn't bind `b`
143-
| |
144-
| variable not in all patterns
145-
146146
error[E0408]: variable `a` is not bound in all patterns
147147
--> $DIR/missing-bindings.rs:61:29
148148
|
@@ -151,6 +151,14 @@ LL | Ok(a) | Err(_),
151151
| |
152152
| variable not in all patterns
153153

154+
error[E0408]: variable `b` is not bound in all patterns
155+
--> $DIR/missing-bindings.rs:68:21
156+
|
157+
LL | A(_, a) |
158+
| ^^^^^^^ pattern doesn't bind `b`
159+
LL | B(b),
160+
| - variable not in all patterns
161+
154162
error[E0408]: variable `a` is not bound in all patterns
155163
--> $DIR/missing-bindings.rs:69:21
156164
|
@@ -160,12 +168,13 @@ LL | B(b),
160168
| ^^^^ pattern doesn't bind `a`
161169

162170
error[E0408]: variable `b` is not bound in all patterns
163-
--> $DIR/missing-bindings.rs:68:21
171+
--> $DIR/missing-bindings.rs:72:17
164172
|
165-
LL | A(_, a) |
166-
| ^^^^^^^ pattern doesn't bind `b`
167173
LL | B(b),
168174
| - variable not in all patterns
175+
...
176+
LL | B(_)
177+
| ^^^^ pattern doesn't bind `b`
169178

170179
error[E0408]: variable `a` is not bound in all patterns
171180
--> $DIR/missing-bindings.rs:72:17
@@ -177,13 +186,22 @@ LL | B(_)
177186
| ^^^^ pattern doesn't bind `a`
178187

179188
error[E0408]: variable `b` is not bound in all patterns
180-
--> $DIR/missing-bindings.rs:72:17
189+
--> $DIR/missing-bindings.rs:57:13
181190
|
182-
LL | B(b),
183-
| - variable not in all patterns
191+
LL | / V1(
192+
LL | |
193+
LL | |
194+
LL | | A(
195+
... |
196+
LL | | B(Ok(a) | Err(a))
197+
LL | | ) |
198+
| |_____________^ pattern doesn't bind `b`
184199
...
185-
LL | B(_)
186-
| ^^^^ pattern doesn't bind `b`
200+
LL | B(b),
201+
| - variable not in all patterns
202+
...
203+
LL | V3(c),
204+
| ^^^^^ pattern doesn't bind `b`
187205

188206
error[E0408]: variable `c` is not bound in all patterns
189207
--> $DIR/missing-bindings.rs:57:13
@@ -219,24 +237,6 @@ LL | A(_, a) |
219237
LL | V3(c),
220238
| ^^^^^ pattern doesn't bind `a`
221239

222-
error[E0408]: variable `b` is not bound in all patterns
223-
--> $DIR/missing-bindings.rs:57:13
224-
|
225-
LL | / V1(
226-
LL | |
227-
LL | |
228-
LL | | A(
229-
... |
230-
LL | | B(Ok(a) | Err(a))
231-
LL | | ) |
232-
| |_____________^ pattern doesn't bind `b`
233-
...
234-
LL | B(b),
235-
| - variable not in all patterns
236-
...
237-
LL | V3(c),
238-
| ^^^^^ pattern doesn't bind `b`
239-
240240
error: aborting due to 26 previous errors
241241

242242
For more information about this error, try `rustc --explain E0408`.

‎tests/ui/resolve/resolve-inconsistent-names.stderr

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
1-
error[E0408]: variable `a` is not bound in all patterns
2-
--> $DIR/resolve-inconsistent-names.rs:13:12
3-
|
4-
LL | a | b => {}
5-
| - ^ pattern doesn't bind `a`
6-
| |
7-
| variable not in all patterns
8-
91
error[E0408]: variable `b` is not bound in all patterns
102
--> $DIR/resolve-inconsistent-names.rs:13:8
113
|
@@ -14,6 +6,14 @@ LL | a | b => {}
146
| |
157
| pattern doesn't bind `b`
168

9+
error[E0408]: variable `a` is not bound in all patterns
10+
--> $DIR/resolve-inconsistent-names.rs:13:12
11+
|
12+
LL | a | b => {}
13+
| - ^ pattern doesn't bind `a`
14+
| |
15+
| variable not in all patterns
16+
1717
error[E0408]: variable `c` is not bound in all patterns
1818
--> $DIR/resolve-inconsistent-names.rs:19:9
1919
|
@@ -54,6 +54,19 @@ LL | (A, B) | (ref B, c) | (c, A) => ()
5454
| |
5555
| first binding
5656

57+
error[E0408]: variable `Const2` is not bound in all patterns
58+
--> $DIR/resolve-inconsistent-names.rs:31:9
59+
|
60+
LL | (CONST1, _) | (_, Const2) => ()
61+
| ^^^^^^^^^^^ ------ variable not in all patterns
62+
| |
63+
| pattern doesn't bind `Const2`
64+
|
65+
help: if you meant to match on constant `m::Const2`, use the full path in the pattern
66+
|
67+
LL | (CONST1, _) | (_, m::Const2) => ()
68+
| ~~~~~~~~~
69+
5770
error[E0408]: variable `CONST1` is not bound in all patterns
5871
--> $DIR/resolve-inconsistent-names.rs:31:23
5972
|
@@ -68,19 +81,6 @@ note: you might have meant to match on constant `m::CONST1`, which exists but is
6881
LL | const CONST1: usize = 10;
6982
| ^^^^^^^^^^^^^^^^^^^^^^^^^ not accessible
7083

71-
error[E0408]: variable `Const2` is not bound in all patterns
72-
--> $DIR/resolve-inconsistent-names.rs:31:9
73-
|
74-
LL | (CONST1, _) | (_, Const2) => ()
75-
| ^^^^^^^^^^^ ------ variable not in all patterns
76-
| |
77-
| pattern doesn't bind `Const2`
78-
|
79-
help: if you meant to match on constant `m::Const2`, use the full path in the pattern
80-
|
81-
LL | (CONST1, _) | (_, m::Const2) => ()
82-
| ~~~~~~~~~
83-
8484
error[E0308]: mismatched types
8585
--> $DIR/resolve-inconsistent-names.rs:19:19
8686
|

‎tests/ui/span/issue-39698.stderr

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
error[E0408]: variable `b` is not bound in all patterns
2+
--> $DIR/issue-39698.rs:10:9
3+
|
4+
LL | T::T1(a, d) | T::T2(d, b) | T::T3(c) | T::T4(a) => { println!("{:?}", a); }
5+
| ^^^^^^^^^^^ - ^^^^^^^^ ^^^^^^^^ pattern doesn't bind `b`
6+
| | | |
7+
| | | pattern doesn't bind `b`
8+
| | variable not in all patterns
9+
| pattern doesn't bind `b`
10+
111
error[E0408]: variable `c` is not bound in all patterns
212
--> $DIR/issue-39698.rs:10:9
313
|
@@ -8,16 +18,6 @@ LL | T::T1(a, d) | T::T2(d, b) | T::T3(c) | T::T4(a) => { println!("{:?}
818
| | pattern doesn't bind `c`
919
| pattern doesn't bind `c`
1020

11-
error[E0408]: variable `d` is not bound in all patterns
12-
--> $DIR/issue-39698.rs:10:37
13-
|
14-
LL | T::T1(a, d) | T::T2(d, b) | T::T3(c) | T::T4(a) => { println!("{:?}", a); }
15-
| - - ^^^^^^^^ ^^^^^^^^ pattern doesn't bind `d`
16-
| | | |
17-
| | | pattern doesn't bind `d`
18-
| | variable not in all patterns
19-
| variable not in all patterns
20-
2121
error[E0408]: variable `a` is not bound in all patterns
2222
--> $DIR/issue-39698.rs:10:23
2323
|
@@ -28,15 +28,15 @@ LL | T::T1(a, d) | T::T2(d, b) | T::T3(c) | T::T4(a) => { println!("{:?}
2828
| | pattern doesn't bind `a`
2929
| variable not in all patterns
3030

31-
error[E0408]: variable `b` is not bound in all patterns
32-
--> $DIR/issue-39698.rs:10:9
31+
error[E0408]: variable `d` is not bound in all patterns
32+
--> $DIR/issue-39698.rs:10:37
3333
|
3434
LL | T::T1(a, d) | T::T2(d, b) | T::T3(c) | T::T4(a) => { println!("{:?}", a); }
35-
| ^^^^^^^^^^^ - ^^^^^^^^ ^^^^^^^^ pattern doesn't bind `b`
36-
| | | |
37-
| | | pattern doesn't bind `b`
38-
| | variable not in all patterns
39-
| pattern doesn't bind `b`
35+
| - - ^^^^^^^^ ^^^^^^^^ pattern doesn't bind `d`
36+
| | | |
37+
| | | pattern doesn't bind `d`
38+
| | variable not in all patterns
39+
| variable not in all patterns
4040

4141
error: aborting due to 4 previous errors
4242

0 commit comments

Comments
 (0)
This repository has been archived.