GHC HEAD miscompiles `text-containers`
When compiling and running text-containers
's test-suite, the test-cases involving lookup functions (e.g. member :: Key -> TextSet -> Bool
) fail indeterministically.
NB: The code in question works perfectly for GHC 7.10.3/8.0.2/8.2.1; and I've also verified this isn't related to the new compareByteArray#
primop; in fact you get the very same failures if you force text-containers
to use the memcmp FFI (by editing the respective if
conditional in the .cabal file).
Repro instructions (sorry, haven't had time to minimize it yet):
# get wip/ghc-T14361 branch of `text-containers`
git clone https://github.com/hvr/text-containers.git -b wip/ghc-T14361
cd text-containers/
# generate cabal.project.local
cat > cabal.project.local <<EOF
repository head.hackage
url: http://head.hackage.haskell.org/
secure: True
root-keys: 07c59cb65787dedfaef5bd5f987ceb5f7e5ebf88b904bbd4c5cbdeb2ff71b740
2e8555dde16ebd8df076f1a8ef13b8f14c66bad8eafefd7d9e37d0ed711821fb
8f79fd2389ab2967354407ec852cbe73f2e8635793ac446d09461ffb99527f6e
key-threshold: 3
allow-newer: *:base, tagged-0.8.5:template-haskell
EOF
# update head.hackage package index if needed;
# use https://github.com/hvr/head.hackage/blob/master/scripts/head.hackage.sh script
head.hackage.sh update
You can now build & run the test-suite via (if you need, you can replace ghc-8.3.20171016
by the full path to your inplace/bin/ghc-stage2
executable):
cabal new-test -w ghc-8.3.20171016
- ..and this will report
...
All 44 tests passed (3.81s)
Test suite text-containers: PASS
Test suite logged to:
dist-newstyle/build/x86_64-linux/ghc-8.3.20171016/text-containers-0.1.0.0/t/text-containers/test/text-containers-0.1.0.0-text-containers.log
1 of 1 test suites (1 of 1 test cases) passed.
If however, you edit src/Internal2.hs
and disable either the
-
{-# OPTIONS_GHC -fno-strictness #-}
or the {-# NOINLINE cmpBA2OfsLen #-}
pragmas, and re-run the test-suite, those 6 of the 44 tests which test the member
/lookup{GE,LE}
operations will start failing, e.g.
...
null: OK (0.06s)
+++ OK, passed 100 tests.
member: FAIL
*** Failed! Falsifiable (after 25 tests and 6 shrinks):
Ps [("\74914\869082\952045\187526\US",18),("\444739R^\DC3\RSpr",-20),("Je\5900LfM\SI\622028\13867\861002\\+?\49284Mi",9),("\ETB",-3),("\EOT,3/{wdirM\66595\829945R\17707_9\1079715DA\SOH5",0),("Md",-13),("gSY\ESC3N\DLEE\864876'~\184683z\ESCy<\r\448917\787640\SYN\752866",15)]
Use --quickcheck-replay=592157 to reproduce.
(!?): FAIL
*** Failed! Falsifiable (after 18 tests and 2 shrinks):
Ps [("\DC3|X|\488551)|8\NAKa\278082an\649221\v\843318",1),("\603109\SYN\EOT\999535<M%\USBXEu\734582",0),("C\625018.",-7),("iV\ESCu",-16),("d\aJ7@\DLE2\102734\a\868938",8),("i\974801rl\1094305b[\ESC\a?",-5),("\95327[hB",1),("rG\v\1017578\CAN\ACK",-6)]
Use --quickcheck-replay=713273 to reproduce.
TextSet
toList.fromList: OK (0.07s)
+++ OK, passed 100 tests.
...
6 out of 44 tests failed (3.20s)
Test suite text-containers: FAIL
Test suite logged to:
dist-newstyle/build/x86_64-linux/ghc-8.3.20171016/text-containers-0.1.0.0/t/text-containers/test/text-containers-0.1.0.0-text-containers.log
0 of 1 test suites (0 of 1 test cases) passed.
cabal: Tests failed for test:text-containers from text-containers-0.1.0.0.
And you'll notice that even if --quickcheck-replay
is used, the failures will not be 100% deterministic.