Commit b215a3e0b6
Changed files (2)
src
test
src/analyze.cpp
@@ -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:
test/run_tests.cpp
@@ -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");
}