aboutsummaryrefslogtreecommitdiff
path: root/src/checker/expr.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-09-04 22:50:17 +0100
committerGinger Bill <bill@gingerbill.org>2016-09-04 22:50:17 +0100
commitae72b3c5bd80fad917a7e2d78d9945b9f19adb52 (patch)
treeab9709537749da05d33aa0888bc7e1aa3984ed03 /src/checker/expr.cpp
parentc2e3c3801acd8af32fcf6ea3ad2d3a2ddc94c870 (diff)
Tagged unions memory layout change; begin demo 002
Diffstat (limited to 'src/checker/expr.cpp')
-rw-r--r--src/checker/expr.cpp57
1 files changed, 34 insertions, 23 deletions
diff --git a/src/checker/expr.cpp b/src/checker/expr.cpp
index a3ffd6ccc..eff3852ac 100644
--- a/src/checker/expr.cpp
+++ b/src/checker/expr.cpp
@@ -1934,9 +1934,11 @@ b32 check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id)
switch (id) {
case BuiltinProc_new: {
// new :: proc(Type) -> ^Type
- Type *type = check_type(c, ce->arg_list);
- if (type == NULL || type == t_invalid) {
- error(&c->error_collector, ast_node_token(ce->arg_list), "Expected a type for `size_of`");
+ Operand op = {};
+ check_expr_or_type(c, &op, ce->arg_list);
+ Type *type = op.type;
+ if (op.mode != Addressing_Type && type == NULL || type == t_invalid) {
+ error(&c->error_collector, ast_node_token(ce->arg_list), "Expected a type for `new`");
return false;
}
operand->mode = Addressing_Value;
@@ -1944,16 +1946,17 @@ b32 check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id)
} break;
case BuiltinProc_new_slice: {
// new_slice :: proc(Type, len: int[, cap: int]) -> []Type
- Type *type = check_type(c, ce->arg_list);
- if (type == NULL || type == t_invalid) {
- error(&c->error_collector, ast_node_token(ce->arg_list), "Expected a type for `size_of`");
+ Operand op = {};
+ check_expr_or_type(c, &op, ce->arg_list);
+ Type *type = op.type;
+ if (op.mode != Addressing_Type && type == NULL || type == t_invalid) {
+ error(&c->error_collector, ast_node_token(ce->arg_list), "Expected a type for `new_slice`");
return false;
}
AstNode *len = ce->arg_list->next;
AstNode *cap = len->next;
- Operand op = {};
check_expr(c, &op, len);
if (op.mode == Addressing_Invalid)
return false;
@@ -1967,7 +1970,7 @@ b32 check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id)
}
if (cap != NULL) {
- check_expr(c, &op, len);
+ check_expr(c, &op, cap);
if (op.mode == Addressing_Invalid)
return false;
if (!is_type_integer(op.type)) {
@@ -2006,7 +2009,9 @@ b32 check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id)
case BuiltinProc_size_of: {
// size_of :: proc(Type) -> int
- Type *type = check_type(c, ce->arg_list);
+ Operand op = {};
+ check_expr_or_type(c, &op, ce->arg_list);
+ Type *type = op.type;
if (!type) {
error(&c->error_collector, ast_node_token(ce->arg_list), "Expected a type for `size_of`");
return false;
@@ -2031,7 +2036,9 @@ b32 check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id)
case BuiltinProc_align_of: {
// align_of :: proc(Type) -> int
- Type *type = check_type(c, ce->arg_list);
+ Operand op = {};
+ check_expr_or_type(c, &op, ce->arg_list);
+ Type *type = op.type;
if (!type) {
error(&c->error_collector, ast_node_token(ce->arg_list), "Expected a type for `align_of`");
return false;
@@ -2054,18 +2061,22 @@ b32 check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id)
case BuiltinProc_offset_of: {
// offset_val :: proc(Type, field) -> int
- Type *type = get_base_type(check_type(c, ce->arg_list));
+ Operand op = {};
+ check_expr_or_type(c, &op, ce->arg_list);
+ Type *type = get_base_type(op.type);
AstNode *field_arg = unparen_expr(ce->arg_list->next);
- if (type) {
- if (!is_type_struct(type)) {
- error(&c->error_collector, ast_node_token(ce->arg_list), "Expected a structure type for `offset_of`");
- return false;
- }
- if (field_arg == NULL ||
- field_arg->kind != AstNode_Ident) {
- error(&c->error_collector, ast_node_token(field_arg), "Expected an identifier for field argument");
- return false;
- }
+ if (type != NULL) {
+ error(&c->error_collector, ast_node_token(ce->arg_list), "Expected a type for `offset_of`");
+ return false;
+ }
+ if (!is_type_struct(type)) {
+ error(&c->error_collector, ast_node_token(ce->arg_list), "Expected a structure type for `offset_of`");
+ return false;
+ }
+ if (field_arg == NULL ||
+ field_arg->kind != AstNode_Ident) {
+ error(&c->error_collector, ast_node_token(field_arg), "Expected an identifier for field argument");
+ return false;
}
@@ -2145,7 +2156,7 @@ b32 check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id)
gbString str = expr_to_string(ce->arg_list);
defer (gb_string_free(str));
error(&c->error_collector, ast_node_token(call),
- "Static assertion: `%s`", str);
+ "Compile time assertion: `%s`", str);
return true;
}
if (operand->mode != Addressing_Constant) {
@@ -2468,7 +2479,7 @@ b32 check_builtin_procedure(Checker *c, Operand *operand, AstNode *call, i32 id)
}
if (cap != NULL) {
- check_expr(c, &op, len);
+ check_expr(c, &op, cap);
if (op.mode == Addressing_Invalid)
return false;
if (!is_type_integer(op.type)) {