aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2019-10-27 10:35:35 +0000
committergingerBill <bill@gingerbill.org>2019-10-27 10:35:35 +0000
commit5e81fc72b97dc3a27fee3ea1e0ae9bffab56e8d5 (patch)
tree4292243fdadcc553934f735c5af112d2a88d1ea2 /src
parent0977ac111a48283ac9784ad9ebb3f18f9db6fd74 (diff)
New `package math` and `package math/linalg`
Diffstat (limited to 'src')
-rw-r--r--src/check_expr.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 3c4d737a4..a3b8befa9 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -3344,7 +3344,7 @@ BuiltinTypeIsProc *builtin_type_is_procs[BuiltinProc__type_end - BuiltinProc__ty
-bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 id) {
+bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 id, Type *type_hint) {
ast_node(ce, CallExpr, call);
if (ce->inlining != ProcInlining_none) {
error(call, "Inlining operators are not allowed on built-in procedures");
@@ -3882,6 +3882,10 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
}
operand->mode = Addressing_Value;
+ if (type_hint != nullptr && check_is_castable_to(c, operand, type_hint)) {
+ operand->type = type_hint;
+ }
+
break;
}
@@ -3945,6 +3949,10 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
default: GB_PANIC("Invalid type"); break;
}
+ if (type_hint != nullptr && check_is_castable_to(c, operand, type_hint)) {
+ operand->type = type_hint;
+ }
+
break;
}
@@ -4033,6 +4041,10 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
default: GB_PANIC("Invalid type"); break;
}
+ if (type_hint != nullptr && check_is_castable_to(c, operand, type_hint)) {
+ operand->type = type_hint;
+ }
+
break;
}
@@ -4087,6 +4099,10 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
default: GB_PANIC("Invalid type"); break;
}
+ if (type_hint != nullptr && check_is_castable_to(c, operand, type_hint)) {
+ operand->type = type_hint;
+ }
+
break;
}
@@ -4134,6 +4150,10 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
default: GB_PANIC("Invalid type"); break;
}
+ if (type_hint != nullptr && check_is_castable_to(c, operand, type_hint)) {
+ operand->type = type_hint;
+ }
+
break;
}
@@ -6363,7 +6383,7 @@ CallArgumentError check_polymorphic_record_type(CheckerContext *c, Operand *oper
-ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *call) {
+ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *call, Type *type_hint) {
ast_node(ce, CallExpr, call);
if (ce->proc != nullptr &&
ce->proc->kind == Ast_BasicDirective) {
@@ -6470,7 +6490,7 @@ ExprKind check_call_expr(CheckerContext *c, Operand *operand, Ast *call) {
if (operand->mode == Addressing_Builtin) {
i32 id = operand->builtin_id;
- if (!check_builtin_procedure(c, operand, call, id)) {
+ if (!check_builtin_procedure(c, operand, call, id, type_hint)) {
operand->mode = Addressing_Invalid;
}
operand->expr = call;
@@ -7930,7 +7950,7 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
case_ast_node(ce, CallExpr, node);
- return check_call_expr(c, o, node);
+ return check_call_expr(c, o, node, type_hint);
case_end;
case_ast_node(de, DerefExpr, node);