@@ -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,17 +194,19 @@ 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});" ,
196- " assert_eq!({cast_prefix}__rust_return_value{cast_suffix}, {cast_prefix}__c_return_value{cast_suffix}, \" {{id}}\" );" ,
197+ " let __rust_return_value = rust({rust_args});" ,
198+ " let mut __c_return_value = std::mem::MaybeUninit::uninit();" ,
199+ " c(__c_return_value.as_mut_ptr(){c_args});" ,
200+ " assert_eq!({cast_prefix}__rust_return_value{cast_suffix}, {cast_prefix}__c_return_value.assume_init(){cast_suffix}, \" {{id}}\" );" ,
197201 " }}" ,
198202 " }}" ,
199203 " }}" ,
200204 ) ,
201205 loaded_args = intrinsic
202206 . arguments
203207 . load_values_rust( Indentation :: default ( ) . nest_by( 4 ) ) ,
204- args = intrinsic. arguments. as_call_param_rust( ) ,
208+ rust_args = intrinsic. arguments. as_call_param_rust( ) ,
209+ c_args = intrinsic. arguments. as_c_call_param_rust( ) ,
205210 passes = passes,
206211 cast_prefix = cast_prefix,
207212 cast_suffix = cast_suffix,
@@ -250,7 +255,7 @@ pub fn write_bindings_rust<T: IntrinsicTypeDefinition>(
250255 intrinsic. iter_specializations ( |imm_values| {
251256 writeln ! (
252257 w,
253- " fn {name}_wrapper{imm_arglist}({arglist}) -> {return_ty};" ,
258+ " fn {name}_wrapper{imm_arglist}(dst: *mut {return_ty}{arglist}) ;" ,
254259 return_ty = intrinsic. results. rust_type( ) ,
255260 name = intrinsic. name,
256261 imm_arglist = imm_values
0 commit comments