Hi café,

I observe that rewrite rules from imported modules are ignored by GHC. Given these two files, one module and one executable, the problem can be demonstrated by switching between `rewrite_me` and `rewrite_me_local`. If the rule fires, the program should run cleanly, as the `error` term should be rewritten to `()`. The imported function rewrite_me is not rewritten; but the same thing, rewrite_me_local, defined in the same program, will be rewritten.

File RuleModule.hs

    module RuleModule where

    {-# NOINLINE rewrite_me #-}
    rewrite_me :: () -> ()
    rewrite_me = error "Should rewrite"

    {-# RULES
    "rewrite_me" forall input .
             rewrite_me input = ()
     #-}

File Rule.hs

    import RuleModule

    {-# NOINLINE rewrite_me_local #-}
    rewrite_me_local :: () -> ()
    rewrite_me_local = error "Should rewrite"

    {-# RULES
    "rewrite_local" forall input .
                    rewrite_me_local input = ()
     #-}

    -- Replace with rewrite_me_local and it's all good.
    main = case rewrite_me () of
        () -> return ()

This is GHC 7.10.2. I compile using -O -fenable-rewrite-rules.

Using -dverbose-core2core, the "Desugar (after optimization)" section shows no rules when using rewrite_me, but shows the rule rewrite_local when using the local variant. Maybe this is expected, but I thought it important to mention.

Thanks for any advice,

Alex