aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/llvm_backend_expr.cpp10
-rw-r--r--tests/issues/run.bat1
-rwxr-xr-xtests/issues/run.sh1
-rw-r--r--tests/issues/test_issue_2056.odin22
4 files changed, 30 insertions, 4 deletions
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index 1b43aac86..108276ee3 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -2083,10 +2083,12 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
Type *elem = base_array_type(dst);
lbValue e = lb_emit_conv(p, value, elem);
lbAddr v = lb_add_local_generated(p, t, false);
- for (i64 i = 0; i < dst->Matrix.row_count; i++) {
- isize j = cast(isize)i;
- lbValue ptr = lb_emit_matrix_epi(p, v.addr, j, j);
- lb_emit_store(p, ptr, e);
+ lbValue zero = lb_const_value(p->module, elem, exact_value_i64(0), true);
+ for (i64 j = 0; j < dst->Matrix.column_count; j++) {
+ for (i64 i = 0; i < dst->Matrix.row_count; i++) {
+ lbValue ptr = lb_emit_matrix_epi(p, v.addr, i, j);
+ lb_emit_store(p, ptr, i == j ? e : zero);
+ }
}
diff --git a/tests/issues/run.bat b/tests/issues/run.bat
index ea5feddaa..87492bc29 100644
--- a/tests/issues/run.bat
+++ b/tests/issues/run.bat
@@ -9,6 +9,7 @@ set COMMON=-collection:tests=..\..
..\..\..\odin test ..\test_issue_829.odin %COMMON% -file || exit /b
..\..\..\odin test ..\test_issue_1592.odin %COMMON% -file || exit /b
+..\..\..\odin test ..\test_issue_2056.odin %COMMON% -file || exit /b
..\..\..\odin test ..\test_issue_2087.odin %COMMON% -file || exit /b
..\..\..\odin build ..\test_issue_2113.odin %COMMON% -file -debug || exit /b
diff --git a/tests/issues/run.sh b/tests/issues/run.sh
index 440c953d9..f894f2dae 100755
--- a/tests/issues/run.sh
+++ b/tests/issues/run.sh
@@ -10,6 +10,7 @@ set -x
$ODIN test ../test_issue_829.odin $COMMON -file
$ODIN test ../test_issue_1592.odin $COMMON -file
+$ODIN test ../test_issue_2056.odin $COMMON -file
$ODIN test ../test_issue_2087.odin $COMMON -file
$ODIN build ../test_issue_2113.odin $COMMON -file -debug
diff --git a/tests/issues/test_issue_2056.odin b/tests/issues/test_issue_2056.odin
new file mode 100644
index 000000000..4869b557e
--- /dev/null
+++ b/tests/issues/test_issue_2056.odin
@@ -0,0 +1,22 @@
+// Tests issue #2056 https://github.com/odin-lang/Odin/issues/2056
+package test_issues
+
+import "core:fmt"
+import "core:testing"
+
+@test
+test_scalar_matrix_conversion :: proc(t: ^testing.T) {
+ l := f32(1.0)
+ m := (matrix[4,4]f32)(l)
+
+ for i in 0..<4 {
+ for j in 0..<4 {
+ if i == j {
+ testing.expect(t, m[i,j] == 1, fmt.tprintf("expected 1 at m[%d,%d], found %f\n", i, j, m[i,j]))
+ } else {
+ testing.expect(t, m[i,j] == 0, fmt.tprintf("expected 0 at m[%d,%d], found %f\n", i, j, m[i,j]))
+ }
+ }
+ }
+}
+