Known bugs in nhc98
Non-bugs
- Warning: nhc98 might produce faulty code here
- In fact, it no longer (to our knowledge) produces faulty code at the
point this warning is produced. But we were cautious about removing
the warning message, just in case.
- Warning: foreign import/export has non-primitive type:
Prelude.Integer
- The warning is accurate, but harmless if it occurs during a build
of the Prelude or Libraries. However, if it appears when you are
compiling your own code, it means you have probably made a mistake
using the primitive FFI.
Bugs by design :-)
- the monomorphism restriction
- is not implemented.
- the Unicode character set
- is not fully supported yet - internally, characters are 32-bits,
but Haskell source files are read in 8-bit UTF.
- Latin-ISO-8859-1 character set not fully supported
- Example program.
- Overloaded cafs are treated as functions (debatable "problem")
- Example program.
Unintended bugs :-(
- Large Integer bug in div/mod
- We believe this is a bug in an old version of the GMP library
used within nhc98's runtime system. It results in incorrect
values, then a segfault.
Test program.
- Strictness annotations on named-field labels
- are not implemented - although you can use strictness annotations
elsewhere.
- Precursor to one below
- Example program.
- Type checking: default declarations
- Example program.
- Importing qualified Prelude and then using an unqualified Prelude entity
- Example program.
- Contexts required in let-bindings
- Example program. This is
a consequence of the non-implementation of the monomorphism
restriction.
- Compiler crashes on large source files
- Very rarely, the compiler will crash on a large source file
with a ``pointer stack overflow'' or a ``heap overrun'', or sometimes
no message at all. As far as I can tell, this is a space fault in
the ansi-C backend, triggered only if nhc98 was built by hbc.
A workaround is to use the -noansiC
flag (provided you are using a machine for which we have direct
assembly language support, i.e. arm, hppa, sparc, x86, mips, alpha),
or to bootstrap nhc98 with itself, or with ghc.
- ghc-4.06 bug
- If you build nhc98 using ghc-4.06, all code using Floats and Doubles
is broken. This is due to a bug in ghc, fixed in 4.08. (Actually,
broken in 4.08 as well when -O optimisation is turned on.)
- Nhc performs no kind check in type definitions.
- Example program.
Fixed bugs :-)
- Nhc is too restrictive in rhs of newtype definitions
(fixed 2002-12-17)
- Example program. A too-strong
check for newtype circularity was responsible for this fault.
- Nhc does not handle data types with arguments of kind *->*
correctly
- Example program. There is an
error in the bug report! (f Fix f) should be
(f (Fix f)), and with this fix, nhc98 accepts the program.
- Import bugs (fixed 2001-10-19)
- An `import M' should bring both qualified and unqualified names into
scope, but nhc98 only made unqualified names are available unless
there was an additional explicit `import qualified M'.
- As-pattern bindings (fixed 2001-02-05)
- An @-pattern as argument to a function or lambda was okay,
but in a CAF pattern-binding, led either to wrong
results or a seg-fault. It turns out we were generating
type-incorrect code.
- Read/Show instances for named-fields (fixed 2000-06-14)
- did not show or read the label syntax, just the values.
- Runtime crashes on Array-based programs (fixed 2000-03-14)
- A program although it compiled, crashed intermittently at runtime,
sometimes with SegFaults, sometimes with other errors. This was
caused by an obscure Garbage Collection bug, because changing the
heap size altered the behaviour. Although we originally believed
that the Regexp library from Glasgow was the only known program to
tickle this bug, it turned out that other programs using Arrays
also suffered the same fate. The fix turned out to be a single
character change in the sources!
- Named fields (fixed 1999-07-27)
- Initialisation of a value using named fields failed to type-check
(error: typeExp) if some fields were missing.
- (n+k) patterns
- are finally supported by nhc98.
- Stable pointers in GreenCard (fixed 1999-02-17)
- used to be too strict - for instance passing the closure
error "message" into C-world as a stable pointer would
terminate a program immediately. They are now properly lazy -
a stable pointer to the closure error "message" now
terminates the program only if and when it is hauled back into
Haskell world and evaluated.
- Re-defining Prelude entities should strictly speaking cause an error
- Example program. Although this
was a bug in nhc13, Haskell 98 fixed it for us, by allowing
redefinition of imported entities.
- GreenCard parser (fixed 1998-11-03)
- did not notify syntax errors - it simply generated bogus
Haskell and C. (This was because the original GreenCard parser was
generated by Happy, which can only be used in conjunction with ghc.
For nhc13, we had been using a cheap and cheerful
parser combinator library without error-detection. We have now
added error-detection to the combinators.)
- GreenCard IO cafs
- A CAF (constant applicative form) of type IO a implemented
as a C-function via GreenCard is only evaluated once.
- Unknown instruction 199 (fixed 1998-08-27)
- A GreenCard-ed program which called C which called back to Haskell
which called out to C again would sometimes fail with this error.
The system simply forgot to stack the outward call contexts and
so returned to the wrong place.
- Prelude.product (fixed 1998-07-02)
- Incorrectly defined as foldl (*) 0, rather than
foldl (*) 1.
- Garbage collecting BinHandles (fixed 1998-07-02)
- When the GC collected a Memory BinHandle, it first tried to close
it, which occasionally called the GC again recursively, generating
a segmentation fault.
- multiple-precision integers (fixed 1998-04-07)
- The functions (>) and (>=) were semantically swapped for
multiple-precision integers (type Integer).
- GreenCard (fixed 1998-03-23)
- A C function of type () -> IO a was only ever called once
(and the result shared with all other calls), because the unit argument
was stripped, leaving a zero-arity CAF. This is now fixed so that
the unit argument is passed through, forcing re-evaluation with every
call.
- Binary library (fixed 1998-03-02)
- closeBin operation sometimes caused unexpected effects -
both closeBin and the garbage collector free'd the same
malloc'd memory
- Pattern matching with no fields against constructions with no fields
(fixed 1998-02-03)
- Example program.
- sparc space faults (fixed 1997-11-20)
- Occasionally GreenCard crashed horribly on the sparc architecture with
a segmentation fault, which went away if you
increased the heapsize. Also, programs compiled with -p on the sparc
crashed when you attempted to gather a runtime profile.
(UserGC structure allocated wrong amount of space.)
- Importing qualified names
- Example module.
Example program.
- Internal error on incorrect program
- Symptom: "0" where "t Int" should be.
Example program.
- Parsing an integer literal as a Double
- Example program.
- Strictness annotations combining with seq
- Example program.
- Parsing literal characters, e.g. read "'a'"
- Example program.
- Importing/exporting classes without any methods (pedantic)
- Example module.
Example program.
- Printing doubles less than 0.1
- Example program.
- Supplying a function to seq as its second argument
- Example program.
- Translating do-notation for a pattern of the form `[a]'
- Example program.
- Bizarre error on seq interacting with classes
- Example program.
- Using an imported renaming type to define a second renaming type
- Example module.
Example program.
- Nhc is too restrictive in rhs of newtype definitions
- Example program.
Reporting bugs
Please notify any bugs you find in any part of the nhc98
system to
nhc-bugs@haskell.org.
The latest updates to these pages are available on the WWW from
http://www.haskell.org/nhc98/
24th August 2005
York Functional Programming Group
|