summaryrefslogtreecommitdiff
path: root/compiler/GHC/Core/SimpleOpt.hs
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2021-06-24 11:30:53 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-07-28 13:19:06 -0400
commit25ca0b5aef54281d161288d9d951a6325d0ab53f (patch)
tree2bb05e71d90b6a02c73820b6f7c66903992f4d07 /compiler/GHC/Core/SimpleOpt.hs
parent9dbab4fd5315569ad58d333fc0dd9312fd8512ac (diff)
downloadhaskell-25ca0b5aef54281d161288d9d951a6325d0ab53f.tar.gz
Extend the in-scope set to silence substExpr warnings
substExpr warns if it finds a LocalId that isn't in the in-scope set. This patch extends the in-scope set to silence the warnings. (It has no effect on behaviour.)
Diffstat (limited to 'compiler/GHC/Core/SimpleOpt.hs')
-rw-r--r--compiler/GHC/Core/SimpleOpt.hs14
1 files changed, 12 insertions, 2 deletions
diff --git a/compiler/GHC/Core/SimpleOpt.hs b/compiler/GHC/Core/SimpleOpt.hs
index 16906df1c1..47d2c3f454 100644
--- a/compiler/GHC/Core/SimpleOpt.hs
+++ b/compiler/GHC/Core/SimpleOpt.hs
@@ -1174,7 +1174,12 @@ exprIsConApp_maybe (in_scope, id_unf) expr
-- Look through dictionary functions; see Note [Unfolding DFuns]
| DFunUnfolding { df_bndrs = bndrs, df_con = con, df_args = dfun_args } <- unfolding
, bndrs `equalLength` args -- See Note [DFun arity check]
- , let subst = mkOpenSubst in_scope (bndrs `zip` args)
+ , let in_scope' = extend_in_scope (exprsFreeVars dfun_args)
+ subst = mkOpenSubst in_scope' (bndrs `zip` args)
+ -- We extend the in-scope set here to silence warnings from
+ -- substExpr when it finds not-in-scope Ids in dfun_args.
+ -- simplOptExpr initialises the in-scope set with exprFreeVars,
+ -- but that doesn't account for DFun unfoldings
= succeedWith in_scope floats $
pushCoDataCon con (map (substExpr subst) dfun_args) co
@@ -1185,7 +1190,7 @@ exprIsConApp_maybe (in_scope, id_unf) expr
-- CPR'd workers getting inlined back into their wrappers,
| idArity fun == 0
, Just rhs <- expandUnfolding_maybe unfolding
- , let in_scope' = extendInScopeSetSet in_scope (exprFreeVars rhs)
+ , let in_scope' = extend_in_scope (exprFreeVars rhs)
= go (Left in_scope') floats rhs cont
-- See Note [exprIsConApp_maybe on literal strings]
@@ -1197,6 +1202,11 @@ exprIsConApp_maybe (in_scope, id_unf) expr
dealWithStringLiteral fun str co
where
unfolding = id_unf fun
+ extend_in_scope unf_fvs
+ | isLocalId fun = in_scope `extendInScopeSetSet` unf_fvs
+ | otherwise = in_scope
+ -- A GlobalId has no (LocalId) free variables; and the
+ -- in-scope set tracks only LocalIds
go _ _ _ _ = Nothing