Ticket #2169 (closed bug: fixed)
Compilation fails first time without giving an error, later succeeds without changing code
| Reported by: | nccb | Owned by: | |
|---|---|---|---|
| Priority: | normal | Milestone: | 6.10.1 |
| Component: | Compiler | Version: | 6.8.2 |
| Keywords: | Cc: | ||
| Operating System: | Linux | Architecture: | x86_64 (amd64) |
| Type of failure: | Difficulty: | Unknown | |
| Test Case: | Blocked By: | ||
| Blocking: | Related Tickets: |
Description
There is one particular module in our Haskell project that causes GHC to act oddly. We compile using GHC --make Main, and compilation on this particular module often fails on the first attempt. There are no errors given, just a lot of warnings of the form "Defined but not used: ..." (we are *not* using -Werror anywhere). All these warnings are about unused bindings (e.g. foo x y = x, gives unused warning about y) -- even though we don't use the -fwarn-unused-matches option anywhere, nor -Wall.
If you then try to execute the same command several times, it usually succeeds on around the fourth attempt, without altering anything whatsoever. This bug is persistent -- it happens often, usually from a clean start (of compiling the whole project).
The command used for GHC is:
ghc $(GHC_OPTS) -o tock$(EXEEXT) --make Main -odir obj -hidir obj
where:
GHC_OPTS = \ -fglasgow-exts \ -fwarn-deprecations \ -fwarn-duplicate-exports \ -fwarn-incomplete-record-updates \ -fwarn-missing-fields \ -fwarn-missing-methods \ -fwarn-missing-signatures \ -fwarn-overlapping-patterns \ -fwarn-simple-patterns \ -fwarn-type-defaults \ -fwarn-unused-binds \ -fwarn-unused-imports \ -ibackends -ichecks -icommon -idata -iflow -ifrontends -ipass -itransformations \ -v -dcore-lint -XUndecidableInstances -fwarn-tabs -fwarn-monomorphism-restriction
(The -v and -dcore-lint flags were added to try and track down the bug). Output from the failed compilation is as follows:
compile: input file flow/FlowGraph.hs
*** Checking old interface for main:FlowGraph:
[42 of 51] Compiling FlowGraph ( flow/FlowGraph.hs, obj/FlowGraph.o )
*** Parser:
*** Renamer/typechecker:
flow/FlowGraph.hs:274:10: Warning: Defined but not used: `m'
flow/FlowGraph.hs:322:26: Warning: Defined but not used: `m'
flow/FlowGraph.hs:334:40: Warning: Defined but not used: `m'
flow/FlowGraph.hs:339:36: Warning: Defined but not used: `m'
flow/FlowGraph.hs:339:38: Warning: Defined but not used: `rep'
flow/FlowGraph.hs:357:31:
Warning: Defined but not used: `outStartA'
flow/FlowGraph.hs:375:27: Warning: Defined but not used: `m'
flow/FlowGraph.hs:383:26: Warning: Defined but not used: `str'
flow/FlowGraph.hs:383:31: Warning: Defined but not used: `route'
flow/FlowGraph.hs:391:27: Warning: Defined but not used: `m'
flow/FlowGraph.hs:398:26: Warning: Defined but not used: `m'
flow/FlowGraph.hs:415:49: Warning: Defined but not used: `m'
flow/FlowGraph.hs:419:19: Warning: Defined but not used: `pId'
flow/FlowGraph.hs:419:24: Warning: Defined but not used: `nStart'
flow/FlowGraph.hs:419:32: Warning: Defined but not used: `nEnd'
flow/FlowGraph.hs:419:46: Warning: Defined but not used: `m'
flow/FlowGraph.hs:430:19: Warning: Defined but not used: `pId'
flow/FlowGraph.hs:430:24: Warning: Defined but not used: `nStart'
flow/FlowGraph.hs:430:32: Warning: Defined but not used: `nEnd'
flow/FlowGraph.hs:443:19: Warning: Defined but not used: `pId'
flow/FlowGraph.hs:443:24: Warning: Defined but not used: `nStart'
flow/FlowGraph.hs:443:32: Warning: Defined but not used: `nEnd'
flow/FlowGraph.hs:509:46: Warning: Defined but not used: `m'
flow/FlowGraph.hs:557:20: Warning: Defined but not used: `m'
*** Deleting temp files:
Deleting: /tmp/ghc2747_0/ghc2747_0.s
Warning: deleting non-existent /tmp/ghc2747_0/ghc2747_0.s
Upsweep partially successful.
*** Deleting temp files:
Deleting:
link(batch): upsweep (partially) failed OR
Main.main not exported; not linking.
*** Deleting temp files:
Deleting: /tmp/ghc2747_0/ghc2747_1.hscpp /tmp/ghc2747_0/ghc2747_0.hscpp
*** Deleting temp dirs:
Deleting: /tmp/ghc2747_0
make[1]: *** [tock] Error 1
make[1]: Leaving directory `/home/neil/work/tock/branches/ghc-bug'
make: *** [all] Error 2
When the compilation later succeeds the output is as follows:
compile: input file flow/FlowGraph.hs
*** Checking old interface for main:FlowGraph:
[42 of 51] Compiling FlowGraph ( flow/FlowGraph.hs, obj/FlowGraph.o )
*** Parser:
*** Renamer/typechecker:
*** Desugar:
Result size = 11538
*** Core Linted result of Desugar:
*** Simplify:
Result size = 8648
*** Core Linted result of Simplifier phase 0, iteration 1 out of 4:
Result size = 7809
*** Core Linted result of Simplifier phase 0, iteration 2 out of 4:
Result size = 7797
*** Core Linted result of Simplifier phase 0, iteration 3 out of 4:
Result size = 7797
*** Core Linted result of Simplify phase 0 done:
*** Tidy Core:
Result size = 7959
*** Core Linted result of Tidy Core:
writeBinIface: 37 Names
writeBinIface: 167 dict entries
*** CorePrep:
Result size = 9571
*** Core Linted result of CorePrep:
*** Stg2Stg:
*** CodeGen:
*** CodeOutput:
*** Assembler:
gcc -march=athlon64 -Wa,--noexecstack -Iflow -c /tmp/ghc3185_0/ghc3185_0.s -o obj/FlowGraph.o
*** Deleting temp files:
Deleting: /tmp/ghc3185_0/ghc3185_0.s
The code in question is from http://offog.org/darcs/tock/ (version as of 22/3/08 4pm) -- I don't think it would easy to isolate the problem. The module in question (flow/FlowGraph.hs) can be found there.

