aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2022-09-01 23:42:15 +0200
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2022-09-01 23:42:15 +0200
commit635c7fa153fc52d9ee575cc7a788996ac3f10193 (patch)
tree82246b126742ef84e8370c3a36bca0762a6cb6d3 /src
parent803fd8f037277b9242a3f10cd5d82ca754169735 (diff)
parentb7ac0a9e8d433f130bcb562db2ffa35657564665 (diff)
Merge branch 'master' into cmark
Diffstat (limited to 'src')
-rw-r--r--src/check_builtin.cpp7
-rw-r--r--src/check_expr.cpp5
-rw-r--r--src/llvm_backend_expr.cpp2
-rw-r--r--src/llvm_backend_proc.cpp5
-rw-r--r--src/llvm_backend_stmt.cpp14
5 files changed, 26 insertions, 7 deletions
diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp
index e55a2e024..6af1c3d44 100644
--- a/src/check_builtin.cpp
+++ b/src/check_builtin.cpp
@@ -341,6 +341,13 @@ bool check_builtin_objc_procedure(CheckerContext *c, Operand *operand, Ast *call
for (isize i = 2+arg_offset; i < ce->args.count; i++) {
Operand x = {};
check_expr(c, &x, ce->args[i]);
+ if (is_type_untyped(x.type)) {
+ gbString e = expr_to_string(x.expr);
+ gbString t = type_to_string(x.type);
+ error(x.expr, "'%.*s' expects typed parameters, got %s of type %s", LIT(builtin_name), e, t);
+ gb_string_free(t);
+ gb_string_free(e);
+ }
param_types[i-arg_offset] = x.type;
}
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index 9c2d20781..54dc081cf 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -8769,7 +8769,10 @@ ExprKind check_selector_call_expr(CheckerContext *c, Operand *o, Ast *node, Type
Ast *first_arg = x.expr->SelectorExpr.expr;
GB_ASSERT(first_arg != nullptr);
- first_arg->state_flags |= StateFlag_SelectorCallExpr;
+ Entity *e = entity_of_node(se->expr);
+ if (!(e != nullptr && (e->kind == Entity_Procedure || e->kind == Entity_ProcGroup))) {
+ first_arg->state_flags |= StateFlag_SelectorCallExpr;
+ }
Type *pt = base_type(x.type);
GB_ASSERT(pt->kind == Type_Proc);
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index 7d81d1407..023e7b363 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -1924,7 +1924,7 @@ lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
}
if (dst->Union.variants.count == 1) {
Type *vt = dst->Union.variants[0];
- if (internal_check_is_assignable_to(src, vt)) {
+ if (internal_check_is_assignable_to(src_type, vt)) {
value = lb_emit_conv(p, value, vt);
lbAddr parent = lb_add_local_generated(p, t, true);
lb_emit_store_union_variant(p, parent.addr, value, vt);
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index f85d8397c..d9f4e0c0d 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -2867,9 +2867,9 @@ lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) {
return y;
}
- Ast *pexpr = unparen_expr(ce->proc);
+ Ast *proc_expr = unparen_expr(ce->proc);
if (proc_mode == Addressing_Builtin) {
- Entity *e = entity_of_node(pexpr);
+ Entity *e = entity_of_node(proc_expr);
BuiltinProcId id = BuiltinProc_Invalid;
if (e != nullptr) {
id = cast(BuiltinProcId)e->Builtin.id;
@@ -2881,7 +2881,6 @@ lbValue lb_build_call_expr_internal(lbProcedure *p, Ast *expr) {
// NOTE(bill): Regular call
lbValue value = {};
- Ast *proc_expr = unparen_expr(ce->proc);
Entity *proc_entity = entity_of_node(proc_expr);
if (proc_entity != nullptr) {
diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp
index 175c4c537..a080fc09d 100644
--- a/src/llvm_backend_stmt.cpp
+++ b/src/llvm_backend_stmt.cpp
@@ -646,7 +646,7 @@ void lb_build_range_stmt_struct_soa(lbProcedure *p, AstRangeStmt *rs, Scope *sco
lbAddr array = lb_build_addr(p, expr);
- if (is_type_pointer(type_deref(lb_addr_type(array)))) {
+ if (is_type_pointer(lb_addr_type(array))) {
array = lb_addr(lb_addr_load(p, array));
}
lbValue count = lb_soa_struct_len(p, lb_addr_load(p, array));
@@ -1959,8 +1959,18 @@ void lb_build_assign_stmt(lbProcedure *p, AstAssignStmt *as) {
} else {
lbAddr lhs = lb_build_addr(p, as->lhs[0]);
lbValue value = lb_build_expr(p, as->rhs[0]);
-
Type *lhs_type = lb_addr_type(lhs);
+
+ // NOTE(bill): Allow for the weird edge case of:
+ // array *= matrix
+ if (op == Token_Mul && is_type_matrix(value.type) && is_type_array(lhs_type)) {
+ lbValue old_value = lb_addr_load(p, lhs);
+ Type *type = old_value.type;
+ lbValue new_value = lb_emit_vector_mul_matrix(p, old_value, value, type);
+ lb_addr_store(p, lhs, new_value);
+ return;
+ }
+
if (is_type_array(lhs_type)) {
lb_build_assign_stmt_array(p, op, lhs, value);
return;