authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-01-13 21:45:16+01:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-01-13 21:45:16+01:00
log84930fec279a8bf0e7ce79c79a7ccd98d1ef4d0d
tree636e34f14e1ef183e0f5c51e78ef752be93663c4
parentb9f37ffe19e30da1fd79cd01dbb6191ec2733b5c

Validate switch range endpoints


2 files changed, 26 insertions(+), 0 deletions(-)

src/ir.cpp+12
...@@ -26394,6 +26394,7 @@ static IrInstruction *ir_analyze_instruction_check_switch_prongs(IrAnalyze *ira,...@@ -26394,6 +26394,7 @@ static IrInstruction *ir_analyze_instruction_check_switch_prongs(IrAnalyze *ira,
26394 if (type_is_invalid(end_value->value->type))26394 if (type_is_invalid(end_value->value->type))
26395 return ira->codegen->invalid_instruction;26395 return ira->codegen->invalid_instruction;
2639626396
26397 assert(start_value->value->type->id == ZigTypeIdEnum);
26397 BigInt start_index;26398 BigInt start_index;
26398 bigint_init_bigint(&start_index, &start_value->value->data.x_enum_tag);26399 bigint_init_bigint(&start_index, &start_value->value->data.x_enum_tag);
2639926400
...@@ -26401,6 +26402,11 @@ static IrInstruction *ir_analyze_instruction_check_switch_prongs(IrAnalyze *ira,...@@ -26401,6 +26402,11 @@ static IrInstruction *ir_analyze_instruction_check_switch_prongs(IrAnalyze *ira,
26401 BigInt end_index;26402 BigInt end_index;
26402 bigint_init_bigint(&end_index, &end_value->value->data.x_enum_tag);26403 bigint_init_bigint(&end_index, &end_value->value->data.x_enum_tag);
2640326404
26405 if (bigint_cmp(&start_index, &end_index) == CmpGT) {
26406 ir_add_error(ira, start_value,
26407 buf_sprintf("range start value is greater than the end value"));
26408 }
26409
26404 BigInt field_index;26410 BigInt field_index;
26405 bigint_init_bigint(&field_index, &start_index);26411 bigint_init_bigint(&field_index, &start_index);
26406 for (;;) {26412 for (;;) {
...@@ -26530,6 +26536,12 @@ static IrInstruction *ir_analyze_instruction_check_switch_prongs(IrAnalyze *ira,...@@ -26530,6 +26536,12 @@ static IrInstruction *ir_analyze_instruction_check_switch_prongs(IrAnalyze *ira,
2653026536
26531 assert(start_val->type->id == ZigTypeIdInt || start_val->type->id == ZigTypeIdComptimeInt);26537 assert(start_val->type->id == ZigTypeIdInt || start_val->type->id == ZigTypeIdComptimeInt);
26532 assert(end_val->type->id == ZigTypeIdInt || end_val->type->id == ZigTypeIdComptimeInt);26538 assert(end_val->type->id == ZigTypeIdInt || end_val->type->id == ZigTypeIdComptimeInt);
26539
26540 if (bigint_cmp(&start_val->data.x_bigint, &end_val->data.x_bigint) == CmpGT) {
26541 ir_add_error(ira, start_value,
26542 buf_sprintf("range start value is greater than the end value"));
26543 }
26544
26533 AstNode *prev_node = rangeset_add_range(&rs, &start_val->data.x_bigint, &end_val->data.x_bigint,26545 AstNode *prev_node = rangeset_add_range(&rs, &start_val->data.x_bigint, &end_val->data.x_bigint,
26534 start_value->source_node);26546 start_value->source_node);
26535 if (prev_node != nullptr) {26547 if (prev_node != nullptr) {
test/compile_errors.zig+14
...@@ -2,6 +2,20 @@ const tests = @import("tests.zig");...@@ -2,6 +2,20 @@ const tests = @import("tests.zig");
2const builtin = @import("builtin");2const builtin = @import("builtin");
33
4pub fn addCases(cases: *tests.CompileErrorContext) void {4pub fn addCases(cases: *tests.CompileErrorContext) void {
5 cases.addTest("switch ranges endpoints are validated",
6 \\pub export fn entry() void {
7 \\ var x: i32 = 0;
8 \\ switch (x) {
9 \\ 6...1 => {},
10 \\ -1...-5 => {},
11 \\ else => unreachable,
12 \\ }
13 \\}
14 , &[_][]const u8{
15 "tmp.zig:4:9: error: range start value is greater than the end value",
16 "tmp.zig:5:9: error: range start value is greater than the end value",
17 });
18
5 cases.addTest("errors in for loop bodies are propagated",19 cases.addTest("errors in for loop bodies are propagated",
6 \\pub export fn entry() void {20 \\pub export fn entry() void {
7 \\ var arr: [100]u8 = undefined;21 \\ var arr: [100]u8 = undefined;