Skip to content

Identical distinct type family fields miscompiled

Given the code:

-- An.hs
{-# LANGUAGE TypeFamilies #-}
module An where
data family An c :: *

-- AnInt.hs
{-# LANGUAGE TypeFamilies #-}
module AnInt where
import An
data instance An Int = AnInt {an :: Int} deriving Show

-- AnDouble.hs
{-# LANGUAGE TypeFamilies #-}
module AnDouble where
import An
data instance An Double = AnDouble {an :: Double} deriving Show

-- Main.hs
{-# LANGUAGE DisambiguateRecordFields #-}
module Main where
import AnInt
import AnDouble
main = print (AnDouble{an=1}, AnInt{an=1})

I would expect this code to work. In reality it fails at runtime with GHC 8.2.2:

Main.hs:4:15-28: warning: [-Wmissing-fields]
    * Fields of `AnDouble' not initialised: an
    * In the expression: AnDouble {an = 1}
      In the first argument of `print', namely
        `(AnDouble {an = 1}, AnInt {an = 1})'
      In the expression: print (AnDouble {an = 1}, AnInt {an = 1})
  |
6 | main = print (AnDouble{an=1}, AnInt{an=1})
  |               ^^^^^^^^^^^^^^

*** Exception: Main.hs:4:15-28: Missing field in record construction an

And fails at compile time in GHC 8.4.2:

Main.hs:4:31-41: error:
    * Constructor `AnInt' does not have field `an'
    * In the expression: AnInt {an = 1}
      In the first argument of `print', namely
        `(AnDouble {an = 1}, AnInt {an = 1})'
      In the expression: print (AnDouble {an = 1}, AnInt {an = 1})
  |
6 | main = print (AnDouble{an=1}, AnInt{an=1})
  |                               ^^^^^^^^^^^

This code was extracted from a real example, where this bug is pretty fatal, as I haven't been able to find any workarounds (without just avoiding clashing record fields).

Trac metadata
Trac field Value
Version 8.4.2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC ndmitchell@gmail.com
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information