Pass 'noreturn_macro'

This commit is contained in:
David Gonzalez Martin 2025-06-17 19:47:27 -06:00
parent 62c9909d46
commit f48cd83c4e

View File

@ -9537,7 +9537,10 @@ resolve_type = fn (module: &Module, type: &Type) &Type
report_error(); report_error();
} }
}, },
.integer => .void,
.noreturn,
.integer,
=>
{ {
result = type; result = type;
}, },
@ -9563,6 +9566,14 @@ resolve_type = fn (module: &Module, type: &Type) &Type
return result; return result;
} }
BlockCopy = struct
{
source: &Block,
destination: &Block,
}
copy_block = fn (module: &Module, parent_scope: &Scope, copy: BlockCopy) void;
clone_value = fn (module: &Module, scope: &Scope, old_value: &Value) &Value clone_value = fn (module: &Module, scope: &Scope, old_value: &Value) &Value
{ {
assert(old_value != zero); assert(old_value != zero);
@ -9607,6 +9618,7 @@ clone_value = fn (module: &Module, scope: &Scope, old_value: &Value) &Value
}, },
}; };
}, },
.unreachable => {},
else => else =>
{ {
#trap(); #trap();
@ -9643,6 +9655,43 @@ clone_statement = fn (module: &Module, scope: &Scope, old_statement: &Statement)
.return = return_value, .return = return_value,
}; };
}, },
.if =>
{
>condition = clone_value(module, scope, old_statement.content.if.condition);
>if_statement = clone_statement(module, scope, old_statement.content.if.if);
>else_statement = old_statement.content.if.else;
if (else_statement)
{
else_statement = clone_statement(module, scope, else_statement);
}
new_statement.content = {
.if = {
.condition = condition,
.if = if_statement,
.else = else_statement,
},
};
},
.block =>
{
>block = arena_allocate[Block](module.arena, 1);
copy_block(module, scope, {
.source = old_statement.content.block,
.destination = block,
});
new_statement.content = {
.block = block,
};
},
.expression =>
{
>value = clone_value(module, scope, old_statement.content.expression);
new_statement.content = {
.expression = value,
};
},
else => else =>
{ {
#trap(); #trap();
@ -9652,12 +9701,6 @@ clone_statement = fn (module: &Module, scope: &Scope, old_statement: &Statement)
return new_statement; return new_statement;
} }
BlockCopy = struct
{
source: &Block,
destination: &Block,
}
copy_block = fn (module: &Module, parent_scope: &Scope, copy: BlockCopy) void copy_block = fn (module: &Module, parent_scope: &Scope, copy: BlockCopy) void
{ {
>source = copy.source; >source = copy.source;
@ -10049,6 +10092,7 @@ analyze_type = fn (module: &Module, value: &Value, expected_type: &Type, analysi
.ampersand, .ampersand,
.exclamation, .exclamation,
.va_end, .va_end,
.bitwise_not,
=> =>
{ {
>is_boolean = unary_is_boolean(unary_id); >is_boolean = unary_is_boolean(unary_id);
@ -13763,6 +13807,10 @@ emit_value = fn (module: &Module, value: &Value, type_kind: TypeKind, expect_con
LLVMSetInstructionCallConv(call, .fast); LLVMSetInstructionCallConv(call, .fast);
llvm_value = call; llvm_value = call;
}, },
.bitwise_not =>
{
llvm_value = LLVMBuildNot(module.llvm.builder, llvm_unary_value, "");
},
else => { #trap(); }, else => { #trap(); },
} }
}, },
@ -17174,6 +17222,7 @@ names: [_][]u8 =
"basic_macro", "basic_macro",
"generic_macro", "generic_macro",
"generic_pointer_macro", "generic_pointer_macro",
"noreturn_macro",
]; ];
[export] main = fn [cc(c)] (argument_count: u32, argv: &&u8, envp: &&u8) s32 [export] main = fn [cc(c)] (argument_count: u32, argv: &&u8, envp: &&u8) s32