diff options
| author | sheaf <sam.derbyshire@gmail.com> | 2022-03-01 12:45:16 +0100 |
|---|---|---|
| committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-03-01 16:23:51 -0500 |
| commit | 7aeb6d29313b23cd8d4da5d42cd9e740cca5c1df (patch) | |
| tree | 3bb2a6b1133b1bdcd453f8a0f139cd4d923176cb /compiler/GHC | |
| parent | c84dc5065bcf5c87dd3d10421c99aa6941754f57 (diff) | |
| download | haskell-7aeb6d29313b23cd8d4da5d42cd9e740cca5c1df.tar.gz | |
Core Lint: collect args through floatable ticks
We were not looking through floatable ticks when collecting arguments in
Core Lint, which caused `checkCanEtaExpand` to fail on something like:
```haskell
reallyUnsafePtrEquality
= \ @a ->
(src<loc> reallyUnsafePtrEquality#)
@Lifted @a @Lifted @a
```
We fix this by using `collectArgsTicks tickishFloatable` instead of
`collectArgs`, to be consistent with the behaviour of eta expansion
outlined in Note [Eta expansion and source notes] in GHC.Core.Opt.Arity.
Fixes #21152.
Diffstat (limited to 'compiler/GHC')
| -rw-r--r-- | compiler/GHC/Core/Lint.hs | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/compiler/GHC/Core/Lint.hs b/compiler/GHC/Core/Lint.hs index 688b63ff55..32d109b2f1 100644 --- a/compiler/GHC/Core/Lint.hs +++ b/compiler/GHC/Core/Lint.hs @@ -945,7 +945,17 @@ lintCoreExpr e@(App _ _) ; checkCanEtaExpand fun args app_ty ; return app_pair} where - (fun, args) = collectArgs e + (fun, args, _source_ticks) = collectArgsTicks tickishFloatable e + -- We must look through source ticks to avoid #21152, for example: + -- + -- reallyUnsafePtrEquality + -- = \ @a -> + -- (src<loc> reallyUnsafePtrEquality#) + -- @Lifted @a @Lifted @a + -- + -- To do this, we use `collectArgsTicks tickishFloatable` to match + -- the eta expansion behaviour, as per Note [Eta expansion and source notes] + -- in GHC.Core.Opt.Arity. lintCoreExpr (Lam var expr) = markAllJoinsBad $ |
