diff --git a/lang/README.md b/lang/README.md index eed9235..e853f92 100644 --- a/lang/README.md +++ b/lang/README.md @@ -1042,6 +1042,41 @@ main := fn(): uint { } ``` +#### inlining_loops +```hb +x := 1 + +foo := fn(): void { + loop if true break + x = 0 +} + +main := fn(): uint { + @inline(foo) + return x +} +``` + +#### null_check_test +```hb +get_ptr := fn(): ?^uint { + value := 0 + return &value +} + +main := fn(): void { + ptr := get_ptr() + + if ptr == null { + return + } + + loop { + *ptr += 1 + } +} +``` + ### Just Testing Optimizations #### const_folding_with_arg diff --git a/lang/src/son.rs b/lang/src/son.rs index fb8617f..707ae74 100644 --- a/lang/src/son.rs +++ b/lang/src/son.rs @@ -4412,6 +4412,8 @@ mod tests { writing_into_string; request_page; tests_ptr_to_ptr_copy; + inlining_loops; + null_check_test; // Just Testing Optimizations; const_folding_with_arg; diff --git a/lang/tests/son_tests_inlining_loops.txt b/lang/tests/son_tests_inlining_loops.txt new file mode 100644 index 0000000..f02533a --- /dev/null +++ b/lang/tests/son_tests_inlining_loops.txt @@ -0,0 +1,8 @@ +main: + LRA r2, r0, :x + LI64 r1, 0d + ST r1, r2, 0a, 8h + JALA r0, r31, 0a +code size: 57 +ret: 0 +status: Ok(()) diff --git a/lang/tests/son_tests_null_check_test.txt b/lang/tests/son_tests_null_check_test.txt new file mode 100644 index 0000000..c9727f8 --- /dev/null +++ b/lang/tests/son_tests_null_check_test.txt @@ -0,0 +1,6 @@ +test.hb:15:4: can't prove the value is not 'null', use '@unwrap()' if you believe compiler is stupid, or explicitly check for null and handle it ('if == null { /* handle */ } else { /* use opt */ }') + *ptr += 1 + ^ +test.hb:15:4: can't prove the value is not 'null', use '@unwrap()' if you believe compiler is stupid, or explicitly check for null and handle it ('if == null { /* handle */ } else { /* use opt */ }') + *ptr += 1 + ^