4. Release notes for version 8.0.2¶
The significant changes to the various parts of the compiler are listed in the following sections. There have also been numerous bug fixes and performance improvements over the 8.0.1 release.
Warning
Only Cabal versions 1.24 and newer will function properly with this release.
(see Trac #11558). Consequently it will likely be necessary to
recompile cabal-install
before installing new packages.
The reason for this is a change in how packages are identified in GHC
8.0. While previous versions of Cabal identified packages to GHC with a
package key (with GHC’s -this-package-key
argument), GHC 8.0 and
later uses installed package IDs in place of package keys.
Note
Users compiling GHC on Mac OS X with XCode 7.3 will need to tell the build
system to use the nm-classic
command instead of Apple’s new nm
implementation as the latter breaks POSIX compliance (see
Trac #11744). This can be done by passing something like
--with-nm=$(xcrun --find nm-classic)
to configure
.
4.1. Highlights¶
The highlights, since the 8.0.1 release, are:
- Compatibility fixes with macOS Sierra and recent Linux distributions.
- Many, many bug fixes.
- A bug has been fixed that caused standalone derived
Ix
instances to fail for GADTs with exactly one constructor (Trac #12583). - Interface files produced by GHC should now be deterministic.
4.2. Full details¶
4.2.1. Language¶
A bug has been fixed that caused derived
Show
instances to fail in the presence of-XRebindableSyntax
and-XOverloadedStrings
(Trac #12688).GHC is now a bit more strict in typechecking code generated by
-XGeneralizedNewtypeDeriving
. For example, GHC will now reject this program:class C m where foo :: C m => m () newtype N m a = N (m a) deriving C -- This is now an error
This is in contrast to GHC 8.0.1 and earlier, which would accept this code. To fix this code, simply remove the
C m
constraint fromfoo
, as it is wholly unnecessary:class C m where foo :: m ()
Some programs using
-XDefaultSignatures
that incorrectly type-checked in GHC 8.0.1 are now rejected by GHC 8.0.2. Here is a characteristic example:class Monad m => MonadSupply m where fresh :: m Integer default fresh :: (MonadTrans t, MonadSupply m) => t m Integer fresh = lift fresh instance MonadSupply m => MonadSupply (IdentityT m)
Note that the
m
in the default type signature is being used in a completely different way than them
in the non-default signature! We can fix this (in a backwards-compatible way) like so:class Monad m => MonadSupply m where fresh :: m Integer default fresh :: (MonadTrans t, MonadSupply m', m ~ t m') => m Integer -- Same 'm Integer' after the '=>' fresh = lift fresh
Some programs which combine default type class method implementations and overlapping instances may now fail to type-check. Here is an example:
class Foo a where foo :: a -> [a] foo _ = [] instance Foo a instance Foo Int
The problem is that the overlapping
Foo Int
instance is not explicitly marked as overlapping. To fix this, simply add anOVERLAPPING
pragma:instance {-# OVERLAPPING #-} Foo Int
GHC now adheres more closely to the Haskell 2010 Report with respect to defaulting rules. As a result, GHC will now reject some defaulting rules which GHC 8.0.1 and earlier would accept. For example, this is now rejected
module Foo where default (Bool)
because when the
-XExtendedDefaultRules
extension is not enabled, defaulting rules only work for theNum
class, of whichBool
is not an instance. To make GHC accept the above program, simply enable the-XExtendedDefaultRules
extension.
4.2.2. Compiler¶
A compiler bug present in 8.0.1 resulting in undefined reference errors while compiling some packages has been fixed. (see Trac #12076).
A code generator bug which resulted in segmentation faults in compiled programs has been fixed (see Trac #12757).
GHC now supports systems whose C compiler produces position-independent executables by default. (see Trac #12579).
GHC can now be built on systems which use the
gold
linker by default (see Trac #12816).GHC now reliably runs on macOS Sierra systems. Sierra introduced a linker limitation which GHC occassionally surpassed when compiling programs with many package dependencies. (see Trac #12479).
The
-Wredundant-constraints
flag has been removed from the-Wall
flag set (see Trac #10635).Added
-fdefer-out-of-scope-variables
, which converts out-of-scope variable errors into warnings.The RTS
-xb
now reads the base heap address in any base, defaulting to decimal, hexadecimal if the address starts with0x
, and octal if the address starts with0
.Due to an oversight in GHC 8.0.1, the value of the preprocessor macro
__GLASGOW_HASKELL_LLVM__
, which exposes the LLVM version used by GHC, was no longer an integer. This value is now turned into an integer again, but the formatting is changed to be in line with__GLASGOW_HASKELL__
(Trac #12628).Parallel programs should be significantly more reliable on platforms with weak memory consistency guarantees (Trac #12469)
Interface files should now be bit-wise identical for a given build. (Trac #4012)
- Nearly two-hundred more bugs. See `Trac
<https://ghc.haskell.org/trac/ghc/query?status=closed&milestone=8.0.2&col=id&col=summary&col=status&col=type&col=priority&col=milestone&col=component&order=priority>`_ for a complete list.
4.2.3. Runtime system¶
- The Runtime linker on Windows is once again recognizing POSIX functions under their “deprecated” name. e.g. “strdup” will now be recognized and internally forwarded to “_strdup”. If you have existing code already using the correct names (e.g. _strdup) then this will just continue to work and no change is needed. For more information about how the forwarding is done please see MSDN . This should now introduce the same behavior both compiled and interpreted. (see Trac #12497).
- Profiles from the cost-center profiler now provide source span information. (see Trac #11543).
- The number of threads used for garbage collection is now configurable
independently from the number of capabilities with the new
-qn
flag. - The runtime system should now wake-up less often with large capability counts
- The runtime system is now a more efficient in handling programs with many bound threads. (Trac #12419)
- A number of runtime system bugs which could result in crashes (see Trac #12728, Trac #10860, Trac #12019, Trac #11978, Trac #12038, Trac #12208)
4.2.4. Template Haskell¶
addModFinalizer
now exposes the local typing environment at the splice point. This allowsreify
to see local and top-level definitions in the current declaration group when used as inf x = $(addModFinalizer (reify 'x >>= runIO . print) >> [| x |])
4.2.5. ghc
library¶
- Accessors are now exposed for
ErrUtils.ErrMsg
andErrUtils.ErrDoc
. - There is now a
createIservProcessHook
to allow API users to redirect thestdout
andstderr
handles.