Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in / Register
GHC
GHC
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 4,390
    • Issues 4,390
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
    • Iterations
  • Merge Requests 373
    • Merge Requests 373
  • Requirements
    • Requirements
    • List
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Operations
    • Operations
    • Incidents
    • Environments
  • Analytics
    • Analytics
    • CI / CD
    • Code Review
    • Insights
    • Issue
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Glasgow Haskell Compiler
  • GHCGHC
  • Issues
  • #14361

Closed
Open
Opened Oct 17, 2017 by Herbert Valerio Riedel@hvr🕺Maintainer

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 Mar 10, 2019 by Herbert Valerio Riedel
Assignee
Assign to
8.4.1
Milestone
8.4.1 (Past due)
Assign milestone
Time tracking
None
Due date
None
Reference: ghc/ghc#14361