Skip to content

Take subordinate 'type' specifiers into account (#22581, #25983, #25984, #25991)

Vladislav Zavialov requested to merge wip/int-index/enforce-namespaces into master

This patch fixes multiple bugs (#22581 (closed), #25983 (closed), #25984 (closed), #25991 (closed)) in name resolution of subordinate import lists.

Bug #22581 (closed)

In subordinate import lists, the use of the type namespace specifier used to be ignored. For example, this import statement was incorrectly accepted:

import Prelude (Bool(type True))

Now it results in an error message:

<interactive>:2:17: error: [GHC-51433]
  In the import of ‘Prelude’:
    a data type called ‘Bool’ is exported,
    but its subordinate item ‘True’ is not in the type namespace.

Bug #25983 (closed)

In subordinate import lists within a hiding clause, non-existent items led to a poor warning message with -Wdodgy-imports. Consider:

import Prelude hiding (Bool(X))

The warning message for this import statement used to misreport the cause of the problem:

<interactive>:3:24: warning: [GHC-56449] [-Wdodgy-imports]
  In the import of ‘Prelude’:
    an item called ‘Bool’ is exported, but it is a type.

Now the warning message is correct:

<interactive>:2:24: warning: [GHC-10237] [-Wdodgy-imports]
  In the import of ‘Prelude’:
    a data type called ‘Bool’ is exported, but it does not export
    any constructors or record fields called ‘X’.

Bug #25984 (closed)

In subordinate import lists within a hiding clause, non-existent items resulted in the entire import declaration being discarded. For example, this program was incorrectly accepted:

import Prelude hiding (Bool(True,X))
t = True

Now it results in an error message:

<interactive>:2:5: error: [GHC-88464]
  Data constructor not in scope: True

Bug #25991 (closed)

In subordinate import lists, it was not possible to refer to a class method if there was an associated type of the same name:

module M_helper where
  class C a b where
    type a # b
    (#) :: a -> b -> ()

module M where
  import M_helper (C((#)))

This import declaration failed with:

M.hs:2:28: error: [GHC-10237]
  In the import of ‘M_helper’:
    an item called ‘C’ is exported, but it does not export any children
    (constructors, class methods or field names) called ‘#’.

Now it is accepted.

Summary

The changes required to fix these bugs are almost entirely confined to GHC.Rename.Names. Other than that, there is a new error constructor BadImportNonTypeSubordinates with error code [GHC-51433].

Test cases: T22581a T22581b T22581c T22581d T25983 T25984a T25984b T25991a T25991b1 T25991b2

Edited by Vladislav Zavialov

Merge request reports

Loading