[commit: ghc] master: rename: Add note describing #11216 (48a5da9)
git at git.haskell.org
git at git.haskell.org
Mon Dec 26 14:56:08 UTC 2016
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/48a5da9ac6abd42e713402bd38612ce6624cac1b/ghc
>---------------------------------------------------------------
commit 48a5da9ac6abd42e713402bd38612ce6624cac1b
Author: Ben Gamari <ben at smart-cactus.org>
Date: Fri Dec 23 18:09:40 2016 -0500
rename: Add note describing #11216
>---------------------------------------------------------------
48a5da9ac6abd42e713402bd38612ce6624cac1b
compiler/rename/RnExpr.hs | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/compiler/rename/RnExpr.hs b/compiler/rename/RnExpr.hs
index 5427579..811ecba 100644
--- a/compiler/rename/RnExpr.hs
+++ b/compiler/rename/RnExpr.hs
@@ -763,6 +763,25 @@ rnStmtsWithFreeVars ctxt rnBody (lstmt@(L loc _) : lstmts) thing_inside
; return (((stmts1 ++ stmts2), thing), fvs) }
----------------------
+
+{-
+Note [Failing pattern matches in Stmts]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Many things desugar to HsStmts including monadic things like `do` and `mdo`
+statements, pattern guards, and list comprehensions (see 'HsStmtContext' for an
+exhaustive list). How we deal with pattern match failure is context-dependent.
+
+ * In the case of list comprehensions and pattern guards we don't need any 'fail'
+ function; the desugarer ignores the fail function field of 'BindStmt' entirely.
+ * In the case of monadic contexts (e.g. monad comprehensions, do, and mdo
+ expressions) we want pattern match failure to be desugared to the appropriate
+ 'fail' function (either that of Monad or MonadFail, depending on whether
+ -XMonadFailDesugaring is enabled.)
+
+At one point we failed to make this distinction, leading to #11216.
+-}
+
rnStmt :: Outputable (body RdrName)
=> HsStmtContext Name
-> (Located (body RdrName) -> RnM (Located (body Name), FreeVars))
@@ -805,13 +824,12 @@ rnStmt ctxt rnBody (L loc (BindStmt pat body _ _ _)) thing_inside
; xMonadFailEnabled <- fmap (xopt LangExt.MonadFailDesugaring) getDynFlags
; let getFailFunction
-- For non-monadic contexts (e.g. guard patterns, list
- -- comprehensions, etc.) we should not need to fail
+ -- comprehensions, etc.) we should not need to fail.
+ -- See Note [Failing pattern matches in Stmts]
| not (isMonadFailStmtContext ctxt)
- = return (err, emptyFVs)
+ = return (noSyntaxExpr, emptyFVs)
| xMonadFailEnabled = lookupSyntaxName failMName
| otherwise = lookupSyntaxName failMName_preMFP
- where err = pprPanic "rnStmt: fail function forced"
- (text "context:" <+> ppr ctxt)
; (fail_op, fvs2) <- getFailFunction
; rnPat (StmtCtxt ctxt) pat $ \ pat' -> do
More information about the ghc-commits
mailing list