Correct abs type behaviour for quaternions

This commit is contained in:
gingerBill
2021-12-31 22:54:12 +00:00
parent 9b5cfe2677
commit bdf66bb1e1
2 changed files with 17 additions and 3 deletions

View File

@@ -1858,7 +1858,14 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
f64 r = operand->value.value_complex->real;
f64 i = operand->value.value_complex->imag;
operand->value = exact_value_float(gb_sqrt(r*r + i*i));
break;
}
case ExactValue_Quaternion: {
f64 r = operand->value.value_quaternion->real;
f64 i = operand->value.value_quaternion->imag;
f64 j = operand->value.value_quaternion->jmag;
f64 k = operand->value.value_quaternion->kmag;
operand->value = exact_value_float(gb_sqrt(r*r + i*i + j*j + k*k));
break;
}
default:
@@ -1877,10 +1884,10 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
}
}
if (is_type_complex(operand->type)) {
if (is_type_complex_or_quaternion(operand->type)) {
operand->type = base_complex_elem_type(operand->type);
}
GB_ASSERT(!is_type_complex(operand->type));
GB_ASSERT(!is_type_complex_or_quaternion(operand->type));
break;
}

View File

@@ -1253,6 +1253,13 @@ bool is_type_quaternion(Type *t) {
}
return false;
}
bool is_type_complex_or_quaternion(Type *t) {
t = core_type(t);
if (t->kind == Type_Basic) {
return (t->Basic.flags & (BasicFlag_Complex|BasicFlag_Quaternion)) != 0;
}
return false;
}
bool is_type_f16(Type *t) {
t = core_type(t);
if (t->kind == Type_Basic) {