Export item suggests constructors/methods [GHC-75356]

Flag: -Wdodgy-imports
Enabled by: `-Wextra`

When exporting identifiers from a module, all in-scope constructors (for a type) or the in-scope methods (for a typeclass) can also be exported with the T(..) syntax. However, if T does not have in-scope constructors - the type is being re-exported and does not have its constructors imported) or it has no constructors - then this export item suggests that the programmer intended for T to have in-scope constructors/methods when it has none.

Examples

Export item suggests constructors/methods

When re-exporting TypeWithoutVisibleCtrs originally imported from module HiddenCtrs and then re-exported in module DodgyExports, the export list item suggests that this type has associated in-scope constructor(s). However it does not (the constructors are out of scope). The same is true of TypeWithNoCtrs; the export item suggests it has constructors whereas it has none (either in or out of scope).

The solution is to export the type abstractly (without (..)).

Error Message

DodgyExports.hs:1:22: warning: [-Wdodgy-exports] [GHC-75356]
    The export item ‘TypeWithoutVisibleCtrs(..)’ suggests that
    ‘TypeWithoutVisibleCtrs’ has (in-scope) constructors or class methods,
    but it has none
  |
1 | module DodgyExports (TypeWithoutVisibleCtrs(..), TypeWithNoCtrs(..)) where
  |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^

DodgyExports.hs:1:50: warning: [-Wdodgy-exports] [GHC-75356]
    The export item ‘TypeWithNoCtrs(..)’ suggests that
    ‘TypeWithNoCtrs’ has (in-scope) constructors or class methods,
    but it has none
  |
1 | module DodgyExports (TypeWithoutVisibleCtrs(..), TypeWithNoCtrs(..)) where
  |                                                  ^^^^^^^^^^^^^^^^^^
DodgyExports.hs
Before
module DodgyExports (TypeWithoutVisibleCtrs(..), TypeWithNoCtrs(..)) where

import HiddenCtrs

data TypeWithNoCtrs
After
module DodgyExports (TypeWithoutVisibleCtrs, TypeWithNoCtrs) where

import HiddenCtrs

data TypeWithNoCtrs

HiddenCtrs.hs
Before
module HiddenCtrs (TypeWithoutVisibleCtrs) where

data TypeWithoutVisibleCtrs = Ctr1 Int | Ctr2 | Ctr3 Bool Bool
After
module HiddenCtrs (TypeWithoutVisibleCtrs) where

data TypeWithoutVisibleCtrs = Ctr1 Int | Ctr2 | Ctr3 Bool Bool