Skip to content

Referencing a do-bound variable in a rec block with ApplicativeDo results in variable not in scope during type checking

I searched + hope this isn't a dupe.

When using both ApplicativeDo and RecursiveDo, referring to a do-bound variable from outside of a rec block causes a GHC internal error.

Here's a minimal example:

{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE RecursiveDo #-}

module Lib where

import Control.Monad.Fix

f :: MonadFix m => m ()
f = do
  a <- return ()
  rec
    let b = a
  return ()

The error message I get is

src/Lib.hs:12:13: error:
    • GHC internal error: ‘a’ is not in scope during type checking, but it passed the renamer
      tcl_env of environment: [a1pF :-> Type variable ‘m’ = m :: * -> *,
                               r1mX :-> Identifier[f::forall (m :: * -> *).
                                                      MonadFix m =>
                                                      m (), TopLevelLet [] True]]
    • In the expression: a
      In an equation for ‘b’: b = a
      In a stmt of a 'do' block: rec let b = a
   |
12 |     let b = a
   |             ^

I have reproduced it in 8.2.2 and 8.4.1

Trac metadata
Trac field Value
Version 8.2.2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information