core: Fix __inv__ for i8-based boolean operands

This commit is contained in:
David Mak 2024-04-12 15:35:36 +08:00
parent 8404d4c4dc
commit 00d1b9be9b
2 changed files with 14 additions and 1 deletions

View File

@ -1308,7 +1308,14 @@ pub fn gen_unaryop_expr_with_values<'ctx, G: CodeGenerator>(
let val = val.into_int_value();
match op {
ast::Unaryop::Invert | ast::Unaryop::Not => {
ctx.builder.build_not(val, "not").map(Into::into).unwrap()
let not = ctx.builder.build_not(val, "not").unwrap();
let not_bool = ctx.builder.build_and(
not,
not.get_type().const_int(1, false),
"",
).unwrap();
not_bool.into()
}
_ => val.into(),
}

View File

@ -455,6 +455,12 @@ def test_ndarray_inv():
output_ndarray_int32_2(x_int32)
output_ndarray_int32_2(y_int32)
x_bool = np_full([2, 2], True)
y_bool = ~x_bool
output_ndarray_bool_2(x_bool)
output_ndarray_bool_2(y_bool)
def test_ndarray_eq():
x = np_identity(2)
y = x == np_full([2, 2], 0.0)