Drop module qualifier from punned record fields (#11662)
authorAdam Gundry <adam@well-typed.com>
Sat, 5 Mar 2016 19:02:32 +0000 (20:02 +0100)
committerBen Gamari <ben@smart-cactus.org>
Sat, 5 Mar 2016 19:02:33 +0000 (20:02 +0100)
A record pattern match, construction or update like
`Rec { Mod.f }` should expand to `Rec { Mod.f = f }` rather
than `Rec { Mod.f = Mod.f }`.

Test Plan: New test rename/should_compile/T11662

Reviewers: austin, bgamari

Reviewed By: bgamari

Subscribers: hesselink, thomie

Differential Revision: https://phabricator.haskell.org/D1965

GHC Trac Issues: #11662

compiler/rename/RnPat.hs
testsuite/tests/rename/should_compile/T11662.hs [new file with mode: 0644]
testsuite/tests/rename/should_compile/T11662_A.hs [new file with mode: 0644]
testsuite/tests/rename/should_compile/all.T

index eab3090..98ca38b 100644 (file)
@@ -561,7 +561,9 @@ rnHsRecFields ctxt mk_arg (HsRecFields { rec_flds = flds, rec_dotdot = dotdot })
       = do { sel <- setSrcSpan loc $ lookupRecFieldOcc parent doc lbl
            ; arg' <- if pun
                      then do { checkErr pun_ok (badPun (L loc lbl))
-                             ; return (L loc (mk_arg loc lbl)) }
+                               -- Discard any module qualifier (#11662)
+                             ; let arg_rdr = mkRdrUnqual (rdrNameOcc lbl)
+                             ; return (L loc (mk_arg loc arg_rdr)) }
                      else return arg
            ; return (L l (HsRecField { hsRecFieldLbl
                                          = L loc (FieldOcc (L ll lbl) sel)
@@ -689,7 +691,9 @@ rnHsRecUpdFields flds
                           else fmap Left $ lookupGlobalOccRn lbl
            ; arg' <- if pun
                      then do { checkErr pun_ok (badPun (L loc lbl))
-                             ; return (L loc (HsVar (L loc lbl))) }
+                               -- Discard any module qualifier (#11662)
+                             ; let arg_rdr = mkRdrUnqual (rdrNameOcc lbl)
+                             ; return (L loc (HsVar (L loc arg_rdr))) }
                      else return arg
            ; (arg'', fvs) <- rnLExpr arg'
 
diff --git a/testsuite/tests/rename/should_compile/T11662.hs b/testsuite/tests/rename/should_compile/T11662.hs
new file mode 100644 (file)
index 0000000..e9afda0
--- /dev/null
@@ -0,0 +1,14 @@
+{-# LANGUAGE NamedFieldPuns #-}
+module T11662 where
+
+import T11662_A (Rec (Rec))
+import qualified T11662_A
+
+g :: Rec -> Integer
+g (Rec { T11662_A.f }) = f
+
+h :: Integer -> Rec -> Rec
+h f r = r { T11662_A.f }
+
+k :: Integer -> Rec
+k f = Rec { T11662_A.f }
diff --git a/testsuite/tests/rename/should_compile/T11662_A.hs b/testsuite/tests/rename/should_compile/T11662_A.hs
new file mode 100644 (file)
index 0000000..1d4f625
--- /dev/null
@@ -0,0 +1,3 @@
+module T11662_A where
+
+data Rec = Rec { f :: Integer }
index 65f92e2..ede9f19 100644 (file)
@@ -233,3 +233,7 @@ test('T11164',
 test('T11167', normal, compile, [''])
 test('T11167_ambig', normal, compile, [''])
 test('T10625', normal, compile, [''])
+test('T11662',
+     [extra_clean(['T11662_A.hi', 'T11662_A.o'])],
+     multimod_compile,
+     ['T11662', '-v0'])