mirror of
https://github.com/odin-lang/Odin.git
synced 2026-01-02 11:12:31 +00:00
Remove useless error message for constant binary expressions with non-constant operations
This commit is contained in:
@@ -2764,31 +2764,27 @@ void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Type *type_hint
|
||||
ExactValue a = x->value;
|
||||
ExactValue b = y->value;
|
||||
|
||||
// Type *type = base_type(x->type);
|
||||
Type *type = x->type;
|
||||
if (is_type_pointer(type)) {
|
||||
GB_ASSERT(op.kind == Token_Sub);
|
||||
i64 bytes = a.value_pointer - b.value_pointer;
|
||||
i64 diff = bytes/type_size_of(type);
|
||||
x->value = exact_value_pointer(diff);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!is_type_constant_type(type)) {
|
||||
if (!is_type_constant_type(x->type)) {
|
||||
#if 0
|
||||
gbString xt = type_to_string(x->type);
|
||||
gbString err_str = expr_to_string(node);
|
||||
error(op, "Invalid type, '%s', for constant binary expression '%s'", xt, err_str);
|
||||
gb_string_free(err_str);
|
||||
gb_string_free(xt);
|
||||
x->mode = Addressing_Invalid;
|
||||
#else
|
||||
// NOTE(bill, 2021-04-21): The above is literally a useless error message.
|
||||
// Why did I add it in the first place?!
|
||||
x->mode = Addressing_Value;
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
if (op.kind == Token_Quo && is_type_integer(type)) {
|
||||
if (op.kind == Token_Quo && is_type_integer(x->type)) {
|
||||
op.kind = Token_QuoEq; // NOTE(bill): Hack to get division of integers
|
||||
}
|
||||
|
||||
if (is_type_bit_set(type)) {
|
||||
if (is_type_bit_set(x->type)) {
|
||||
switch (op.kind) {
|
||||
case Token_Add: op.kind = Token_Or; break;
|
||||
case Token_Sub: op.kind = Token_AndNot; break;
|
||||
@@ -2797,11 +2793,11 @@ void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Type *type_hint
|
||||
|
||||
x->value = exact_binary_operator_value(op.kind, a, b);
|
||||
|
||||
if (is_type_typed(type)) {
|
||||
if (is_type_typed(x->type)) {
|
||||
if (node != nullptr) {
|
||||
x->expr = node;
|
||||
}
|
||||
check_is_expressible(c, x, type);
|
||||
check_is_expressible(c, x, x->type);
|
||||
}
|
||||
return;
|
||||
} else if (is_type_string(x->type)) {
|
||||
|
||||
Reference in New Issue
Block a user