summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2022-02-02 14:43:53 -0500
committerBen Gamari <ben@smart-cactus.org>2022-02-04 00:01:22 -0500
commit742b0c53bca30b7c1d88ebcf0c105edbecefb0bf (patch)
tree4e9701da1093fb802c744d9a8c0af582fa740649
parent1e5ec5635294a864e00ad668336537a5ab8bb598 (diff)
downloadhaskell-wip/T20987b.tar.gz
primops: Fix documentation of setByteArray#wip/T20987b
Previously the documentation was subtly incorrect regarding the bounds of the operation. Fix this and add a test asserting that a zero-length operation is in fact a no-op.
-rw-r--r--compiler/GHC/Builtin/primops.txt.pp2
-rw-r--r--testsuite/tests/codeGen/should_run/setByteArray.hs11
2 files changed, 8 insertions, 5 deletions
diff --git a/compiler/GHC/Builtin/primops.txt.pp b/compiler/GHC/Builtin/primops.txt.pp
index 772371235e..10dc9af4dc 100644
--- a/compiler/GHC/Builtin/primops.txt.pp
+++ b/compiler/GHC/Builtin/primops.txt.pp
@@ -1848,7 +1848,7 @@ primop CopyAddrToByteArrayOp "copyAddrToByteArray#" GenPrimOp
primop SetByteArrayOp "setByteArray#" GenPrimOp
MutableByteArray# s -> Int# -> Int# -> Int# -> State# s -> State# s
- {{\tt setByteArray# ba off len c} sets the byte range {\tt [off, off+len]} of
+ {{\tt setByteArray# ba off len c} sets the byte range {\tt [off, off+len)} of
the {\tt MutableByteArray#} to the byte {\tt c}.}
with
has_side_effects = True
diff --git a/testsuite/tests/codeGen/should_run/setByteArray.hs b/testsuite/tests/codeGen/should_run/setByteArray.hs
index 099376cb4b..c9a1012ccd 100644
--- a/testsuite/tests/codeGen/should_run/setByteArray.hs
+++ b/testsuite/tests/codeGen/should_run/setByteArray.hs
@@ -12,12 +12,15 @@ main :: IO ()
main = do BA ba <- IO $ \s0 ->
case newByteArray# 8# s0 of
(# !s1, !mba #) ->
- case setByteArray# mba 0# 8# 65# s1 of
+ case setByteArray# mba 0# 8# 65# s1 of -- ASCII 'A'
!s2 ->
- case setByteArray# mba 1# 6# 67# s2 of
+ case setByteArray# mba 1# 6# 67# s2 of -- ASCII 'B'
!s3 ->
- case unsafeFreezeByteArray# mba s3 of
- (# s4, ba #) -> (# s4, BA ba #)
+ -- N.B. 0-length should be a no-op
+ case setByteArray# mba 2# 0# 68# s3 of -- ASCII 'C'
+ !s4 ->
+ case unsafeFreezeByteArray# mba s4 of
+ (# s5, ba #) -> (# s5, BA ba #)
let f (I# i) = putStrLn [C# (indexCharArray# ba i)]
mapM_ f [0..7]