@@ -1413,15 +1413,17 @@ fn check_enum<'tcx>(
14131413 Some ( ref expr) => tcx. hir ( ) . span ( expr. hir_id ) ,
14141414 None => v. span ,
14151415 } ;
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 ) ;
14161418 struct_span_err ! (
14171419 tcx. sess,
14181420 span,
14191421 E0081 ,
14201422 "discriminant value `{}` already exists" ,
1421- disr_vals [ i ]
1423+ discr . val ,
14221424 )
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 ) )
14251427 . emit ( ) ;
14261428 }
14271429 disr_vals. push ( discr) ;
@@ -1431,6 +1433,25 @@ fn check_enum<'tcx>(
14311433 check_transparent ( tcx, sp, def) ;
14321434}
14331435
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+
14341455pub ( super ) fn check_type_params_are_used < ' tcx > (
14351456 tcx : TyCtxt < ' tcx > ,
14361457 generics : & ty:: Generics ,
0 commit comments