core-warn: "Provide warnings for unexpected Core generation"

[ bsd3, library, warning ] [ Propose Tags ]


Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


  • No Candidates
Versions [RSS]
Change log
Dependencies base (>=4.10 && <5), containers, containers-good-graph, ghc, syb [details]
License BSD-3-Clause
Author Jonathan Lorimer
Category Warning
Uploaded by isovector at 2021-10-24T04:12:56Z
Downloads 125 total (5 in the last 30 days)
Rating 2.25 (votes: 2) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for core-warn-

[back to package description]

Core Warn

CI badge made with Haskell hackage link


This plugin was inspired by these two blog posts from Well Typed: part 1, part 2. They discuss two scenarios where GHC's core representation deviates drastically from what one might expect. These phenomena can be grouped into two buckets: instances where GHC produces too many unnecessary type coercions, and instances where GHC produces large chains of dictionary references. The first can be solved by ensuring that all expensive instances occur in a phantom context, and the second can be solved by ensuring that all inductive instances are balanced.



In your stack.yaml add this

- core-warn-

and then in package.yaml add:

- core-warn

- -fplugin=CoreWarn


Add these lines to the corresponding stanza of your cabal file. For example if you want to run CoreWarn on your library stanza, add the below code block as a child of library.

ghc-options:      -fplugin=CoreWarn
build-depends:    base >=4.10 && <5
                , ...
                , core-warn

or you can run this option from the command line for a specific component, in this example we chose the test component:

$ cabal repl test --ghc-options=-fplugin=CoreWarn


Here is an example of how you would apply an option to this plugin. For the sake of variety we will use a file level pragma as the example.

{-# OPTIONS_GHC -fplugin-opt=CoreWarn:<opt-name> #-}

The plugin accepts four arguments, but by default opts in. For example if you wanted to only show warning for one kind of issue mentioned above, you could use the follwing options:

  • warn-large-coercions
  • warn-deep-dicts

If you have CoreWarn enabled for the entire project, you might want to disable it in a particular file. You can do so with the following options:

  • no-warn-large-coercions
  • no-warn-deep-dicts