add constant expression evaluation for negation
parent
a37bb4a4da
commit
b215a3e0b6
|
@ -3627,22 +3627,25 @@ static TypeTableEntry *analyze_prefix_op_expr(CodeGen *g, ImportTableEntry *impo
|
|||
expr_node);
|
||||
if (expr_type->id == TypeTableEntryIdInvalid) {
|
||||
return expr_type;
|
||||
} else if (expr_type->id == TypeTableEntryIdInt &&
|
||||
expr_type->data.integral.is_signed)
|
||||
} else if ((expr_type->id == TypeTableEntryIdInt &&
|
||||
expr_type->data.integral.is_signed) ||
|
||||
expr_type->id == TypeTableEntryIdFloat ||
|
||||
expr_type->id == TypeTableEntryIdNumLitInt ||
|
||||
expr_type->id == TypeTableEntryIdNumLitFloat)
|
||||
{
|
||||
return expr_type;
|
||||
} else if (expr_type->id == TypeTableEntryIdFloat) {
|
||||
return expr_type;
|
||||
} else if (expr_type->id == TypeTableEntryIdNumLitInt) {
|
||||
return expr_type;
|
||||
} else if (expr_type->id == TypeTableEntryIdNumLitFloat) {
|
||||
ConstExprValue *target_const_val = &get_resolved_expr(expr_node)->const_val;
|
||||
if (!target_const_val->ok) {
|
||||
return expr_type;
|
||||
}
|
||||
ConstExprValue *const_val = &get_resolved_expr(node)->const_val;
|
||||
const_val->ok = true;
|
||||
bignum_negate(&const_val->data.x_bignum, &target_const_val->data.x_bignum);
|
||||
return expr_type;
|
||||
} else {
|
||||
add_node_error(g, node, buf_sprintf("invalid negation type: '%s'",
|
||||
buf_ptr(&expr_type->name)));
|
||||
return g->builtin_types.entry_invalid;
|
||||
}
|
||||
// TODO const expr eval
|
||||
}
|
||||
case PrefixOpAddressOf:
|
||||
case PrefixOpConstAddressOf:
|
||||
|
|
|
@ -1286,6 +1286,28 @@ pub fn main(args: [][]u8) -> %void {
|
|||
%%stdout.printf("OK" ++ " IT " ++ "WORKED\n");
|
||||
}
|
||||
)SOURCE", "OK IT WORKED\n");
|
||||
|
||||
add_simple_case("constant struct with negation", R"SOURCE(
|
||||
import "std.zig";
|
||||
struct Vertex {
|
||||
x: f32,
|
||||
y: f32,
|
||||
r: f32,
|
||||
g: f32,
|
||||
b: f32,
|
||||
}
|
||||
const vertices = []Vertex {
|
||||
Vertex { .x = -0.6, .y = -0.4, .r = 1.0, .g = 0.0, .b = 0.0 },
|
||||
Vertex { .x = 0.6, .y = -0.4, .r = 0.0, .g = 1.0, .b = 0.0 },
|
||||
Vertex { .x = 0.0, .y = 0.6, .r = 0.0, .g = 0.0, .b = 1.0 },
|
||||
};
|
||||
pub fn main(args: [][]u8) -> %void {
|
||||
if (vertices[0].x != -0.6) {
|
||||
%%stdout.printf("BAD\n");
|
||||
}
|
||||
%%stdout.printf("OK\n");
|
||||
}
|
||||
)SOURCE", "OK\n");
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue