Skip to content

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
  1. ..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.

Edited by Herbert Valerio Riedel
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information