summaryrefslogtreecommitdiff
path: root/compiler/rename/RnPat.lhs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rename/RnPat.lhs')
-rw-r--r--compiler/rename/RnPat.lhs21
1 files changed, 16 insertions, 5 deletions
diff --git a/compiler/rename/RnPat.lhs b/compiler/rename/RnPat.lhs
index 9738585aa4..a039f36b25 100644
--- a/compiler/rename/RnPat.lhs
+++ b/compiler/rename/RnPat.lhs
@@ -61,6 +61,8 @@ import SrcLoc
import FastString
import Literal ( inCharRange )
import Control.Monad ( when )
+import TysWiredIn ( nilDataCon )
+import DataCon ( dataConName )
\end{code}
@@ -375,11 +377,20 @@ rnPatAndThen mk p@(ViewPat expr pat ty)
rnPatAndThen mk (ConPatIn con stuff)
-- rnConPatAndThen takes care of reconstructing the pattern
- = rnConPatAndThen mk con stuff
-
-rnPatAndThen mk (ListPat pats _)
- = do { pats' <- rnLPatsAndThen mk pats
- ; return (ListPat pats' placeHolderType) }
+ -- The pattern for the empty list needs to be replaced by an empty explicit list pattern when overloaded lists is turned on.
+ = case unLoc con == nameRdrName (dataConName nilDataCon) of
+ True -> do { ol_flag <- liftCps $ xoptM Opt_OverloadedLists
+ ; if ol_flag then rnPatAndThen mk (ListPat [] placeHolderType Nothing)
+ else rnConPatAndThen mk con stuff}
+ False -> rnConPatAndThen mk con stuff
+
+rnPatAndThen mk (ListPat pats _ _)
+ = do { opt_OverloadedLists <- liftCps $ xoptM Opt_OverloadedLists
+ ; pats' <- rnLPatsAndThen mk pats
+ ; case opt_OverloadedLists of
+ True -> do { (to_list_name,_) <- liftCps $ lookupSyntaxName toListName
+ ; return (ListPat pats' placeHolderType (Just (placeHolderType, to_list_name)))}
+ False -> return (ListPat pats' placeHolderType Nothing) }
rnPatAndThen mk (PArrPat pats _)
= do { pats' <- rnLPatsAndThen mk pats