@@ -8,6 +8,7 @@ use rustc_index::Idx;
88use rustc_middle:: bug;
99use rustc_middle:: ty:: layout:: { LayoutError , SizeSkeleton } ;
1010use rustc_middle:: ty:: { self , Ty , TyCtxt , Unnormalized } ;
11+ use rustc_span:: ErrorGuaranteed ;
1112use rustc_span:: def_id:: LocalDefId ;
1213use tracing:: trace;
1314
@@ -72,7 +73,7 @@ fn check_transmute<'tcx>(
7273 from : Ty < ' tcx > ,
7374 to : Ty < ' tcx > ,
7475 hir_id : HirId ,
75- ) {
76+ ) -> Result < ( ) , ErrorGuaranteed > {
7677 let span = tcx. hir_span ( hir_id) ;
7778 let normalize = |ty| {
7879 if let Ok ( ty) = tcx. try_normalize_erasing_regions ( typing_env, Unnormalized :: new_wip ( ty) ) {
@@ -92,7 +93,7 @@ fn check_transmute<'tcx>(
9293
9394 // Transmutes that are only changing lifetimes are always ok.
9495 if from == to {
95- return ;
96+ return Ok ( ( ) ) ;
9697 }
9798
9899 let sk_from = SizeSkeleton :: compute ( from, tcx, typing_env, span) ;
@@ -104,7 +105,7 @@ fn check_transmute<'tcx>(
104105 && let Ok ( sk_to) = sk_to
105106 {
106107 if sk_from. same_size ( sk_to) {
107- return ;
108+ return Ok ( ( ) ) ;
108109 }
109110
110111 // Special-case transmuting from `typeof(function)` and
@@ -119,7 +120,7 @@ fn check_transmute<'tcx>(
119120 . with_note ( format ! ( "target type: {to}" ) )
120121 . with_help ( "cast with `as` to a pointer instead" )
121122 . emit ( ) ;
122- return ;
123+ return Ok ( ( ) ) ;
123124 }
124125 }
125126
@@ -131,21 +132,25 @@ fn check_transmute<'tcx>(
131132 ) ;
132133 if from == to {
133134 err. note ( format ! ( "`{from}` does not have a fixed size" ) ) ;
134- err. emit ( ) ;
135+ Err ( err. emit ( ) )
135136 } else {
136137 err. note ( format ! ( "source type: `{}` ({})" , from, skeleton_string( from, sk_from) ) ) ;
137138 err. note ( format ! ( "target type: `{}` ({})" , to, skeleton_string( to, sk_to) ) ) ;
138- err. emit ( ) ;
139+ Err ( err. emit ( ) )
139140 }
140141}
141142
142- pub ( crate ) fn check_transmutes ( tcx : TyCtxt < ' _ > , owner : LocalDefId ) {
143+ pub ( crate ) fn check_transmutes ( tcx : TyCtxt < ' _ > , owner : LocalDefId ) -> Result < ( ) , ErrorGuaranteed > {
143144 assert ! ( !tcx. is_typeck_child( owner. to_def_id( ) ) ) ;
144145 let typeck_results = tcx. typeck ( owner) ;
145- let None = typeck_results. tainted_by_errors else { return } ;
146+ if let Some ( e) = typeck_results. tainted_by_errors {
147+ return Err ( e) ;
148+ } ;
146149
147150 let typing_env = ty:: TypingEnv :: post_analysis ( tcx, owner) ;
151+ let mut result = Ok ( ( ) ) ;
148152 for & ( from, to, hir_id) in & typeck_results. transmutes_to_check {
149- check_transmute ( tcx, typing_env, from, to, hir_id) ;
153+ result = result . and ( check_transmute ( tcx, typing_env, from, to, hir_id) ) ;
150154 }
155+ result
151156}
0 commit comments