diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2022-09-01 18:30:26 +0200 |
|---|---|---|
| committer | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2022-09-01 18:30:26 +0200 |
| commit | 01e8668357d0d7399b06a16157ca522f5c1385fa (patch) | |
| tree | 53cbdd701190928c5c1b96c159f463a48d373c76 /src | |
| parent | 0f3cebd2b7dee02368cbdb8f92e6fb21a5a91321 (diff) | |
| parent | 000861cba8ab5c966c60b3a3869d91e98ad09ddc (diff) | |
Merge branch 'master' into sysinfo
Diffstat (limited to 'src')
| -rw-r--r-- | src/check_builtin.cpp | 7 | ||||
| -rw-r--r-- | src/check_expr.cpp | 5 | ||||
| -rw-r--r-- | src/llvm_backend_expr.cpp | 2 | ||||
| -rw-r--r-- | src/llvm_backend_proc.cpp | 5 | ||||
| -rw-r--r-- | src/llvm_backend_stmt.cpp | 14 |
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; |