@@ -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 }
0 commit comments