@@ -1472,15 +1472,17 @@ fn check_enum<'tcx>(
14721472 Some ( ref expr) => tcx. hir ( ) . span ( expr. hir_id ) ,
14731473 None => v. span ,
14741474 } ;
1475+ let display_discr = display_discriminant_value ( tcx, v, discr. val ) ;
1476+ let display_discr_i = display_discriminant_value ( tcx, variant_i, disr_vals[ i] . val ) ;
14751477 struct_span_err ! (
14761478 tcx. sess,
14771479 span,
14781480 E0081 ,
14791481 "discriminant value `{}` already exists" ,
1480- disr_vals [ i ]
1482+ discr . val ,
14811483 )
1482- . span_label ( i_span, format ! ( "first use of `{}` " , disr_vals [ i ] ) )
1483- . span_label ( span, format ! ( "enum already has `{}` " , disr_vals [ i ] ) )
1484+ . span_label ( i_span, format ! ( "first use of {} " , display_discr_i ) )
1485+ . span_label ( span, format ! ( "enum already has {} " , display_discr ) )
14841486 . emit ( ) ;
14851487 }
14861488 disr_vals. push ( discr) ;
@@ -1490,6 +1492,25 @@ fn check_enum<'tcx>(
14901492 check_transparent ( tcx, sp, def) ;
14911493}
14921494
1495+ /// Format an enum discriminant value for use in a diagnostic message.
1496+ fn display_discriminant_value < ' tcx > (
1497+ tcx : TyCtxt < ' tcx > ,
1498+ variant : & hir:: Variant < ' _ > ,
1499+ evaluated : u128 ,
1500+ ) -> String {
1501+ if let Some ( expr) = & variant. disr_expr {
1502+ let body = & tcx. hir ( ) . body ( expr. body ) . value ;
1503+ if let hir:: ExprKind :: Lit ( lit) = & body. kind {
1504+ if let rustc_ast:: LitKind :: Int ( lit_value, _int_kind) = & lit. node {
1505+ if evaluated != * lit_value {
1506+ return format ! ( "`{}` (overflowed from `{}`)" , evaluated, lit_value) ;
1507+ }
1508+ }
1509+ }
1510+ }
1511+ format ! ( "`{}`" , evaluated)
1512+ }
1513+
14931514pub ( super ) fn check_type_params_are_used < ' tcx > (
14941515 tcx : TyCtxt < ' tcx > ,
14951516 generics : & ty:: Generics ,
0 commit comments