MyNixOS website logo
Description

"Provide warnings for unexpected Core generation"

Core Warn

CI badge made with Haskell hackage link

Motivation

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.

Usage

Stack

In your stack.yaml add this

extra-deps:
- core-warn-0.1.0.0

and then in package.yaml add:

dependencies:
- core-warn

ghc-options:
- -fplugin=CoreWarn

Cabal

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

Options

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.
Metadata

Version

0.1.0.0

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows