@@ -1413,15 +1413,17 @@ fn check_enum<'tcx>(
1413
1413
Some ( ref expr) => tcx. hir ( ) . span ( expr. hir_id ) ,
1414
1414
None => v. span ,
1415
1415
} ;
1416
+ let display_discr = display_discriminant_value ( tcx, v, discr. val ) ;
1417
+ let display_discr_i = display_discriminant_value ( tcx, variant_i, disr_vals[ i] . val ) ;
1416
1418
struct_span_err ! (
1417
1419
tcx. sess,
1418
1420
span,
1419
1421
E0081 ,
1420
1422
"discriminant value `{}` already exists" ,
1421
- disr_vals [ i ]
1423
+ discr . val ,
1422
1424
)
1423
- . span_label ( i_span, format ! ( "first use of `{}` " , disr_vals [ i ] ) )
1424
- . span_label ( span, format ! ( "enum already has `{}` " , disr_vals [ i ] ) )
1425
+ . span_label ( i_span, format ! ( "first use of {} " , display_discr_i ) )
1426
+ . span_label ( span, format ! ( "enum already has {} " , display_discr ) )
1425
1427
. emit ( ) ;
1426
1428
}
1427
1429
disr_vals. push ( discr) ;
@@ -1431,6 +1433,25 @@ fn check_enum<'tcx>(
1431
1433
check_transparent ( tcx, sp, def) ;
1432
1434
}
1433
1435
1436
+ /// Format an enum discriminant value for use in a diagnostic message.
1437
+ fn display_discriminant_value < ' tcx > (
1438
+ tcx : TyCtxt < ' tcx > ,
1439
+ variant : & hir:: Variant < ' _ > ,
1440
+ evaluated : u128 ,
1441
+ ) -> String {
1442
+ if let Some ( expr) = & variant. disr_expr {
1443
+ let body = & tcx. hir ( ) . body ( expr. body ) . value ;
1444
+ if let hir:: ExprKind :: Lit ( lit) = & body. kind {
1445
+ if let rustc_ast:: LitKind :: Int ( lit_value, _int_kind) = & lit. node {
1446
+ if evaluated != * lit_value {
1447
+ return format ! ( "`{}` (overflowed from `{}`)" , evaluated, lit_value) ;
1448
+ }
1449
+ }
1450
+ }
1451
+ }
1452
+ format ! ( "`{}`" , evaluated)
1453
+ }
1454
+
1434
1455
pub ( super ) fn check_type_params_are_used < ' tcx > (
1435
1456
tcx : TyCtxt < ' tcx > ,
1436
1457
generics : & ty:: Generics ,
0 commit comments