diff options
author | Ben Gamari <bgamari.foss@gmail.com> | 2017-09-13 12:22:27 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2017-09-13 16:54:22 -0400 |
commit | 10a1a4781c646f81ca9e2ef7a2585df2cbe3a014 (patch) | |
tree | 8638418f2e91b636c39dc941c7be97a7fcc02968 /compiler/basicTypes/Demand.hs | |
parent | 4cead3c1d5bf1c5f3cfb1898fd9d618674292f4b (diff) | |
download | haskell-10a1a4781c646f81ca9e2ef7a2585df2cbe3a014.tar.gz |
Model divergence of retry# as ThrowsExn, not Diverges
The demand signature of the retry# primop previously had a Diverges
result. However, this caused the demand analyser to conclude that a
program of the shape,
catchRetry# (... >> retry#)
would diverge. Of course, this is plainly wrong; catchRetry#'s sole
reason to exist is to "catch" the "exception" thrown by retry#. While
catchRetry#'s demand signature correctly had the ExnStr flag set on its
first argument, indicating that it should catch divergence, the logic
associated with this flag doesn't apply to Diverges results. This
resulted in #14171.
The solution here is to treat the divergence of retry# as an exception.
Namely, give it a result type of ThrowsExn rather than Diverges.
Updates stm submodule for tests.
Test Plan: Validate with T14171
Reviewers: simonpj, austin
Subscribers: rwbarton, thomie
GHC Trac Issues: #14171, #8091
Differential Revision: https://phabricator.haskell.org/D3919
Diffstat (limited to 'compiler/basicTypes/Demand.hs')
-rw-r--r-- | compiler/basicTypes/Demand.hs | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/compiler/basicTypes/Demand.hs b/compiler/basicTypes/Demand.hs index dfff0a2c92..3a83cd9fd5 100644 --- a/compiler/basicTypes/Demand.hs +++ b/compiler/basicTypes/Demand.hs @@ -1440,6 +1440,7 @@ postProcessDmdType du@(JD { sd = ss }) (DmdType fv _ res_ty) postProcessDmdResult :: Str () -> DmdResult -> DmdResult postProcessDmdResult Lazy _ = topRes postProcessDmdResult (Str ExnStr _) ThrowsExn = topRes -- Key point! +-- Note that only ThrowsExn results can be caught, not Diverges postProcessDmdResult _ res = res postProcessDmdEnv :: DmdShell -> DmdEnv -> DmdEnv |