Enabling a pure Plugin with existing build output never triggers recompilation
Consider the following compilation session:
$ ghc -fplugin ImpurePlugin Foo.hs
<Compiles Foo.hs>
$ ghc Foo.hs
where ImpurePlugin is a Plugin
which returns ForceRecompile
in pluginRecompile
.
The second invocation of GHC doesn't recompile even though ImpurePlugin
could have changed the generated build output which would now be out of date.
The same thing happens when switching from an impure/fingerprinted plugin to a pure plugin.
The problem is that pluginRecompileToRecompileRequired
just assumes no compilation is required when the current plugin stack is pure, that is either only pure plugins or no plugins at all are registered:
pluginRecompileToRecompileRequired :: Fingerprint -> PluginRecompile -> RecompileRequired
pluginRecompileToRecompileRequired old_fp pr =
case pr of
NoForceRecompile -> UpToDate
ForceRecompile -> RecompBecause "Plugin forced recompilation"
MaybeRecompile fp -> if fp == old_fp then UpToDate
note the UpToDate
in the NoForceRecompile
case.
Furthermore I would argue that even switching from having no plugin at all active to having a pure plugin active should trigger recompilation, even though the plugin might be pure it could still choose to affect the build output after all.
Trac metadata
Trac field | Value |
---|---|
Version | 8.7 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |