Cross-module SPECIALZE pragmas aren't typechecked in -O0
If a module defines a SPECIALIZE pragma for a value defined in another module, then the signature of this pragma won't be typecheck by ghc -O0 (but it will be if the SPECIALIZE pragma is in the same module as the value).
For example, given
-- Foo.hs
module Foo where
foo :: a -> a
foo = id
----------
-- Bar.hs
module Bar where
import Foo
{-# SPECIALIZE foo :: Int -> Bool #-}
running ghc --make Bar.hs will run fine, while ghc --make -O2 Bar.hs will complain:
Bar.hs:5:1: error:
• Couldn't match type ‘Bool’ with ‘Int’
Expected type: Int -> Int
Actual type: Int -> Bool
• In the SPECIALISE pragma {-# SPECIALIZE foo :: Int -> Bool #-}
|
5 | {-# SPECIALIZE foo :: Int -> Bool #-}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Tested on ghc 8.6.1 and 8.4.3
Trac metadata
| Trac field | Value |
|---|---|
| Version | 8.6.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler (Type checker) |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |