[GHC] #15149: Identical distinct type family fields miscompiled
GHC
ghc-devs at haskell.org
Mon May 14 10:56:15 UTC 2018
#15149: Identical distinct type family fields miscompiled
-------------------------------------+-------------------------------------
Reporter: NeilMitchell | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone: 8.6.1
Component: Compiler | Version: 8.4.2
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: GHC rejects
Unknown/Multiple | valid program
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
Given the code:
{{{#!hs
-- 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).
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15149>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list