Skip to content

GitLab

  • Menu
Projects Groups Snippets
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in / Register
  • GHC GHC
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 4,860
    • Issues 4,860
    • List
    • Boards
    • Service Desk
    • Milestones
    • Iterations
  • Merge requests 454
    • Merge requests 454
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Deployments
    • Deployments
    • Releases
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Code review
    • Insights
    • Issue
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Glasgow Haskell Compiler
  • GHCGHC
  • Issues
  • #18563
Closed
Open
Created Aug 11, 2020 by Gesh@gesh

-Wunused-packages doesn't understand backpack semantics

Summary

-Wunused-packages warns that signatures don't need their dependencies and that indefinite packages don't need their signatures.

Steps to reproduce

Consider this simple backpack project:

==> bug.cabal <==
cabal-version: 3.0
name:          bug
version:       0.1.0.0

common default
  ghc-options:        -Werror -Wunused-packages
  default-language:   Haskell2010
  default-extensions: NoImplicitPrelude
  build-depends:      base

library sig
  import:         default
  signatures:     Sig
  build-depends:  semigroups
  hs-source-dirs: sig

library lib
  import:          default
  exposed-modules: Lib
  hs-source-dirs:  lib
  build-depends:   sig

library imp
  import:          default
  exposed-modules: Imp
  build-depends:   semigroups
  hs-source-dirs:  imp

executable app
  import:         default
  main-is:        App.hs
  hs-source-dirs: app
  build-depends:
    , imp
    , lib

  mixins:         imp (Imp as Sig)

==> sig/Sig.hsig <==
signature Sig (T, t, f) where

import Data.List.NonEmpty (NonEmpty)
import Prelude (Show)

data T

instance Show T

t :: T
f :: NonEmpty T -> T

==> lib/Lib.hs <==
module Lib (u) where

import Sig (T, f, t)

u :: T
u = f t

==> imp/Imp.hs <==
module Imp (T, t, f) where

import Data.List.NonEmpty (NonEmpty, head)
import Prelude (Show)

data T = L | R deriving (Show)

t :: T
t = L

f :: NonEmpty T -> T
f = head

==> app/App.hs <==
import Lib (u)
import Prelude (print, IO)

main :: IO ()
main = print u

Then cabal build sig and imp complain that

<no location info>: error: [-Wunused-packages, -Werror=unused-packages]
    The following packages were specified via -package or -package-id flags,
    but were not needed for compilation:
      - semigroups-0.19.1

If we suppress this by passing -Wno-unused-packages to the sig build, then cabal build lib complains that

<no location info>: error: [-Wunused-packages, -Werror=unused-packages]
    The following packages were specified via -package or -package-id flags,
    but were not needed for compilation:
      - bug-0.1.0.0:sig[Sig=<Sig>]

Full error logs have been posted at ix.io, for no suppression, sig suppression and sig+lib suppression

Expected behavior

This shouldn't complain at all. However, judging by #13493, this might be a bit difficult to implement, so at least having this check have a toggle to switch between off/no-backpack/on would help.

Environment

  • GHC version used: 8.10.1
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
Time tracking