aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp52
1 files changed, 44 insertions, 8 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index f8efb0575..b2dd98fa9 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -33,7 +33,7 @@ typedef CALL_ARGUMENT_CHECKER(CallArgumentCheckerType);
void check_expr (Checker *c, Operand *operand, AstNode *expression);
void check_multi_expr (Checker *c, Operand *operand, AstNode *expression);
-void check_expr_or_type (Checker *c, Operand *operand, AstNode *expression);
+void check_expr_or_type (Checker *c, Operand *operand, AstNode *expression, Type *type_hint = NULL);
ExprKind check_expr_base (Checker *c, Operand *operand, AstNode *expression, Type *type_hint);
void check_expr_with_type_hint (Checker *c, Operand *o, AstNode *e, Type *t);
Type * check_type (Checker *c, AstNode *expression, Type *named_type = NULL);
@@ -1260,7 +1260,7 @@ Type *check_get_params(Checker *c, Scope *scope, AstNode *_params, bool *is_vari
success = false;
}
}
- if (type_expr->kind == AstNode_HelperType) {
+ if (type_expr->kind == AstNode_TypeType) {
is_type_param = true;
if (operands != NULL) {
detemine_type_from_operand = true;
@@ -1283,7 +1283,7 @@ Type *check_get_params(Checker *c, Scope *scope, AstNode *_params, bool *is_vari
}
if (default_value != NULL) {
- if (type_expr->kind == AstNode_HelperType) {
+ if (type_expr->kind == AstNode_TypeType) {
error(default_value, "A type parameter may not have a default value");
} else {
Operand o = {};
@@ -1817,7 +1817,16 @@ Entity *check_ident(Checker *c, Operand *o, AstNode *n, Type *named_type, Type *
bool is_overloaded = false;
isize overload_count = 0;
- HashKey key = hash_string(name);
+
+ bool is_alias = false;
+ while (e->kind == Entity_Alias) {
+ GB_ASSERT(e->Alias.base != NULL);
+ e = e->Alias.base;
+ is_alias = true;
+ }
+
+ HashKey key = hash_string(e->token.string);
+
if (e->kind == Entity_Procedure) {
// NOTE(bill): Overloads are only allowed with the same scope
@@ -2135,6 +2144,10 @@ bool check_type_internal(Checker *c, AstNode *e, Type **type, Type *named_type)
}
case_end;
+ case_ast_node(ht, HelperType, e);
+ return check_type_internal(c, ht->type, type, named_type);
+ case_end;
+
case_ast_node(pt, PolyType, e);
AstNode *ident = pt->type;
if (ident->kind != AstNode_Ident) {
@@ -6047,6 +6060,24 @@ ExprKind check_expr_base_internal(Checker *c, Operand *o, AstNode *node, Type *t
o->mode = Addressing_Value;
o->type = t_context;
break;
+
+ case Token_size_of:
+ o->mode = Addressing_Builtin;
+ o->builtin_id = BuiltinProc_size_of;
+ break;
+ case Token_align_of:
+ o->mode = Addressing_Builtin;
+ o->builtin_id = BuiltinProc_align_of;
+ break;
+ case Token_offset_of:
+ o->mode = Addressing_Builtin;
+ o->builtin_id = BuiltinProc_offset_of;
+ break;
+ case Token_type_of:
+ o->mode = Addressing_Builtin;
+ o->builtin_id = BuiltinProc_type_of;
+ break;
+
default:
error(node, "Illegal implicit name `%.*s`", LIT(i->string));
return kind;
@@ -6916,7 +6947,7 @@ ExprKind check_expr_base_internal(Checker *c, Operand *o, AstNode *node, Type *t
}
case_end;
- case AstNode_HelperType:
+ case AstNode_TypeType:
case AstNode_ProcType:
case AstNode_PointerType:
case AstNode_ArrayType:
@@ -7001,8 +7032,8 @@ void check_expr(Checker *c, Operand *o, AstNode *e) {
}
-void check_expr_or_type(Checker *c, Operand *o, AstNode *e) {
- check_expr_base(c, o, e, NULL);
+void check_expr_or_type(Checker *c, Operand *o, AstNode *e, Type *type_hint) {
+ check_expr_base(c, o, e, type_hint);
check_not_tuple(c, o);
error_operand_no_value(o);
}
@@ -7148,6 +7179,11 @@ gbString write_expr_to_string(gbString str, AstNode *node) {
str = write_expr_to_string(str, fv->value);
case_end;
+ case_ast_node(ht, HelperType, node);
+ str = gb_string_appendc(str, "#type ");
+ str = write_expr_to_string(str, ht->type);
+ case_end;
+
case_ast_node(pt, PointerType, node);
str = gb_string_appendc(str, "^");
str = write_expr_to_string(str, pt->type);
@@ -7271,7 +7307,7 @@ gbString write_expr_to_string(gbString str, AstNode *node) {
str = gb_string_appendc(str, ")");
case_end;
- case_ast_node(ht, HelperType, node);
+ case_ast_node(ht, TypeType, node);
str = gb_string_appendc(str, "type");
case_end;