Skip to content

Bad error message for a misaligned case block in a do-let expression

Consider the following code:

main = do
  code <- getCode
  let value = case code of
     1 -> 2
     3 -> 4
     _ -> 5
  print value

This is a parse error, as the indent of the case statements is under the indent introduced by let. However, the error message on 8.6 onwards is very misleading:

/home/dkr/example/Bad.hs:2:8: error:
    Unexpected do block in function application:
        do code <- getCode
           let value = ...
    You could write it with parentheses
    Or perhaps you meant to enable BlockArguments?
  |
2 | main = do
  |        ^^...

Compare this with 8.4, which is a bit less bad:

/home/dkr/example/Bad.hs:5:6: error: parse error on input ‘1’
  |
5 |      1 -> 2
  |      ^
Trac metadata
Trac field Value
Version 8.6.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