Skip to content

Deriving Show with -XEmptyDataDeriving cases on the wrong argument

Running this program in GHC 8.4.1-alpha:

{-# LANGUAGE EmptyDataDeriving #-}
{-# OPTIONS_GHC -ddump-deriv #-}
module Main (main) where

data Empty deriving Show

loop :: Empty
loop = let x = x in x

main :: IO ()
main = print loop

One would expect this to loop infinitely at runtime, but in practice, that is not the case:

$ /opt/ghc/8.4.1/bin/runghc Bug.hs

==================== Derived instances ====================
Derived class instances:
  instance GHC.Show.Show Main.Empty where
    GHC.Show.showsPrec z_a1Iu = case z_a1Iu of
  

Derived type family instances:



==================== Filling in method body ====================
GHC.Show.Show [Main.Empty]
  GHC.Show.show = GHC.Show.$dmshow @(Main.Empty)



==================== Filling in method body ====================
GHC.Show.Show [Main.Empty]
  GHC.Show.showList = GHC.Show.$dmshowList @(Main.Empty)


Bug.hs: Bug.hs:5:21-24: Non-exhaustive patterns in case

The -ddump-deriv output reveals why: the showsPrec implementation for Empty is casing on the //precedence// argument, not the actual value of type Empty! This results in the non-exhaustive patterns error.

This is my fault, so I'll prepare a fix :)

Trac metadata
Trac field Value
Version 8.4.1-alpha1
Type Bug
TypeOfFailure OtherFailure
Priority high
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