Skip to content

Commit 1a96a6d

Browse files
authored
Rollup merge of rust-lang#35486 - KiChjang:e0081-bonus, r=jonathandturner
Shrink span to variant discriminant expression for E0081 Part of rust-lang#35233. Extension of rust-lang#35353. Fixes rust-lang#35224. r? @jonathandturner
2 parents a8d123b + bd2bd6c commit 1a96a6d

File tree

3 files changed

+30
-17
lines changed

3 files changed

+30
-17
lines changed

src/librustc_typeck/check/mod.rs

+14-6
Original file line numberDiff line numberDiff line change
@@ -1272,13 +1272,21 @@ pub fn check_enum_variants<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>,
12721272

12731273
// Check for duplicate discriminant values
12741274
if let Some(i) = disr_vals.iter().position(|&x| x == current_disr_val) {
1275-
let mut err = struct_span_err!(ccx.tcx.sess, v.span, E0081,
1276-
"discriminant value `{}` already exists", disr_vals[i]);
12771275
let variant_i_node_id = ccx.tcx.map.as_local_node_id(variants[i].did).unwrap();
1278-
err.span_label(ccx.tcx.map.span(variant_i_node_id),
1279-
&format!("first use of `{}`", disr_vals[i]));
1280-
err.span_label(v.span , &format!("enum already has `{}`", disr_vals[i]));
1281-
err.emit();
1276+
let variant_i = ccx.tcx.map.expect_variant(variant_i_node_id);
1277+
let i_span = match variant_i.node.disr_expr {
1278+
Some(ref expr) => expr.span,
1279+
None => ccx.tcx.map.span(variant_i_node_id)
1280+
};
1281+
let span = match v.node.disr_expr {
1282+
Some(ref expr) => expr.span,
1283+
None => v.span
1284+
};
1285+
struct_span_err!(ccx.tcx.sess, span, E0081,
1286+
"discriminant value `{}` already exists", disr_vals[i])
1287+
.span_label(i_span, &format!("first use of `{}`", disr_vals[i]))
1288+
.span_label(span , &format!("enum already has `{}`", disr_vals[i]))
1289+
.emit();
12821290
}
12831291
disr_vals.push(current_disr_val);
12841292
}

src/test/compile-fail/E0081.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
// except according to those terms.
1010

1111
enum Enum {
12-
P = 3,
13-
X = 3, //~ ERROR E0081
12+
P = 3, //~ NOTE first use of `3isize`
13+
X = 3,
14+
//~^ ERROR discriminant value `3isize` already exists
15+
//~| NOTE enum already has `3isize`
1416
Y = 5
1517
}
1618

src/test/compile-fail/issue-15524.rs

+12-9
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,20 @@ const N: isize = 1;
1212

1313
enum Foo {
1414
A = 1,
15-
//~^ NOTE first use
16-
//~| NOTE first use
17-
//~| NOTE first use
18-
B = 1, //~ ERROR discriminant value
19-
//~^ NOTE enum already
15+
//~^ NOTE first use of `1isize`
16+
//~| NOTE first use of `1isize`
17+
//~| NOTE first use of `1isize`
18+
B = 1,
19+
//~^ ERROR discriminant value `1isize` already exists
20+
//~| NOTE enum already has `1isize`
2021
C = 0,
21-
D, //~ ERROR discriminant value
22-
//~^ NOTE enum already
22+
D,
23+
//~^ ERROR discriminant value `1isize` already exists
24+
//~| NOTE enum already has `1isize`
2325

24-
E = N, //~ ERROR discriminant value
25-
//~^ NOTE enum already
26+
E = N,
27+
//~^ ERROR discriminant value `1isize` already exists
28+
//~| NOTE enum already has `1isize`
2629

2730
}
2831

0 commit comments

Comments
 (0)