@@ -130,10 +130,13 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
130130
131131 // Each function (and each specialization) has its own type. Erase that type with a cast.
132132 let mut coerce = String :: from ( "fn(" ) ;
133+ let mut c_coerce = String :: from ( "fn(_, " ) ;
133134 for _ in intrinsic. arguments . iter ( ) . filter ( |a| !a. has_constraint ( ) ) {
134135 coerce += "_, " ;
136+ c_coerce += "_, " ;
135137 }
136138 coerce += ") -> _" ;
139+ c_coerce += ")" ;
137140
138141 if intrinsic
139142 . arguments
@@ -152,7 +155,7 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
152155 intrinsic. iter_specializations ( |imm_values| {
153156 writeln ! (
154157 w,
155- " (\" {const_args}\" , {intrinsic_name}::<{const_args}> as unsafe {coerce}, {intrinsic_name}_wrapper_{c_const_args} as unsafe extern \" C\" {coerce })," ,
158+ " (\" {const_args}\" , {intrinsic_name}::<{const_args}> as unsafe {coerce}, {intrinsic_name}_wrapper_{c_const_args} as unsafe extern \" C\" {c_coerce })," ,
156159 const_args = imm_values. iter( ) . join( "," ) ,
157160 c_const_args = imm_values. iter( ) . join( "_" ) ,
158161 )
@@ -191,8 +194,12 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
191194 " for i in 0..{passes} {{" ,
192195 " unsafe {{" ,
193196 "{loaded_args}" ,
194- " let __rust_return_value = rust({args});" ,
195- " let __c_return_value = c({args});" ,
197+ " let __rust_return_value = rust({rust_args});" ,
198+ "" ,
199+ " let mut __c_return_value = std::mem::MaybeUninit::uninit();" ,
200+ " c(__c_return_value.as_mut_ptr(){c_args});" ,
201+ " let __c_return_value = __c_return_value.assume_init();" ,
202+ "" ,
196203 " assert_eq!({cast_prefix}__rust_return_value{cast_suffix}, {cast_prefix}__c_return_value{cast_suffix}, \" {{id}}\" );" ,
197204 " }}" ,
198205 " }}" ,
@@ -201,7 +208,8 @@ fn generate_rust_test_loop<T: IntrinsicTypeDefinition>(
201208 loaded_args = intrinsic
202209 . arguments
203210 . load_values_rust( Indentation :: default ( ) . nest_by( 4 ) ) ,
204- args = intrinsic. arguments. as_call_param_rust( ) ,
211+ rust_args = intrinsic. arguments. as_call_param_rust( ) ,
212+ c_args = intrinsic. arguments. as_c_call_param_rust( ) ,
205213 passes = passes,
206214 cast_prefix = cast_prefix,
207215 cast_suffix = cast_suffix,
@@ -250,7 +258,7 @@ pub fn write_bindings_rust<T: IntrinsicTypeDefinition>(
250258 intrinsic. iter_specializations ( |imm_values| {
251259 writeln ! (
252260 w,
253- " fn {name}_wrapper{imm_arglist}({arglist}) -> {return_ty};" ,
261+ " fn {name}_wrapper{imm_arglist}(__dst: *mut {return_ty}{arglist}) ;" ,
254262 return_ty = intrinsic. results. rust_type( ) ,
255263 name = intrinsic. name,
256264 imm_arglist = imm_values
0 commit comments