[GHC] #8426: one-shot compilation + TH doesn't see instances that is seen in batch mode
GHC
ghc-devs
Wed Oct 9 09:54:28 UTC 2013
#8426: one-shot compilation + TH doesn't see instances that is seen in batch mode
----------------------------------------------+----------------------------
Reporter: errge | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Template Haskell | Version: 7.6.3
Keywords: | Operating System:
Architecture: Unknown/Multiple | Unknown/Multiple
Difficulty: Moderate (less than a day) | Type of failure: Other
Blocked By: | Test Case:
Related Tickets: #7867 | Blocking:
----------------------------------------------+----------------------------
Haskell prime and Haskell98 both states that instances are always seen if
there is any chain of imports leading from the current module to the
instance.
http://darcs.haskell.org/haskell-prime-report/report/haskell-report-
html/modules.html#import-instances
The ghc manual contains a discussion why this specification is too
performance heavy to n?ively implement and contains the definition of
orphanness and an algorithm to reproduce the specification with better
performance.
http://www.haskell.org/ghc/docs/7.6.3/html/users_guide/separate-
compilation.html#orphan-modules
Unfortunately this cleverness breaks template haskell. Namely, if:
- `Class.hs` contains a class,
- `NonOrphan.hs` contains a data that implements the class,
- `Importer.hs` just imports `NonOrphan.hs`,
- `Main.hs` imports `Importer.hs`,
- `Main.hs` reifies the class;
then:
- one-shot compilation's reify doesn't see the instance,
- batch compilation's reify sees the instance.
This ambiguity is shown in the attached tgz.
Furthermore if `NonOrphan.hs` is in a separate package, then of course
even batch compilation mode wouldn't reify the instance correctly. In
that case there is no disambiguity between one-shot and batch, simply both
is missing the info.
I propose to solve this by enforcing a loading of all the interface files
for every import transitively for the current module, when we meet an open
type family or class reification request in template haskell's reify
handler in `TcSplice.hs`.
So I propose to keep the optimization of orphan instances and use it 99.9%
of the time. We would only ever go on the quest of reading interface
files for every import transitively when the user tries to reify something
where we have to return an instance list. This means that TH compilations
that reify types will get a little bit slower in exchange of being correct
and unambiguous. Compilation time in cases when TH reification is not
used will not change.
I volunteer to prepare the patch, but would like to hear others first.
So, any opinions, alternative ideas?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8426>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list