mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 23:58:50 +00:00
Allow for constants of compound types
This commit is contained in:
+7
-1
@@ -4,6 +4,12 @@
|
|||||||
#import "mem.odin"
|
#import "mem.odin"
|
||||||
#import "game.odin"
|
#import "game.odin"
|
||||||
|
|
||||||
|
Vec3 :: struct {
|
||||||
|
x, y, z: f32
|
||||||
|
}
|
||||||
|
|
||||||
main :: proc() {
|
main :: proc() {
|
||||||
|
v0 := V
|
||||||
|
v1 := V
|
||||||
|
v2 := V
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-8
@@ -379,8 +379,9 @@ void check_init_constant(Checker *c, Entity *e, Operand *operand) {
|
|||||||
if (operand->mode == Addressing_Invalid ||
|
if (operand->mode == Addressing_Invalid ||
|
||||||
operand->type == t_invalid ||
|
operand->type == t_invalid ||
|
||||||
e->type == t_invalid) {
|
e->type == t_invalid) {
|
||||||
if (e->type == NULL)
|
if (e->type == NULL) {
|
||||||
e->type = t_invalid;
|
e->type = t_invalid;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,21 +389,30 @@ void check_init_constant(Checker *c, Entity *e, Operand *operand) {
|
|||||||
// TODO(bill): better error
|
// TODO(bill): better error
|
||||||
error(ast_node_token(operand->expr),
|
error(ast_node_token(operand->expr),
|
||||||
"`%.*s` is not a constant", LIT(ast_node_token(operand->expr).string));
|
"`%.*s` is not a constant", LIT(ast_node_token(operand->expr).string));
|
||||||
if (e->type == NULL)
|
if (e->type == NULL) {
|
||||||
e->type = t_invalid;
|
e->type = t_invalid;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!is_type_constant_type(operand->type)) {
|
// if (!is_type_constant_type(operand->type)) {
|
||||||
// NOTE(bill): no need to free string as it's panicking
|
// gbString type_str = type_to_string(operand->type);
|
||||||
compiler_error("Type `%s` not constant!!!", type_to_string(operand->type));
|
// defer (gb_string_free(type_str));
|
||||||
}
|
// error(ast_node_token(operand->expr),
|
||||||
|
// "Invalid constant type: `%s`", type_str);
|
||||||
|
// if (e->type == NULL) {
|
||||||
|
// e->type = t_invalid;
|
||||||
|
// }
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
if (e->type == NULL) // NOTE(bill): type inference
|
if (e->type == NULL) { // NOTE(bill): type inference
|
||||||
e->type = operand->type;
|
e->type = operand->type;
|
||||||
|
}
|
||||||
|
|
||||||
check_assignment(c, operand, e->type, make_string("constant declaration"));
|
check_assignment(c, operand, e->type, make_string("constant declaration"));
|
||||||
if (operand->mode == Addressing_Invalid)
|
if (operand->mode == Addressing_Invalid) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
e->Constant.value = operand->value;
|
e->Constant.value = operand->value;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user