@@ -136,10 +136,13 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
136136
137137 // Each function (and each specialization) has its own type. Erase that type with a cast.
138138 let mut coerce = String :: from ( "fn(" ) ;
139+ let mut c_coerce = String :: from ( "fn(_, " ) ;
139140 for _ in intrinsic. arguments . iter ( ) . filter ( |a| !a. has_constraint ( ) ) {
140141 coerce += "_, " ;
142+ c_coerce += "_, " ;
141143 }
142144 coerce += ") -> _" ;
145+ c_coerce += ")" ;
143146
144147 if intrinsic
145148 . arguments
@@ -158,7 +161,7 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
158161 intrinsic. iter_specializations ( |imm_values| {
159162 writeln ! (
160163 w,
161- " (\" {const_args}\" , {intrinsic_name}::<{const_args}> as unsafe {coerce}, {intrinsic_name}_wrapper_{c_const_args} as unsafe extern \" C\" {coerce })," ,
164+ " (\" {const_args}\" , {intrinsic_name}::<{const_args}> as unsafe {coerce}, {intrinsic_name}_wrapper_{c_const_args} as unsafe extern \" C\" {c_coerce })," ,
162165 const_args = imm_values. iter( ) . join( "," ) ,
163166 c_const_args = imm_values. iter( ) . join( "_" ) ,
164167 )
@@ -197,8 +200,12 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
197200 " for i in 0..{passes} {{" ,
198201 " unsafe {{" ,
199202 "{loaded_args}" ,
200- " let __rust_return_value = rust({args});" ,
201- " let __c_return_value = c({args});" ,
203+ " let __rust_return_value = rust({rust_args});" ,
204+ "" ,
205+ " let mut __c_return_value = std::mem::MaybeUninit::uninit();" ,
206+ " c(__c_return_value.as_mut_ptr(){c_args});" ,
207+ " let __c_return_value = __c_return_value.assume_init();" ,
208+ "" ,
202209 " assert_eq!({cast_prefix}__rust_return_value{cast_suffix}, {cast_prefix}__c_return_value{cast_suffix}, \" {{id}}\" );" ,
203210 " }}" ,
204211 " }}" ,
@@ -207,7 +214,8 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
207214 loaded_args = intrinsic
208215 . arguments
209216 . load_values_rust( Indentation :: default ( ) . nest_by( 4 ) ) ,
210- args = intrinsic. arguments. as_call_param_rust( ) ,
217+ rust_args = intrinsic. arguments. as_call_param_rust( ) ,
218+ c_args = intrinsic. arguments. as_c_call_param_rust( ) ,
211219 passes = passes,
212220 cast_prefix = cast_prefix,
213221 cast_suffix = cast_suffix,
@@ -256,7 +264,7 @@ pub fn write_bindings_rust<T: IntrinsicTypeDefinition>(
256264 intrinsic. iter_specializations ( |imm_values| {
257265 writeln ! (
258266 w,
259- " fn {name}_wrapper{imm_arglist}({arglist}) -> {return_ty};" ,
267+ " fn {name}_wrapper{imm_arglist}(__dst: *mut {return_ty}{arglist}) ;" ,
260268 return_ty = intrinsic. results. rust_type( ) ,
261269 name = intrinsic. name,
262270 imm_arglist = imm_values
0 commit comments