@@ -129,10 +129,13 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
129129
130130 // Each function (and each specialization) has its own type. Erase that type with a cast.
131131 let mut coerce = String :: from ( "fn(" ) ;
132+ let mut c_coerce = String :: from ( "fn(_, " ) ;
132133 for _ in intrinsic. arguments . iter ( ) . filter ( |a| !a. has_constraint ( ) ) {
133134 coerce += "_, " ;
135+ c_coerce += "_, " ;
134136 }
135137 coerce += ") -> _" ;
138+ c_coerce += ")" ;
136139
137140 if intrinsic
138141 . arguments
@@ -151,7 +154,7 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
151154 intrinsic. iter_specializations ( |imm_values| {
152155 writeln ! (
153156 w,
154- " (\" {const_args}\" , {intrinsic_name}::<{const_args}> as unsafe {coerce}, {intrinsic_name}_wrapper_{c_const_args} as unsafe extern \" C\" {coerce })," ,
157+ " (\" {const_args}\" , {intrinsic_name}::<{const_args}> as unsafe {coerce}, {intrinsic_name}_wrapper_{c_const_args} as unsafe extern \" C\" {c_coerce })," ,
155158 const_args = imm_values. iter( ) . join( "," ) ,
156159 c_const_args = imm_values. iter( ) . join( "_" ) ,
157160 )
@@ -190,8 +193,12 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
190193 " for i in 0..{passes} {{" ,
191194 " unsafe {{" ,
192195 "{loaded_args}" ,
193- " let __rust_return_value = rust({args});" ,
194- " let __c_return_value = c({args});" ,
196+ " let __rust_return_value = rust({rust_args});" ,
197+ "" ,
198+ " let mut __c_return_value = std::mem::MaybeUninit::uninit();" ,
199+ " c(__c_return_value.as_mut_ptr(){c_args});" ,
200+ " let __c_return_value = __c_return_value.assume_init();" ,
201+ "" ,
195202 " assert_eq!({cast_prefix}__rust_return_value{cast_suffix}, {cast_prefix}__c_return_value{cast_suffix}, \" {{id}}\" );" ,
196203 " }}" ,
197204 " }}" ,
@@ -200,7 +207,8 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
200207 loaded_args = intrinsic
201208 . arguments
202209 . load_values_rust( Indentation :: default ( ) . nest_by( 4 ) ) ,
203- args = intrinsic. arguments. as_call_param_rust( ) ,
210+ rust_args = intrinsic. arguments. as_call_param_rust( ) ,
211+ c_args = intrinsic. arguments. as_c_call_param_rust( ) ,
204212 passes = passes,
205213 cast_prefix = cast_prefix,
206214 cast_suffix = cast_suffix,
@@ -249,7 +257,7 @@ pub fn write_bindings_rust<T: IntrinsicTypeDefinition>(
249257 intrinsic. iter_specializations ( |imm_values| {
250258 writeln ! (
251259 w,
252- " fn {name}_wrapper{imm_arglist}({arglist}) -> {return_ty};" ,
260+ " fn {name}_wrapper{imm_arglist}(__dst: *mut {return_ty}{arglist}) ;" ,
253261 return_ty = intrinsic. results. rust_type( ) ,
254262 name = intrinsic. name,
255263 imm_arglist = imm_values
0 commit comments