@@ -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