ghc-9.12.1: The GHC API
Safe HaskellNone
LanguageGHC2021

GHC.HsToCore.Pmc.Types

Description

Types used through-out pattern match checking. This module is mostly there to be imported from GHC.HsToCore.Types. The exposed API is that of GHC.HsToCore.Pmc.

These types model the paper Lower Your Guards: A Compositional Pattern-Match Coverage Checker".

Synopsis

LYG syntax

Guard language

newtype SrcInfo Source #

Means by which we identify a source construct for later pretty-printing in a warning message. SDoc for the equation to show, Located for the location.

Constructors

SrcInfo (Located SDoc) 

Instances

Instances details
Outputable SrcInfo Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: SrcInfo -> SDoc Source #

data PmGrd Source #

A very simple language for pattern guards. Let bindings, bang patterns, and matching variables against flat constructor patterns. The LYG guard language.

Constructors

PmCon

PmCon x K dicts args corresponds to a K dicts args <- x guard. The args are bound in this construct, the x is just a use. For the arguments' meaning see ConPatOut.

Fields

PmBang

PmBang x corresponds to a seq x True guard. If the extra SrcInfo is present, the bang guard came from a source bang pattern, in which case we might want to report it as redundant. See Note [Dead bang patterns] in GHC.HsToCore.Pmc.Check.

Fields

PmLet

PmLet x expr corresponds to a let x = expr guard. This actually binds x.

Fields

Instances

Instances details
Outputable PmGrd Source #

Should not be user-facing.

Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: PmGrd -> SDoc Source #

data GrdDag Source #

A series-parallel graph of PmGrds, so very nearly a guard tree, if it weren't for or-patterns/GdAlt! The implicit "source" corresponds to "before the match" and the implicit "sink" corresponds to "after a successful match".

  • GdEnd is a GrdDag that always matches.
  • GdOne is a GrdDag that matches iff its PmGrd matches.
  • GdSeq g1 g2 corresponds to matching guards g1 and then g2 if matching g1 succeeded. Example: The Haskell guard | x > 1, x < 10 = ... will test x > 1 before x < 10, failing if either test fails.
  • GdAlt g1 g2 is far less common than GdSeq and corresponds to matching an or-pattern (LT; EQ), succeeding if the match variable matches either LT or EQ. See Note [Implementation of OrPatterns] for a larger example.

Instances

Instances details
Outputable GrdDag Source #

Format LYG guards as | True <- x, let x = 42, !z

Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: GrdDag -> SDoc Source #

consGrdDag :: PmGrd -> GrdDag -> GrdDag Source #

Sequentially compose a PmGrd in front of a GrdDag.

gdSeq :: GrdDag -> GrdDag -> GrdDag Source #

Sequentially compose two GrdDags. A smart constructor for GdSeq that eliminates GdEnds.

sequencePmGrds :: [PmGrd] -> GrdDag Source #

Sequentially compose a list of PmGrds into a GrdDag.

sequenceGrdDags :: [GrdDag] -> GrdDag Source #

Sequentially compose a list of GrdDags.

alternativesGrdDags :: NonEmpty GrdDag -> GrdDag Source #

Parallel composition of a list of GrdDags. Needs a non-empty list as GdAlt does not have a neutral element.

Guard tree language

newtype PmMatchGroup p Source #

A guard tree denoting MatchGroup.

Constructors

PmMatchGroup (NonEmpty (PmMatch p)) 

Instances

Instances details
Outputable p => Outputable (PmMatchGroup p) Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: PmMatchGroup p -> SDoc Source #

data PmMatch p Source #

A guard tree denoting Match: A payload describing the pats and a bunch of GRHS.

Constructors

PmMatch 

Fields

Instances

Instances details
Outputable p => Outputable (PmMatch p) Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: PmMatch p -> SDoc Source #

data PmGRHSs p Source #

A guard tree denoting GRHSs: A bunch of PmLet guards for local bindings from the GRHSss where clauses and the actual list of GRHS. See Note [Long-distance information for HsLocalBinds] in GHC.HsToCore.Pmc.Desugar.

Constructors

PmGRHSs 

Fields

Instances

Instances details
Outputable p => Outputable (PmGRHSs p) Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: PmGRHSs p -> SDoc Source #

data PmGRHS p Source #

A guard tree denoting GRHS: A payload describing the grds and a SrcInfo useful for printing out in warnings messages.

Constructors

PmGRHS 

Fields

Instances

Instances details
Outputable p => Outputable (PmGRHS p) Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: PmGRHS p -> SDoc Source #

newtype PmPatBind p Source #

A guard tree denoting a pattern binding.

Constructors

PmPatBind (PmGRHS p) 

Instances

Instances details
Outputable p => Outputable (PmPatBind p) Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: PmPatBind p -> SDoc Source #

newtype PmEmptyCase Source #

A guard tree denoting an -XEmptyCase.

Constructors

PmEmptyCase 

Fields

Instances

Instances details
Outputable PmEmptyCase Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: PmEmptyCase -> SDoc Source #

data PmRecSel v Source #

Constructors

PmRecSel 

Fields

Coverage Checking types

data RedSets Source #

Redundancy sets, used to determine redundancy of RHSs and bang patterns (later digested into a CIRB).

Constructors

RedSets 

Fields

  • rs_cov :: !Nablas

    The Covered set; the set of values reaching a particular program point.

  • rs_div :: !Nablas

    The Diverging set; empty if no match can lead to divergence. If it wasn't empty, we have to turn redundancy warnings into inaccessibility warnings for any subclauses.

  • rs_bangs :: !(OrdList (Nablas, SrcInfo))

    If any of the Nablas is empty, the corresponding SrcInfo pin-points a bang pattern in source that is redundant. See Note [Dead bang patterns].

Instances

Instances details
Outputable RedSets Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: RedSets -> SDoc Source #

data Precision Source #

Constructors

Approximate 
Precise 

Instances

Instances details
Outputable Precision Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: Precision -> SDoc Source #

Monoid Precision Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Semigroup Precision Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Show Precision Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Eq Precision Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

data CheckResult a Source #

Pattern-match coverage check result

Constructors

CheckResult 

Fields

  • cr_ret :: !a

    A hole for redundancy info and covered sets.

  • cr_uncov :: !Nablas

    The set of uncovered values falling out at the bottom. (for -Wincomplete-patterns, but also important state for the algorithm)

  • cr_approx :: !Precision

    A flag saying whether we ran into the maxPmCheckModels limit for the purpose of suggesting to crank it up in the warning message. Writer state.

Instances

Instances details
Functor CheckResult Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

fmap :: (a -> b) -> CheckResult a -> CheckResult b #

(<$) :: a -> CheckResult b -> CheckResult a #

Outputable a => Outputable (CheckResult a) Source # 
Instance details

Defined in GHC.HsToCore.Pmc.Types

Methods

ppr :: CheckResult a -> SDoc Source #

Pre and post coverage checking synonyms

type Pre = GrdDag Source #

Used as tree payload pre-checking. The LYG guards to check.

type Post = RedSets Source #

Used as tree payload post-checking. The redundancy info we elaborated.

Normalised refinement types