diff --git a/core/math/linalg/general.odin b/core/math/linalg/general.odin index 9f22fa45e..c11151b25 100644 --- a/core/math/linalg/general.odin +++ b/core/math/linalg/general.odin @@ -94,7 +94,7 @@ quaternion_cross :: proc(q1, q2: $Q) -> (q3: Q) where IS_QUATERNION(Q) { vector_cross :: proc{scalar_cross, vector_cross2, vector_cross3} cross :: proc{scalar_cross, vector_cross2, vector_cross3, quaternion_cross} -vector_normalize :: proc(v: $T/[$N]$E) -> T where IS_NUMERIC(E) { +vector_normalize :: proc(v: $T/[$N]$E) -> T where IS_FLOAT(E) { return v / length(v) } quaternion_normalize :: proc(q: $Q) -> Q where IS_QUATERNION(Q) { @@ -102,7 +102,7 @@ quaternion_normalize :: proc(q: $Q) -> Q where IS_QUATERNION(Q) { } normalize :: proc{vector_normalize, quaternion_normalize} -vector_normalize0 :: proc(v: $T/[$N]$E) -> T where IS_NUMERIC(E) { +vector_normalize0 :: proc(v: $T/[$N]$E) -> T where IS_FLOAT(E) { m := length(v) return 0 if m == 0 else v/m } @@ -113,7 +113,7 @@ quaternion_normalize0 :: proc(q: $Q) -> Q where IS_QUATERNION(Q) { normalize0 :: proc{vector_normalize0, quaternion_normalize0} -vector_length :: proc(v: $T/[$N]$E) -> E where IS_NUMERIC(E) { +vector_length :: proc(v: $T/[$N]$E) -> E where IS_FLOAT(E) { return math.sqrt(dot(v, v)) } diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 310874139..9c2d20781 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -818,6 +818,10 @@ i64 check_distance_between_types(CheckerContext *c, Operand *operand, Type *type } if (is_type_matrix(dst)) { + if (are_types_identical(src, dst)) { + return 5; + } + Type *dst_elem = base_array_type(dst); i64 distance = check_distance_between_types(c, operand, dst_elem); if (distance >= 0) { diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index f131bb3db..e55fae3a7 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -458,15 +458,6 @@ void lb_build_range_interval(lbProcedure *p, AstBinaryExpr *node, val1_type = type_of_expr(rs->vals[1]); } - if (val0_type != nullptr) { - Entity *e = entity_of_node(rs->vals[0]); - lb_add_local(p, e->type, e, true); - } - if (val1_type != nullptr) { - Entity *e = entity_of_node(rs->vals[1]); - lb_add_local(p, e->type, e, true); - } - TokenKind op = Token_Lt; switch (node->op.kind) { case Token_Ellipsis: op = Token_LtEq; break; @@ -478,10 +469,22 @@ void lb_build_range_interval(lbProcedure *p, AstBinaryExpr *node, lbValue lower = lb_build_expr(p, node->left); lbValue upper = {}; // initialized each time in the loop - lbAddr value = lb_add_local_generated(p, val0_type ? val0_type : lower.type, false); + lbAddr value; + if (val0_type != nullptr) { + Entity *e = entity_of_node(rs->vals[0]); + value = lb_add_local(p, val0_type, e, false); + } else { + value = lb_add_local_generated(p, lower.type, false); + } lb_addr_store(p, value, lower); - lbAddr index = lb_add_local_generated(p, t_int, false); + lbAddr index; + if (val1_type != nullptr) { + Entity *e = entity_of_node(rs->vals[1]); + index = lb_add_local(p, val1_type, e, false); + } else { + index = lb_add_local_generated(p, t_int, false); + } lb_addr_store(p, index, lb_const_int(m, t_int, 0)); lbBlock *loop = lb_create_block(p, "for.interval.loop");