about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-11-29 12:42:34 -0800
committerKartik Agaram <vc@akkartik.com>2020-11-29 12:42:34 -0800
commit61cfedceef0042dae08e7d4347be4c8c525b4ba2 (patch)
tree6001e40cb6cdf046b7ad29ba6f98869a1d2c41c1
parent33a85545e1c6fcfd892b6061083716fb7c835ec7 (diff)
downloadmu-61cfedceef0042dae08e7d4347be4c8c525b4ba2.tar.gz
7300 - bugfix in type-checking float returns
-rwxr-xr-xapps/mubin595336 -> 596276 bytes
-rw-r--r--apps/mu.subx69
2 files changed, 69 insertions, 0 deletions
diff --git a/apps/mu b/apps/mu
index 3996cb2b..913cf1b1 100755
--- a/apps/mu
+++ b/apps/mu
Binary files differdiff --git a/apps/mu.subx b/apps/mu.subx
index 04dbebe9..7fbf43e8 100644
--- a/apps/mu.subx
+++ b/apps/mu.subx
@@ -1804,6 +1804,50 @@ test-return-unavailable-value:
     5d/pop-to-ebp
     c3/return
 
+test-return-literal-to-float:
+    # . prologue
+    55/push-ebp
+    89/<- %ebp 4/r32/esp
+    # setup
+    (clear-stream _test-input-stream)
+    (clear-stream $_test-input-buffered-file->buffer)
+    (clear-stream _test-output-stream)
+    (clear-stream $_test-output-buffered-file->buffer)
+    (clear-stream _test-error-stream)
+    (clear-stream $_test-error-buffered-file->buffer)
+    # var ed/edx: exit-descriptor = tailor-exit-descriptor(16)
+    68/push 0/imm32
+    68/push 0/imm32
+    89/<- %edx 4/r32/esp
+    (tailor-exit-descriptor %edx 0x10)
+    #
+    (write _test-input-stream "fn foo -> _/xmm0: float {\n")
+    (write _test-input-stream "  return 0\n")
+    (write _test-input-stream "}\n")
+    # convert
+    (convert-mu _test-input-buffered-file _test-output-buffered-file _test-error-buffered-file %edx)
+    # registers except esp clobbered at this point
+    # restore ed
+    89/<- %edx 4/r32/esp
+    (flush _test-output-buffered-file)
+    (flush _test-error-buffered-file)
+#?     # dump _test-error-stream {{{
+#?     (write 2 "^")
+#?     (write-stream 2 _test-error-stream)
+#?     (write 2 "$\n")
+#?     (rewind-stream _test-error-stream)
+#?     # }}}
+    # check output
+    (check-stream-equal _test-output-stream  ""  "F - test-return-literal-to-float: output should be empty")
+    (check-next-stream-line-equal _test-error-stream  "fn foo: return: cannot copy literal '0' to float"  "F - test-return-literal-to-float: error message")
+    # check that stop(1) was called
+    (check-ints-equal *(edx+4) 2 "F - test-return-literal-to-float: exit status")
+    # don't restore from ebp
+    81 0/subop/add %esp 8/imm32
+    # . epilogue
+    5d/pop-to-ebp
+    c3/return
+
 test-convert-return-with-duplicate-values:
     # . prologue
     55/push-ebp
@@ -22983,6 +23027,17 @@ check-mu-return-stmt:  # stmt: (addr stmt), fn: (addr function), err: (addr buff
         75/jump-if-!= break/disp8
         (lookup *(eax+4) *(eax+8))  # Type-tree-left Type-tree-left => eax
       }
+      # if curr-type is literal and template-type is float, abort
+      50/push-eax
+      {
+        (is-simple-mu-type? %eax 0)  # literal => eax
+        3d/compare-eax-and 0/imm32/false
+        74/jump-if-= break/disp8
+        (is-simple-mu-type? %ecx 0xf)  # float => eax
+        3d/compare-eax-and 0/imm32/false
+        0f 85/jump-if-!= $check-mu-return-stmt:error-literal-to-float/disp32
+      }
+      58/pop-to-eax
       # if (curr-type != template-type) abort
       (type-match? %ecx %eax %edx)  # => eax
       3d/compare-eax-and 0/imm32/false
@@ -23046,6 +23101,20 @@ $check-mu-return-stmt:error2:
     (stop *(ebp+0x14) 1)
     # never gets here
 
+$check-mu-return-stmt:error-literal-to-float:
+    (write-buffered *(ebp+0x10) "fn ")
+    8b/-> *(ebp+0xc) 0/r32/eax
+    (lookup *eax *(eax+4))  # Function-name Function-name => eax
+    (write-buffered *(ebp+0x10) %eax)
+    (write-buffered *(ebp+0x10) ": return: cannot copy literal '")
+    (lookup *edi *(edi+4))  # Stmt-var-value Stmt-var-value => eax
+    (lookup *eax *(eax+4))  # Var-name Var-name => eax
+    (write-buffered *(ebp+0x10) %eax)
+    (write-buffered *(ebp+0x10) "' to float\n")
+    (flush *(ebp+0x10))
+    (stop *(ebp+0x14) 1)
+    # never gets here
+
 $check-mu-return-stmt:error-too-few-inouts:
     (write-buffered *(ebp+0x10) "fn ")
     8b/-> *(ebp+0xc) 0/r32/eax