Skip to content

PatternSynonyms confuse exhaustiveness check

I just noticed some odd behaviour when (ab)using pattern synonyms in the following code (whose style I don't really endorse):

{-# LANGUAGE PatternSynonyms, LambdaCase #-}

module PatSyn1 where

import System.Directory (doesFileExist)

pattern Found    = True
pattern NotFound = False

readConfigFile :: FilePath -> IO ()
readConfigFile filePath = doesFileExist filePath >>= \case
    Found    -> putStrLn =<< readFile filePath
    NotFound -> putStrLn "File does not exist."


pattern Void = ()

foo :: () -> ()
foo Void = ()

Results in

/home/hvr/Haskell/PatSyn1.hs:(11,54)-(13,47): Warning:
    Pattern match(es) are non-exhaustive
    In a case alternative: Patterns not matched: _

/home/hvr/Haskell/PatSyn1.hs:19:1-13: Warning:
    Pattern match(es) are non-exhaustive
    In an equation for ‘foo’: Patterns not matched: _
Trac metadata
Trac field Value
Version 7.10.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information