From 264fc1e1f3006b3a9c6f25feab776ad6c7f32a25 Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Sat, 1 Oct 2016 00:02:00 +0100 Subject: [PATCH] Allow for constants of compound types --- code/demo.odin | 10 ++++++++-- src/checker/stmt.cpp | 26 ++++++++++++++++++-------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/code/demo.odin b/code/demo.odin index 57052d66d..5d188eee3 100644 --- a/code/demo.odin +++ b/code/demo.odin @@ -4,6 +4,12 @@ #import "mem.odin" #import "game.odin" -main :: proc() { - +Vec3 :: struct { + x, y, z: f32 +} + +main :: proc() { + v0 := V + v1 := V + v2 := V } diff --git a/src/checker/stmt.cpp b/src/checker/stmt.cpp index c1ca1858b..341a74c4f 100644 --- a/src/checker/stmt.cpp +++ b/src/checker/stmt.cpp @@ -379,8 +379,9 @@ void check_init_constant(Checker *c, Entity *e, Operand *operand) { if (operand->mode == Addressing_Invalid || operand->type == t_invalid || e->type == t_invalid) { - if (e->type == NULL) + if (e->type == NULL) { e->type = t_invalid; + } return; } @@ -388,21 +389,30 @@ void check_init_constant(Checker *c, Entity *e, Operand *operand) { // TODO(bill): better error error(ast_node_token(operand->expr), "`%.*s` is not a constant", LIT(ast_node_token(operand->expr).string)); - if (e->type == NULL) + if (e->type == NULL) { e->type = t_invalid; + } return; } - if (!is_type_constant_type(operand->type)) { - // NOTE(bill): no need to free string as it's panicking - compiler_error("Type `%s` not constant!!!", type_to_string(operand->type)); - } + // if (!is_type_constant_type(operand->type)) { + // gbString type_str = 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; + } check_assignment(c, operand, e->type, make_string("constant declaration")); - if (operand->mode == Addressing_Invalid) + if (operand->mode == Addressing_Invalid) { return; + } e->Constant.value = operand->value; }