text has different runtime behavior between GHC 8.6.5 and 8.8.1
If you compile the following file:
module Main (main) where
import qualified Data.Char as C
import Data.Char (isLetter, isLower)
import Data.Maybe (mapMaybe)
import qualified Data.Text as T
import Data.Text (Text)
main :: IO ()
main = print $ t_toTitle_1stNotLower
$ T.pack "\4309" -- ვ
-- Taken from the text test suite
-- https://github.com/haskell/text/blob/44ec2cee65e5326ed943370e424f60d4ae6206d1/tests/Tests/Properties.hs#L388-L396
t_toTitle_1stNotLower :: Text -> Bool
t_toTitle_1stNotLower = and . notLow . T.toTitle . T.filter stable
where notLow = mapMaybe (fmap (not . isLower) . (T.find isLetter)) . T.words
-- Surprise! The Spanish/Portuguese ordinal indicators changed
-- from category Ll (letter, lowercase) to Lo (letter, other)
-- in Unicode 7.0
-- Oh, and there exist lowercase-only letters (see previous test)
stable c = if isLower c
then C.toUpper c /= c
else c /= '\170' && c /= '\186'
Then you'll get different runtime results depending on which version of GHC you use. Here is the answer with GHC 8.6.5:
$ /opt/ghc/8.6.5/bin/ghc Bug.hs -fforce-recomp -v0 && ./Bug
True
And here is the answer with GHC 8.8.1, 8.10.1-alpha2, and HEAD:
$ /opt/ghc/8.8.1/bin/ghc Bug.hs -fforce-recomp -v0 && ./Bug
False
This discrepancy manifests itself regardless of what GHC optimization level is used.