Skip to content

Typechecker sometimes doesn't preserve HsPar in original source.

The typechecker doesn't preserve parenthesis that occur at the head of applications.

This results in some weird SrcSpans in the TypecheckedSource

For example, given code

foo a b c = (bar a) b c

The typechecker will emit an HsApp with head spanning over bar a) b and tail spanning over c. Notice that the opening parenthesis is not included.

On the other hand, the renamer will generate the expected SrcSpans that always include both parenthesis, or neither. This becomes an issue when you want to associate RenamedSource with its corresponding TypecheckedSource, as the SrcSpans no longer match and overlap partially.

This occurs due to this line in TcExpr.hs

tcApp m_herald (L _ (HsPar _ fun)) args res_ty
  = tcApp m_herald fun args res_ty

I have a work in progress fix here: https://github.com/wz1000/ghc/commit/3b6db5a35dc8677a7187e349a85ffd51f452452a

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