[ANNOUNCE] GHC 8.6.1-alpha2 available

Ryan Scott ryan.gl.scott at gmail.com
Sat Jul 21 13:03:13 UTC 2018

Presumably, you're compiling this program outside of a git repository,
and so the Template Haskell splice $(gitHash) evaluates to "UNKNOWN"
at compile time. Here is an even more minimal example, which does not
depend on gitrev:

    f :: ()
    f = case "UNKNOWN" of
          "UNKNOWN" -> ()
          _         -> ()

This, when compiled with GHC 8.6.1 or later, gives the same warning:

    Test.hs:4:7: warning: [-Woverlapping-patterns]
        Pattern match is redundant
        In a case alternative: _ -> ...
    4 |       _         -> ()
      |       ^^^^^^^^^^^^^^^

This, I would argue, is a correct error message. The string literal
"UNKNOWN" is, well, statically known to be "UNKNOWN", so GHC knows
that that catch-all case cannot be reached. (See [1] for the commit
which introduced this check.)

Granted, this makes things slightly inconvenient for your purposes,
since in your actual program, $(gitHash) might evaluate to *different*
things at compile time depending on the directory you compile it in.
I'd recommend rewriting the commitInfo function to pattern guards:

    commitInfo :: Maybe String
      | hash == "UNKNOWN" = Nothing
      | otherwise         = Just hash
        hash = $(gitHash)

Since that does not trigger -Woverlapping-patterns. (Granted, it's
possible that GHC could become much smarter in the future and be able
to detect that that `otherwise` case is unreachable when $(gitHash)
evaluates to "UNKNOWN" at compile time. But GHC certainly isn't that
smart today!)

Ryan S.
[1] http://git.haskell.org/ghc.git/commit/1f88f541aad1e36d01f22f9e71dfbc247e6558e2

More information about the ghc-devs mailing list