Merge pull request #207 from birth-software/nested-if

Nested if
This commit is contained in:
David 2024-06-01 11:09:41 -06:00 committed by GitHub
commit 381ea47e39
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 42 additions and 5 deletions

View File

@ -749,6 +749,10 @@ const Parser = struct{
compare_unsigned_greater_equal, compare_unsigned_greater_equal,
compare_signed_greater, compare_signed_greater,
compare_signed_greater_equal, compare_signed_greater_equal,
compare_unsigned_less,
compare_unsigned_less_equal,
compare_signed_less,
compare_signed_less_equal,
}; };
fn parse_expression(parser: *Parser, analyzer: *Analyzer, thread: *Thread, file: *File, ty: ?*Type, side: Side) *Value { fn parse_expression(parser: *Parser, analyzer: *Analyzer, thread: *Thread, file: *File, ty: ?*Type, side: Side) *Value {
@ -778,10 +782,10 @@ const Parser = struct{
.none => { .none => {
previous_value = current_value; previous_value = current_value;
}, },
.compare_equal, .compare_unsigned_greater, .compare_unsigned_greater_equal, .compare_signed_greater, .compare_signed_greater_equal => { .compare_equal, .compare_unsigned_greater, .compare_unsigned_greater_equal, .compare_signed_greater, .compare_signed_greater_equal, .compare_unsigned_less, .compare_unsigned_less_equal, .compare_signed_less, .compare_signed_less_equal => {
switch (current_operation) { switch (current_operation) {
else => unreachable, else => unreachable,
inline .compare_equal, .compare_unsigned_greater, .compare_unsigned_greater_equal, .compare_signed_greater, .compare_signed_greater_equal => |co| { inline .compare_equal, .compare_unsigned_greater, .compare_unsigned_greater_equal, .compare_signed_greater, .compare_signed_greater_equal, .compare_unsigned_less, .compare_unsigned_less_equal, .compare_signed_less, .compare_signed_less_equal => |co| {
const string = @tagName(co)["compare_".len..]; const string = @tagName(co)["compare_".len..];
const comparison = @field(IntegerCompare.Id, string); const comparison = @field(IntegerCompare.Id, string);
const compare = thread.integer_compares.append(.{ const compare = thread.integer_compares.append(.{
@ -965,8 +969,12 @@ const Parser = struct{
parser.skip_space(src); parser.skip_space(src);
}, },
'<' => { '<' => {
// TODO const int_ty = it_ty orelse previous_value.get_type();
current_operation = undefined; const integer_type = int_ty.get_payload(.integer);
current_operation = switch (integer_type.signedness) {
.unsigned => .compare_unsigned_less,
.signed => .compare_signed_less,
};
parser.i += 1; parser.i += 1;
switch (src[parser.i]) { switch (src[parser.i]) {
@ -982,7 +990,10 @@ const Parser = struct{
else => {}, else => {},
} }
}, },
else => unreachable, '=' => {
unreachable;
},
else => {},
} }
parser.skip_space(src); parser.skip_space(src);
@ -1604,6 +1615,10 @@ const IntegerCompare = struct {
unsigned_greater_equal, unsigned_greater_equal,
signed_greater, signed_greater,
signed_greater_equal, signed_greater_equal,
unsigned_less,
unsigned_less_equal,
signed_less,
signed_less_equal,
equal, equal,
not_equal, not_equal,
not_zero, not_zero,
@ -2961,6 +2976,10 @@ fn worker_thread(thread_index: u32, cpu_count: *u32) void {
.unsigned_greater => .ugt, .unsigned_greater => .ugt,
.signed_greater_equal => .sge, .signed_greater_equal => .sge,
.signed_greater => .sgt, .signed_greater => .sgt,
.unsigned_less_equal => .uge,
.unsigned_less => .ugt,
.signed_less_equal => .sge,
.signed_less => .sgt,
}; };
const cmp = builder.createICmp(comparison, left, right, name, name.len); const cmp = builder.createICmp(comparison, left, right, name, name.len);

View File

@ -0,0 +1,18 @@
fn foo (arg: s32) s32 {
if (arg > 1) {
if (arg < 5) {
return 6;
} else {
return 5;
}
} else {
return 0;
}
}
fn[cc(.c)] main[export] () s32 {
>a = foo(5);
>b = foo(5);
return a - b;
}