diff --git a/src/analyze.cpp b/src/analyze.cpp index 27bda281c3..30fa52ef86 100644 --- a/src/analyze.cpp +++ b/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: diff --git a/test/run_tests.cpp b/test/run_tests.cpp index d02ffbecae..daf3fa4cc9 100644 --- a/test/run_tests.cpp +++ b/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"); }