From 5d5e9a5e022a6ccae1bb5a60459663c6e2367ae3 Mon Sep 17 00:00:00 2001 From: ychenfo Date: Tue, 31 May 2022 23:05:39 +0800 Subject: [PATCH] nac3core: fix codegen error of inheritance --- nac3core/src/codegen/expr.rs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/nac3core/src/codegen/expr.rs b/nac3core/src/codegen/expr.rs index ff4a1292..368c4247 100644 --- a/nac3core/src/codegen/expr.rs +++ b/nac3core/src/codegen/expr.rs @@ -361,17 +361,31 @@ impl<'ctx, 'a> CodeGenContext<'ctx, 'a> { } } } - let params = if loc_params.is_empty() { - params - } else { - &loc_params - }; + let params = if loc_params.is_empty() { params } else { &loc_params }; + let params = fun + .get_type() + .get_param_types() + .into_iter() + .zip(params.iter()) + .map(|(ty, val)| match (ty, val.get_type()) { + (BasicTypeEnum::PointerType(arg_ty), BasicTypeEnum::PointerType(val_ty)) + if { + ty != val.get_type() + && arg_ty.get_element_type().is_struct_type() + && val_ty.get_element_type().is_struct_type() + } => + { + self.builder.build_bitcast(*val, arg_ty, "call_arg_cast") + } + _ => *val, + }) + .collect_vec(); let result = if let Some(target) = self.unwind_target { let current = self.builder.get_insert_block().unwrap().get_parent().unwrap(); let then_block = self.ctx.append_basic_block(current, &format!("after.{}", call_name)); let result = self .builder - .build_invoke(fun, params, then_block, target, call_name) + .build_invoke(fun, ¶ms, then_block, target, call_name) .try_as_basic_value() .left(); self.builder.position_at_end(then_block);