Commit 36546a43 authored by Ryan Scott's avatar Ryan Scott Committed by Marge Bot

Fix #16411 by making dataConCannotMatch aware of (~~)

The `dataConCannotMatch` function (which powers the
`-Wpartial-fields` warning, among other things) had special reasoning
for explicit equality constraints of the form `a ~ b`, but it did
not extend that reasoning to `a ~~ b` constraints, leading to #16411.
Easily fixed.
parent cb17c2da
Pipeline #3512 passed with stages
in 434 minutes and 47 seconds
......@@ -1403,10 +1403,13 @@ dataConCannotMatch tys con
-- TODO: could gather equalities from superclasses too
predEqs pred = case classifyPredType pred of
EqPred NomEq ty1 ty2 -> [(ty1, ty2)]
ClassPred eq [_, ty1, ty2]
| eq `hasKey` eqTyConKey -> [(ty1, ty2)]
_ -> []
EqPred NomEq ty1 ty2 -> [(ty1, ty2)]
ClassPred eq args
| eq `hasKey` eqTyConKey
, [_, ty1, ty2] <- args -> [(ty1, ty2)]
| eq `hasKey` heqTyConKey
, [_, _, ty1, ty2] <- args -> [(ty1, ty2)]
_ -> []
-- | Were the type variables of the data con written in a different order
-- than the regular order (universal tyvars followed by existential tyvars)?
......
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeOperators #-}
{-# OPTIONS_GHC -Wpartial-fields #-}
module T16411 where
import Data.Type.Equality
data T1 z where
MkT1a :: { rec1 :: () } -> T1 Int
MkT1b :: (z ~ Bool) => T1 z
data T2 z where
MkT2a :: { rec2 :: () } -> T2 Int
MkT2b :: (z ~~ Bool) => T2 z
......@@ -670,3 +670,4 @@ test('T16204a', normal, compile, [''])
test('T16204b', normal, compile, [''])
test('T16225', normal, compile, [''])
test('T13951', normal, compile, [''])
test('T16411', normal, compile, [''])
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment