summaryrefslogtreecommitdiff
path: root/testsuite/tests
diff options
context:
space:
mode:
authorsheaf <sam.derbyshire@gmail.com>2023-03-17 12:48:21 +0100
committersheaf <sam.derbyshire@gmail.com>2023-03-29 13:57:33 +0200
commit3f374399e2dbebcdfe5bc31f94fc502b46d0cf4f (patch)
treea5103e3d597c2d724173e070a22759ce50a9d2e7 /testsuite/tests
parent76bb4c586084d7fdcf0e5ce52623abbfca527c55 (diff)
downloadhaskell-3f374399e2dbebcdfe5bc31f94fc502b46d0cf4f.tar.gz
Handle records in the renamer
This patch moves the field-based logic for disambiguating record updates to the renamer. The type-directed logic, scheduled for removal, remains in the typechecker. To do this properly (and fix the myriad of bugs surrounding the treatment of duplicate record fields), we took the following main steps: 1. Create GREInfo, a renamer-level equivalent to TyThing which stores information pertinent to the renamer. This allows us to uniformly treat imported and local Names in the renamer, as described in Note [GREInfo]. 2. Remove GreName. Instead of a GlobalRdrElt storing GreNames, which distinguished between normal names and field names, we now store simple Names in GlobalRdrElt, along with the new GREInfo information which allows us to recover the FieldLabel for record fields. 3. Add namespacing for record fields, within the OccNames themselves. This allows us to remove the mangling of duplicate field selectors. This change ensures we don't print mangled names to the user in error messages, and allows us to handle duplicate record fields in Template Haskell. 4. Move record disambiguation to the renamer, and operate on the level of data constructors instead, to handle #21443. The error message text for ambiguous record updates has also been changed to reflect that type-directed disambiguation is on the way out. (3) means that OccEnv is now a bit more complex: we first key on the textual name, which gives an inner map keyed on NameSpace: OccEnv a ~ FastStringEnv (UniqFM NameSpace a) Note that this change, along with (2), both increase the memory residency of GlobalRdrEnv = OccEnv [GlobalRdrElt], which causes a few tests to regress somewhat in compile-time allocation. Even though (3) simplified a lot of code (in particular the treatment of field selectors within Template Haskell and in error messages), it came with one important wrinkle: in the situation of -- M.hs-boot module M where { data A; foo :: A -> Int } -- M.hs module M where { data A = MkA { foo :: Int } } we have that M.hs-boot exports a variable foo, which is supposed to match with the record field foo that M exports. To solve this issue, we add a new impedance-matching binding to M foo{var} = foo{fld} This mimics the logic that existed already for impedance-binding DFunIds, but getting it right was a bit tricky. See Note [Record field impedance matching] in GHC.Tc.Module. We also needed to be careful to avoid introducing space leaks in GHCi. So we dehydrate the GlobalRdrEnv before storing it anywhere, e.g. in ModIface. This means stubbing out all the GREInfo fields, with the function forceGlobalRdrEnv. When we read it back in, we rehydrate with rehydrateGlobalRdrEnv. This robustly avoids any space leaks caused by retaining old type environments. Fixes #13352 #14848 #17381 #17551 #19664 #21443 #21444 #21720 #21898 #21946 #21959 #22125 #22160 #23010 #23062 #23063 Updates haddock submodule ------------------------- Metric Increase: MultiComponentModules MultiLayerModules MultiLayerModulesDefsGhci MultiLayerModulesNoCode T13701 T14697 hard_hole_fits -------------------------
Diffstat (limited to 'testsuite/tests')
-rw-r--r--testsuite/tests/backpack/reexport/T23080a.bkp9
-rw-r--r--testsuite/tests/backpack/reexport/T23080b.bkp9
-rw-r--r--testsuite/tests/backpack/reexport/all.T2
-rw-r--r--testsuite/tests/backpack/reexport/bkpreex05.bkp30
-rw-r--r--testsuite/tests/count-deps/CountDepsAst.stdout2
-rw-r--r--testsuite/tests/count-deps/CountDepsParser.stdout2
-rw-r--r--testsuite/tests/deriving/should_compile/T13919.stderr2
-rw-r--r--testsuite/tests/gadt/T18191.stderr26
-rw-r--r--testsuite/tests/ghci.debugger/scripts/break006.stderr4
-rw-r--r--testsuite/tests/ghci.debugger/scripts/print019.stderr2
-rw-r--r--testsuite/tests/ghci/scripts/T22125.script6
-rw-r--r--testsuite/tests/ghci/scripts/T22125.stdout1
-rw-r--r--testsuite/tests/ghci/scripts/T23062.script5
-rw-r--r--testsuite/tests/ghci/scripts/T23062.stdout1
-rwxr-xr-xtestsuite/tests/ghci/scripts/all.T2
-rw-r--r--testsuite/tests/ghci/scripts/ghci065.stdout8
-rw-r--r--testsuite/tests/linters/notes.stdout41
-rw-r--r--testsuite/tests/overloadedrecflds/ghci/GHCiDRF.stdout14
-rw-r--r--testsuite/tests/overloadedrecflds/ghci/T19664.hs14
-rw-r--r--testsuite/tests/overloadedrecflds/ghci/T19664.script2
-rw-r--r--testsuite/tests/overloadedrecflds/ghci/T19664.stdout1
-rw-r--r--testsuite/tests/overloadedrecflds/ghci/all.T1
-rw-r--r--testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.script3
-rw-r--r--testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.stdout21
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/BootFldReexport.hs8
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/BootFldReexport.stderr11
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_B.hs5
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_N.hs5
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_N.hs-boot2
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_O.hs5
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_O.hs-boot4
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/DupFldFixity1.hs9
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/DupFldFixity2.hs12
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/DupFldFixity3.hs9
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/NoDRFModuleExport.hs6
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/NoDRFModuleExport_aux.hs4
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_A.hs5
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_B.hs6
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_C.hs6
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T11103.hs (renamed from testsuite/tests/overloadedrecflds/should_fail/T11103.hs)6
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T13352.hs4
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T13352_A.hs2
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T13352_B.hs2
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T13352_hard.hs4
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T13352_hard.stderr9
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T13352_hard_A.hs3
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T13352_hard_B.hs3
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T14848.hs10
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T17551.hs15
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T21720.hs18
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T21898.hs15
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T22160.hs9
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T22160_A.hs3
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T22160_B.hs3
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T22160_C.hs3
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T23010.hs8
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T23010.hs-boot7
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/T23010_aux.hs8
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/all.T35
-rw-r--r--testsuite/tests/overloadedrecflds/should_compile/overloadedrecflds10.hs7
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/DRF9156.stderr6
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/DRFHoleFits.stderr4
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/DRFUnused.stderr4
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/NFS9156.stderr6
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/NFSExport.hs2
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/NFSMixed.hs2
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/NFSMixed.stderr18
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/NoFieldSelectorsFail.stderr57
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/NoParent.stderr2
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T11103.stderr6
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T11167_ambiguous_fixity.stderr8
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T13132_duplicaterecflds.stderr12
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T14953.stderr4
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T16745.stderr8
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T17420.stderr8
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T18999_NoDisambiguateRecordFields.stderr17
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T19287.hs2
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T19287.stderr6
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T21946.hs11
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T21946.stderr8
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T21959.hs6
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T21959.stderr3
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T23010_fail.hs7
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T23010_fail.hs-boot7
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T23010_fail.stderr8
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T23010_fail_aux.hs8
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T23063.hs5
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T23063.stderr12
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/T23063_aux.hs4
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/all.T13
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01.stderr24
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01a.hs13
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01a.stderr6
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01b.hs13
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01b.stderr4
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01c.hs (renamed from testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01.hs)10
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01c.stderr8
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail02.stderr6
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail05.stderr2
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail06.stderr18
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail08.stderr5
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail10.hs8
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail10.stderr24
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail11.stderr8
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail13.stderr24
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail14.stderr6
-rw-r--r--testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldswasrunnowfail06.stderr32
-rw-r--r--testsuite/tests/overloadedrecflds/should_run/T17551b.hs14
-rw-r--r--testsuite/tests/overloadedrecflds/should_run/T17551b.stdout1
-rw-r--r--testsuite/tests/overloadedrecflds/should_run/all.T1
-rw-r--r--testsuite/tests/parser/should_compile/T14189.stderr45
-rw-r--r--testsuite/tests/patsyn/should_fail/mixed-pat-syn-record-sels.stderr5
-rw-r--r--testsuite/tests/patsyn/should_fail/records-mixing-fields.stderr17
-rw-r--r--testsuite/tests/perf/compiler/Makefile1
-rw-r--r--testsuite/tests/perf/compiler/all.T9
-rwxr-xr-xtestsuite/tests/perf/compiler/genRecordUpdPerf24
-rw-r--r--testsuite/tests/perf/compiler/hard_hole_fits.stderr5
-rw-r--r--testsuite/tests/plugins/static-plugins.stdout2
-rw-r--r--testsuite/tests/rename/should_compile/T22122.hs18
-rw-r--r--testsuite/tests/rename/should_compile/T22122_aux.hs68
-rw-r--r--testsuite/tests/rename/should_compile/all.T1
-rw-r--r--testsuite/tests/rename/should_fail/T11167_ambig.stderr12
-rw-r--r--testsuite/tests/rename/should_fail/T12681.stderr3
-rw-r--r--testsuite/tests/rename/should_fail/T19843f.stderr10
-rw-r--r--testsuite/tests/rename/should_fail/T19843g.stderr6
-rw-r--r--testsuite/tests/rename/should_fail/T19843h.stderr4
-rw-r--r--testsuite/tests/rename/should_fail/T21605a.stderr5
-rw-r--r--testsuite/tests/rename/should_fail/T21605d.stderr7
-rw-r--r--testsuite/tests/rename/should_fail/T7943.hs2
-rw-r--r--testsuite/tests/rename/should_fail/T7943.stderr7
-rw-r--r--testsuite/tests/rename/should_fail/T9077.stderr2
-rw-r--r--testsuite/tests/rename/should_fail/T9156.stderr6
-rw-r--r--testsuite/tests/rename/should_fail/T9156_DF.hs10
-rw-r--r--testsuite/tests/rename/should_fail/T9156_DF.stderr3
-rw-r--r--testsuite/tests/rename/should_fail/all.T1
-rw-r--r--testsuite/tests/rename/should_fail/rn_dup.hs2
-rw-r--r--testsuite/tests/rename/should_fail/rn_dup.stderr8
-rw-r--r--testsuite/tests/rename/should_fail/rnfail054.stderr6
-rw-r--r--testsuite/tests/rep-poly/T20113.stderr7
-rw-r--r--testsuite/tests/th/T10279.stderr7
-rw-r--r--testsuite/tests/th/T10828.hs5
-rw-r--r--testsuite/tests/th/T10828b.hs3
-rw-r--r--testsuite/tests/th/T10828b.stderr2
-rw-r--r--testsuite/tests/th/T11345.hs5
-rw-r--r--testsuite/tests/th/T11941.stderr8
-rw-r--r--testsuite/tests/th/T17379a.hs8
-rw-r--r--testsuite/tests/th/T17379a.stderr4
-rw-r--r--testsuite/tests/th/T17379b.hs8
-rw-r--r--testsuite/tests/th/T17379b.stderr4
-rw-r--r--testsuite/tests/th/all.T2
-rw-r--r--testsuite/tests/typecheck/should_compile/QualifiedRecordUpdate.hs10
-rw-r--r--testsuite/tests/typecheck/should_compile/QualifiedRecordUpdate_aux.hs6
-rw-r--r--testsuite/tests/typecheck/should_compile/T21443.hs10
-rw-r--r--testsuite/tests/typecheck/should_compile/all.T6
-rw-r--r--testsuite/tests/typecheck/should_fail/T12035.hs2
-rw-r--r--testsuite/tests/typecheck/should_fail/T21444.hs8
-rw-r--r--testsuite/tests/typecheck/should_fail/T21444.stderr6
-rw-r--r--testsuite/tests/typecheck/should_fail/T7989.stderr15
-rw-r--r--testsuite/tests/typecheck/should_fail/all.T1
-rw-r--r--testsuite/tests/typecheck/should_fail/tcfail114.stderr6
-rw-r--r--testsuite/tests/warnings/should_compile/DodgyExports01.stderr3
161 files changed, 982 insertions, 413 deletions
diff --git a/testsuite/tests/backpack/reexport/T23080a.bkp b/testsuite/tests/backpack/reexport/T23080a.bkp
new file mode 100644
index 0000000000..3ca2d22cda
--- /dev/null
+++ b/testsuite/tests/backpack/reexport/T23080a.bkp
@@ -0,0 +1,9 @@
+unit t23080-unit1 where
+ signature H1 where
+ data T
+unit t23080-unit2 where
+ dependency t23080-unit1[H1=<H2>]
+ module B where
+ data T = MkT
+ signature H2 (T(MkT)) where
+ import B
diff --git a/testsuite/tests/backpack/reexport/T23080b.bkp b/testsuite/tests/backpack/reexport/T23080b.bkp
new file mode 100644
index 0000000000..bb4d86ab9e
--- /dev/null
+++ b/testsuite/tests/backpack/reexport/T23080b.bkp
@@ -0,0 +1,9 @@
+unit t23080-unit1 where
+ signature H1 where
+ data T
+unit t23080-unit2 where
+ dependency t23080-unit1[H1=<H2>]
+ module B where
+ data T = MkT { fld :: T }
+ signature H2 (T(fld)) where
+ import B
diff --git a/testsuite/tests/backpack/reexport/all.T b/testsuite/tests/backpack/reexport/all.T
index f677f01f2e..5bab153169 100644
--- a/testsuite/tests/backpack/reexport/all.T
+++ b/testsuite/tests/backpack/reexport/all.T
@@ -9,3 +9,5 @@ test('bkpreex07', normal, backpack_typecheck, [''])
test('bkpreex08', normal, backpack_typecheck, [''])
test('bkpreex09', normal, backpack_typecheck, [''])
test('bkpreex10', normal, backpack_typecheck, [''])
+test('T23080a', expect_broken(23080), backpack_typecheck, [''])
+test('T23080b', expect_broken(23080), backpack_typecheck, [''])
diff --git a/testsuite/tests/backpack/reexport/bkpreex05.bkp b/testsuite/tests/backpack/reexport/bkpreex05.bkp
index e496ed76fa..811ff69b89 100644
--- a/testsuite/tests/backpack/reexport/bkpreex05.bkp
+++ b/testsuite/tests/backpack/reexport/bkpreex05.bkp
@@ -1,28 +1,28 @@
unit bar where
- signature A(bar) where
- data A = A { foo :: Int, bar :: Bool }
+ signature H1(bar) where
+ data A = MkA { foo :: Int, bar :: Bool }
unit foo where
- signature A(foo) where
- data A = A { foo :: Int, bar :: Bool }
+ signature H2(foo) where
+ data A = MkA { foo :: Int, bar :: Bool }
unit impl where
- module A1 where
- data A = A { foo :: Int, bar :: Bool }
- module A2 where
- data A = A { foo :: Int, bar :: Bool }
- module A(foo, bar) where
- import A1(foo)
- import A2(bar)
+ module M1 where
+ data A = MkA { foo :: Int, bar :: Bool }
+ module M2 where
+ data A = MkA { foo :: Int, bar :: Bool }
+ module M(foo, bar) where
+ import M1(foo)
+ import M2(bar)
-- Kind of boring test now haha
unit barimpl where
- dependency bar[A=impl:A]
+ dependency bar[H1=impl:M]
unit fooimpl where
- dependency foo[A=impl:A]
+ dependency foo[H2=impl:M]
unit foobarimpl where
- dependency foo[A=impl:A]
- dependency bar[A=impl:A]
+ dependency foo[H2=impl:M]
+ dependency bar[H1=impl:M]
diff --git a/testsuite/tests/count-deps/CountDepsAst.stdout b/testsuite/tests/count-deps/CountDepsAst.stdout
index efd58af99f..652a35a9b7 100644
--- a/testsuite/tests/count-deps/CountDepsAst.stdout
+++ b/testsuite/tests/count-deps/CountDepsAst.stdout
@@ -201,7 +201,6 @@ GHC.Types.Avail
GHC.Types.Basic
GHC.Types.BreakInfo
GHC.Types.CompleteMatch
-GHC.Types.ConInfo
GHC.Types.CostCentre
GHC.Types.CostCentre.State
GHC.Types.Cpr
@@ -213,6 +212,7 @@ GHC.Types.Fixity
GHC.Types.Fixity.Env
GHC.Types.ForeignCall
GHC.Types.ForeignStubs
+GHC.Types.GREInfo
GHC.Types.Hint
GHC.Types.Hint.Ppr
GHC.Types.HpcInfo
diff --git a/testsuite/tests/count-deps/CountDepsParser.stdout b/testsuite/tests/count-deps/CountDepsParser.stdout
index f1116f5198..4850f57f96 100644
--- a/testsuite/tests/count-deps/CountDepsParser.stdout
+++ b/testsuite/tests/count-deps/CountDepsParser.stdout
@@ -208,7 +208,6 @@ GHC.Types.Avail
GHC.Types.Basic
GHC.Types.BreakInfo
GHC.Types.CompleteMatch
-GHC.Types.ConInfo
GHC.Types.CostCentre
GHC.Types.CostCentre.State
GHC.Types.Cpr
@@ -220,6 +219,7 @@ GHC.Types.Fixity
GHC.Types.Fixity.Env
GHC.Types.ForeignCall
GHC.Types.ForeignStubs
+GHC.Types.GREInfo
GHC.Types.Hint
GHC.Types.Hint.Ppr
GHC.Types.HpcInfo
diff --git a/testsuite/tests/deriving/should_compile/T13919.stderr b/testsuite/tests/deriving/should_compile/T13919.stderr
index e57fc77371..02cfb71aaa 100644
--- a/testsuite/tests/deriving/should_compile/T13919.stderr
+++ b/testsuite/tests/deriving/should_compile/T13919.stderr
@@ -1,3 +1,3 @@
T13919.hs:13:19: warning: [-Wunused-top-binds (in -Wextra, -Wunused-binds)]
- Defined but not used: ‘bar4’
+ Defined but not used: record field of Foo4 ‘bar4’
diff --git a/testsuite/tests/gadt/T18191.stderr b/testsuite/tests/gadt/T18191.stderr
index b8c6c60bdc..ce877d0332 100644
--- a/testsuite/tests/gadt/T18191.stderr
+++ b/testsuite/tests/gadt/T18191.stderr
@@ -1,20 +1,26 @@
T18191.hs:6:11: error:
- GADT constructor type signature cannot contain nested ‘forall’s or contexts
- In the definition of data constructor ‘MkT’
+ • GADT constructor type signature cannot contain nested ‘forall’s or contexts
+ • In the definition of data constructor ‘MkT’
T18191.hs:9:11: error:
- GADT constructor type signature cannot contain nested ‘forall’s or contexts
- In the definition of data constructor ‘MkS’
+ • GADT constructor type signature cannot contain nested ‘forall’s or contexts
+ • In the definition of data constructor ‘MkS’
T18191.hs:12:11: error:
- GADT constructor type signature cannot contain nested ‘forall’s or contexts
- In the definition of data constructor ‘MkU’
+ • GADT constructor type signature cannot contain nested ‘forall’s or contexts
+ • In the definition of data constructor ‘MkU’
T18191.hs:15:21: error:
- GADT constructor type signature cannot contain nested ‘forall’s or contexts
- In the definition of data constructor ‘MkZ1’
+ • GADT constructor type signature cannot contain nested ‘forall’s or contexts
+ • In the definition of data constructor ‘MkZ1’
+
+T18191.hs:15:31: error: [GHC-89246]
+ Record syntax is illegal here: {unZ1 :: (a, b)}
T18191.hs:16:19: error:
- GADT constructor type signature cannot contain nested ‘forall’s or contexts
- In the definition of data constructor ‘MkZ2’
+ • GADT constructor type signature cannot contain nested ‘forall’s or contexts
+ • In the definition of data constructor ‘MkZ2’
+
+T18191.hs:16:27: error: [GHC-89246]
+ Record syntax is illegal here: {unZ1 :: (a, b)}
diff --git a/testsuite/tests/ghci.debugger/scripts/break006.stderr b/testsuite/tests/ghci.debugger/scripts/break006.stderr
index 80419e9f35..705e9b359c 100644
--- a/testsuite/tests/ghci.debugger/scripts/break006.stderr
+++ b/testsuite/tests/ghci.debugger/scripts/break006.stderr
@@ -8,7 +8,7 @@
instance Show Ordering -- Defined in ‘GHC.Show’
instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
...plus 25 others
- ...plus 12 instances involving out-of-scope types
+ ...plus 13 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In a stmt of an interactive GHCi command: print it
@@ -21,6 +21,6 @@
instance Show Ordering -- Defined in ‘GHC.Show’
instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
...plus 25 others
- ...plus 12 instances involving out-of-scope types
+ ...plus 13 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In a stmt of an interactive GHCi command: print it
diff --git a/testsuite/tests/ghci.debugger/scripts/print019.stderr b/testsuite/tests/ghci.debugger/scripts/print019.stderr
index 0febc62927..ce45768335 100644
--- a/testsuite/tests/ghci.debugger/scripts/print019.stderr
+++ b/testsuite/tests/ghci.debugger/scripts/print019.stderr
@@ -8,6 +8,6 @@
instance Show Ordering -- Defined in ‘GHC.Show’
instance Show TyCon -- Defined in ‘GHC.Show’
...plus 32 others
- ...plus 13 instances involving out-of-scope types
+ ...plus 14 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In a stmt of an interactive GHCi command: print it
diff --git a/testsuite/tests/ghci/scripts/T22125.script b/testsuite/tests/ghci/scripts/T22125.script
new file mode 100644
index 0000000000..166d650dd9
--- /dev/null
+++ b/testsuite/tests/ghci/scripts/T22125.script
@@ -0,0 +1,6 @@
+:seti -XTypeFamilies -XDuplicateRecordFields -XDerivingStrategies
+data family D a
+data instance D Int = MkD0 | MkDInt { x :: Int, y :: Bool } deriving Show
+data instance D Bool = MkDBool { x :: Int }
+f r = r { y = True, x = 14 }
+f (MkDInt 3 False)
diff --git a/testsuite/tests/ghci/scripts/T22125.stdout b/testsuite/tests/ghci/scripts/T22125.stdout
new file mode 100644
index 0000000000..1a6c1af6ab
--- /dev/null
+++ b/testsuite/tests/ghci/scripts/T22125.stdout
@@ -0,0 +1 @@
+MkDInt {x = 14, y = True}
diff --git a/testsuite/tests/ghci/scripts/T23062.script b/testsuite/tests/ghci/scripts/T23062.script
new file mode 100644
index 0000000000..ee46726247
--- /dev/null
+++ b/testsuite/tests/ghci/scripts/T23062.script
@@ -0,0 +1,5 @@
+:seti -XDuplicateRecordFields -XDerivingStrategies
+data A = MkA { foo :: Int, bar :: Int } deriving stock Show
+data B = MkB { foo :: Int }
+f r = r { foo = 3, bar = 4 }
+f (MkA { foo = 2, bar = 3 })
diff --git a/testsuite/tests/ghci/scripts/T23062.stdout b/testsuite/tests/ghci/scripts/T23062.stdout
new file mode 100644
index 0000000000..fe41ddb4e5
--- /dev/null
+++ b/testsuite/tests/ghci/scripts/T23062.stdout
@@ -0,0 +1 @@
+MkA {foo = 3, bar = 4}
diff --git a/testsuite/tests/ghci/scripts/all.T b/testsuite/tests/ghci/scripts/all.T
index fa22b7ae8d..90c3b05514 100755
--- a/testsuite/tests/ghci/scripts/all.T
+++ b/testsuite/tests/ghci/scripts/all.T
@@ -370,6 +370,8 @@ test('T21110', [extra_files(['T21110A.hs'])], ghci_script,
test('T17830', [filter_stdout_lines(r'======.*')], ghci_script, ['T17830.script'])
test('T21294a', normal, ghci_script, ['T21294a.script'])
test('T21507', normal, ghci_script, ['T21507.script'])
+test('T22125', normal, ghci_script, ['T22125.script'])
test('T22695', normal, ghci_script, ['T22695.script'])
test('T22817', normal, ghci_script, ['T22817.script'])
test('T22908', normal, ghci_script, ['T22908.script'])
+test('T23062', normal, ghci_script, ['T23062.script'])
diff --git a/testsuite/tests/ghci/scripts/ghci065.stdout b/testsuite/tests/ghci/scripts/ghci065.stdout
index e4048832cc..543a6caf20 100644
--- a/testsuite/tests/ghci/scripts/ghci065.stdout
+++ b/testsuite/tests/ghci/scripts/ghci065.stdout
@@ -9,13 +9,13 @@ Data3 :: * -- Type constructor defined at ghci065.hs:20:1
Data4 :: Int -> Data4
-- Data constructor defined at ghci065.hs:25:3
-- | This is the haddock comment of a data constructor for Data4.
-dupeField :: DupeFields2 -> Int
- -- Identifier defined at ghci065.hs:32:9
--- ^ This is the second haddock comment of a duplicate record field.
-
dupeField :: DupeFields1 -> Int
-- Identifier defined at ghci065.hs:28:9
-- ^ This is the first haddock comment of a duplicate record field.
+
+dupeField :: DupeFields2 -> Int
+ -- Identifier defined at ghci065.hs:32:9
+-- ^ This is the second haddock comment of a duplicate record field.
func1 :: Int -> Int -> Int
-- Identifier defined at ghci065.hs:41:1
-- | This is the haddock comment of a function declaration for func1.
diff --git a/testsuite/tests/linters/notes.stdout b/testsuite/tests/linters/notes.stdout
index 0a8b2161fe..51fef76584 100644
--- a/testsuite/tests/linters/notes.stdout
+++ b/testsuite/tests/linters/notes.stdout
@@ -6,48 +6,43 @@ ref compiler/GHC/Core/Opt/Simplify/Iteration.hs:4009:8: Note [Lambda-boun
ref compiler/GHC/Core/Opt/Simplify/Utils.hs:1343:37: Note [Gentle mode]
ref compiler/GHC/Core/Opt/Specialise.hs:1790:28: Note [Arity decrease]
ref compiler/GHC/Core/TyCo/Rep.hs:1556:31: Note [What prevents a constraint from floating]
-ref compiler/GHC/Driver/Main.hs:1761:34: Note [simpleTidyPgm - mkBootModDetailsTc]
-ref compiler/GHC/Driver/Session.hs:3976:49: Note [Eta-reduction in -O0]
-ref compiler/GHC/Hs/Expr.hs:191:63: Note [Pending Splices]
-ref compiler/GHC/Hs/Expr.hs:1706:87: Note [Lifecycle of a splice]
-ref compiler/GHC/Hs/Expr.hs:1742:7: Note [Pending Splices]
+ref compiler/GHC/Driver/Main.hs:1762:34: Note [simpleTidyPgm - mkBootModDetailsTc]
+ref compiler/GHC/Driver/Session.hs:3993:49: Note [Eta-reduction in -O0]
+ref compiler/GHC/Hs/Expr.hs:194:63: Note [Pending Splices]
+ref compiler/GHC/Hs/Expr.hs:1736:87: Note [Lifecycle of a splice]
+ref compiler/GHC/Hs/Expr.hs:1772:7: Note [Pending Splices]
ref compiler/GHC/Hs/Extension.hs:146:5: Note [Strict argument type constraints]
ref compiler/GHC/Hs/Pat.hs:143:74: Note [Lifecycle of a splice]
ref compiler/GHC/HsToCore/Pmc/Solver.hs:858:20: Note [COMPLETE sets on data families]
ref compiler/GHC/HsToCore/Quote.hs:1476:7: Note [How brackets and nested splices are handled]
-ref compiler/GHC/Rename/Pat.hs:890:29: Note [Disambiguating record fields]
ref compiler/GHC/Stg/Unarise.hs:442:32: Note [Renaming during unarisation]
ref compiler/GHC/StgToCmm.hs:106:18: Note [codegen-split-init]
ref compiler/GHC/StgToCmm.hs:109:18: Note [pipeline-split-init]
ref compiler/GHC/StgToCmm/Expr.hs:585:4: Note [case on bool]
ref compiler/GHC/StgToCmm/Expr.hs:853:3: Note [alg-alt heap check]
-ref compiler/GHC/Tc/Gen/Expr.hs:1212:23: Note [Disambiguating record fields]
-ref compiler/GHC/Tc/Gen/Expr.hs:1427:7: Note [Disambiguating record fields]
-ref compiler/GHC/Tc/Gen/Expr.hs:1530:11: Note [Deprecating ambiguous fields]
-ref compiler/GHC/Tc/Gen/HsType.hs:557:56: Note [Skolem escape prevention]
-ref compiler/GHC/Tc/Gen/HsType.hs:2622:7: Note [Matching a kind signature with a declaration]
+ref compiler/GHC/Tc/Gen/HsType.hs:556:56: Note [Skolem escape prevention]
+ref compiler/GHC/Tc/Gen/HsType.hs:2621:7: Note [Matching a kind signature with a declaration]
ref compiler/GHC/Tc/Gen/Pat.hs:176:20: Note [Typing patterns in pattern bindings]
ref compiler/GHC/Tc/Gen/Pat.hs:1127:7: Note [Matching polytyped patterns]
ref compiler/GHC/Tc/Gen/Sig.hs:81:10: Note [Overview of type signatures]
-ref compiler/GHC/Tc/Gen/Splice.hs:359:16: Note [How brackets and nested splices are handled]
-ref compiler/GHC/Tc/Gen/Splice.hs:534:35: Note [PendingRnSplice]
-ref compiler/GHC/Tc/Gen/Splice.hs:658:7: Note [How brackets and nested splices are handled]
-ref compiler/GHC/Tc/Gen/Splice.hs:891:11: Note [How brackets and nested splices are handled]
+ref compiler/GHC/Tc/Gen/Splice.hs:357:16: Note [How brackets and nested splices are handled]
+ref compiler/GHC/Tc/Gen/Splice.hs:532:35: Note [PendingRnSplice]
+ref compiler/GHC/Tc/Gen/Splice.hs:656:7: Note [How brackets and nested splices are handled]
+ref compiler/GHC/Tc/Gen/Splice.hs:889:11: Note [How brackets and nested splices are handled]
ref compiler/GHC/Tc/Instance/Family.hs:474:35: Note [Constrained family instances]
-ref compiler/GHC/Tc/Module.hs:708:15: Note [Extra dependencies from .hs-boot files]
+ref compiler/GHC/Tc/Module.hs:711:15: Note [Extra dependencies from .hs-boot files]
ref compiler/GHC/Tc/Solver/Rewrite.hs:1008:7: Note [Stability of rewriting]
-ref compiler/GHC/Tc/TyCl.hs:1119:6: Note [Unification variables need fresh Names]
-ref compiler/GHC/Tc/Types.hs:697:33: Note [Extra dependencies from .hs-boot files]
-ref compiler/GHC/Tc/Types.hs:1428:47: Note [Care with plugin imports]
-ref compiler/GHC/Tc/Types/Constraint.hs:223:34: Note [NonCanonical Semantics]
+ref compiler/GHC/Tc/TyCl.hs:1120:6: Note [Unification variables need fresh Names]
+ref compiler/GHC/Tc/Types.hs:692:33: Note [Extra dependencies from .hs-boot files]
+ref compiler/GHC/Tc/Types.hs:1423:47: Note [Care with plugin imports]
+ref compiler/GHC/Tc/Types/Constraint.hs:255:34: Note [NonCanonical Semantics]
ref compiler/GHC/Types/Demand.hs:306:25: Note [Preserving Boxity of results is rarely a win]
ref compiler/GHC/Unit/Module/Deps.hs:81:13: Note [Structure of dep_boot_mods]
-ref compiler/GHC/Utils/Monad.hs:400:34: Note [multiShotIO]
+ref compiler/GHC/Utils/Monad.hs:410:34: Note [multiShotIO]
ref compiler/Language/Haskell/Syntax/Binds.hs:200:31: Note [fun_id in Match]
-ref compiler/Language/Haskell/Syntax/Pat.hs:356:12: Note [Disambiguating record fields]
ref configure.ac:210:10: Note [Linking ghc-bin against threaded stage0 RTS]
ref docs/core-spec/core-spec.mng:177:6: Note [TyBinders]
-ref hadrian/src/Expression.hs:134:30: Note [Linking ghc-bin against threaded stage0 RTS]
+ref hadrian/src/Expression.hs:145:30: Note [Linking ghc-bin against threaded stage0 RTS]
ref linters/lint-notes/Notes.hs:32:29: Note [" <> T.unpack x <> "]
ref linters/lint-notes/Notes.hs:69:22: Note [...]
ref testsuite/config/ghc:272:10: Note [WayFlags]
diff --git a/testsuite/tests/overloadedrecflds/ghci/GHCiDRF.stdout b/testsuite/tests/overloadedrecflds/ghci/GHCiDRF.stdout
index 08406f9387..c912c3c4ee 100644
--- a/testsuite/tests/overloadedrecflds/ghci/GHCiDRF.stdout
+++ b/testsuite/tests/overloadedrecflds/ghci/GHCiDRF.stdout
@@ -3,18 +3,18 @@ GHCiDRF.foo :: T -> Int
<interactive>:1:1: error:
Ambiguous occurrence ‘GHCiDRF.bar’
It could refer to
- either the field ‘bar’ of record ‘U’, defined at GHCiDRF.hs:4:16
- or the field ‘bar’ of record ‘T’, defined at GHCiDRF.hs:3:28
+ either the field ‘bar’ of record ‘T’, defined at GHCiDRF.hs:3:28
+ or the field ‘bar’ of record ‘U’, defined at GHCiDRF.hs:4:16
type T :: *
data T = MkT {foo :: Int, ...}
-- Defined at GHCiDRF.hs:3:16
-type U :: *
-data U = MkU {GHCiDRF.bar :: Bool}
- -- Defined at GHCiDRF.hs:4:16
-
type T :: *
-data T = MkT {..., GHCiDRF.bar :: Int}
+data T = MkT {..., bar :: Int}
-- Defined at GHCiDRF.hs:3:28
+
+type U :: *
+data U = MkU {bar :: Bool}
+ -- Defined at GHCiDRF.hs:4:16
GHCiDRF.foo :: GHCiDRF.T -> Int
<interactive>:1:1: error:
diff --git a/testsuite/tests/overloadedrecflds/ghci/T19664.hs b/testsuite/tests/overloadedrecflds/ghci/T19664.hs
new file mode 100644
index 0000000000..e7e38193a0
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/ghci/T19664.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE QuasiQuotes, TemplateHaskell, DuplicateRecordFields #-}
+
+module T19664 where
+
+import Language.Haskell.TH
+
+left = undefined
+
+([] <$) $ runIO . print =<< [d|
+ data Tree
+ = Node { left :: Tree, right :: Tree }
+ | Leaf { value :: Int }
+ deriving Show
+ |]
diff --git a/testsuite/tests/overloadedrecflds/ghci/T19664.script b/testsuite/tests/overloadedrecflds/ghci/T19664.script
new file mode 100644
index 0000000000..92f69cfe8c
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/ghci/T19664.script
@@ -0,0 +1,2 @@
+:seti -XDuplicateRecordFields
+:l T19664
diff --git a/testsuite/tests/overloadedrecflds/ghci/T19664.stdout b/testsuite/tests/overloadedrecflds/ghci/T19664.stdout
new file mode 100644
index 0000000000..3742c489c8
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/ghci/T19664.stdout
@@ -0,0 +1 @@
+[DataD [] Tree_6989586621679019412 [] Nothing [RecC Node_6989586621679019413 [(left_6989586621679019416,Bang NoSourceUnpackedness NoSourceStrictness,ConT Tree_6989586621679019412),(right_6989586621679019415,Bang NoSourceUnpackedness NoSourceStrictness,ConT Tree_6989586621679019412)],RecC Leaf_6989586621679019414 [(value_6989586621679019417,Bang NoSourceUnpackedness NoSourceStrictness,ConT GHC.Types.Int)]] [DerivClause Nothing [ConT GHC.Show.Show]]]
diff --git a/testsuite/tests/overloadedrecflds/ghci/all.T b/testsuite/tests/overloadedrecflds/ghci/all.T
index 17f4f82ff5..6e775149e5 100644
--- a/testsuite/tests/overloadedrecflds/ghci/all.T
+++ b/testsuite/tests/overloadedrecflds/ghci/all.T
@@ -4,3 +4,4 @@ test('T13438', [expect_broken(13438), combined_output], ghci_script, ['T13438.sc
test('GHCiDRF', [extra_files(['GHCiDRF.hs']), combined_output], ghci_script, ['GHCiDRF.script'])
test('T19322', combined_output, ghci_script, ['T19322.script'])
test('T19314', combined_output, ghci_script, ['T19314.script'])
+test('T19664', [ignore_stdout, extra_files(['T19664.hs'])], ghci_script, ['T19664.script'])
diff --git a/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.script b/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.script
index 2aa0a15be8..cca0b8a93f 100644
--- a/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.script
+++ b/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.script
@@ -5,13 +5,12 @@ data T a = MkT { foo :: Bool, bar :: a -> a }
let t = MkT { foo = True, bar = id }
(\MkT{foo=foo} -> foo) t
:info foo
-:type foo
-foo (MkS 42)
bar (MkT True id) True
:set -XNoDuplicateRecordFields
-- Should be ambiguous
:type foo
data U = MkU { foo :: Int }
-- New foo should shadow the old ones
+:info foo
:type foo
foo (MkU 42)
diff --git a/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.stdout b/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.stdout
index ae87b8ea19..b34e509ecc 100644
--- a/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.stdout
+++ b/testsuite/tests/overloadedrecflds/ghci/duplicaterecfldsghci01.stdout
@@ -1,15 +1,20 @@
True
+type S :: *
+data S = MkS {foo :: Int}
+ -- Defined at <interactive>:3:16
+
type T :: * -> *
data T a = MkT {foo :: Bool, ...}
-- Defined at <interactive>:4:18
-foo :: T a -> Bool
-
-<interactive>:9:6: error: [GHC-83865]
- • Couldn't match expected type ‘T a0’ with actual type ‘S’
- • In the first argument of ‘foo’, namely ‘(MkS 42)’
- In the expression: foo (MkS 42)
- In an equation for ‘it’: it = foo (MkS 42)
True
-foo :: T a -> Bool
+
+<interactive>:1:1: error:
+ Ambiguous occurrence ‘foo’
+ It could refer to
+ either the field ‘foo’ of record ‘S’, defined at <interactive>:3:16
+ or the field ‘foo’ of record ‘T’, defined at <interactive>:4:18
+type U :: *
+data U = MkU {foo :: Int}
+ -- Defined at <interactive>:12:16
foo :: U -> Int
42
diff --git a/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport.hs b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport.hs
new file mode 100644
index 0000000000..a0e527f1b3
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport.hs
@@ -0,0 +1,8 @@
+module BootFldReexport where
+
+import {-# SOURCE #-} BootFldReexport_N
+ ( fld {- variable -} )
+import BootFldReexport_O
+ ( fld {- record field -} )
+
+test3 = fld
diff --git a/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport.stderr b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport.stderr
new file mode 100644
index 0000000000..0830beb7fc
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport.stderr
@@ -0,0 +1,11 @@
+
+BootFldReexport.hs:8:9: error:
+ Ambiguous occurrence ‘fld’
+ It could refer to
+ either ‘BootFldReexport_N.fld’,
+ imported from ‘BootFldReexport_N’ at BootFldReexport.hs:4:5-7
+ (and originally defined in ‘BootFldReexport_O’
+ at BootFldReexport_O.hs-boot:4:1-13)
+ or the field ‘fld’ of record ‘BootFldReexport_O.O’,
+ imported from ‘BootFldReexport_O’ at BootFldReexport.hs:6:5-7
+ (and originally defined at BootFldReexport_O.hs:5:16-18)
diff --git a/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_B.hs b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_B.hs
new file mode 100644
index 0000000000..8d8024313c
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_B.hs
@@ -0,0 +1,5 @@
+module BootFldReexport_B where
+
+import {-# SOURCE #-} BootFldReexport_N
+
+test2 = fld
diff --git a/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_N.hs b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_N.hs
new file mode 100644
index 0000000000..8a28e3705c
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_N.hs
@@ -0,0 +1,5 @@
+module BootFldReexport_N ( module BootFldReexport_O ) where
+import BootFldReexport_O
+import BootFldReexport
+
+test1 = fld
diff --git a/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_N.hs-boot b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_N.hs-boot
new file mode 100644
index 0000000000..49c9c7c996
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_N.hs-boot
@@ -0,0 +1,2 @@
+module BootFldReexport_N ( module BootFldReexport_O ) where
+import {-# SOURCE #-} BootFldReexport_O \ No newline at end of file
diff --git a/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_O.hs b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_O.hs
new file mode 100644
index 0000000000..733f7e3ed6
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_O.hs
@@ -0,0 +1,5 @@
+module BootFldReexport_O where
+
+import BootFldReexport_B
+
+data O = MkO { fld :: O }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_O.hs-boot b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_O.hs-boot
new file mode 100644
index 0000000000..617ec6fb90
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/BootFldReexport_O.hs-boot
@@ -0,0 +1,4 @@
+module BootFldReexport_O where
+
+data O
+fld :: O -> O
diff --git a/testsuite/tests/overloadedrecflds/should_compile/DupFldFixity1.hs b/testsuite/tests/overloadedrecflds/should_compile/DupFldFixity1.hs
new file mode 100644
index 0000000000..58e7afe673
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/DupFldFixity1.hs
@@ -0,0 +1,9 @@
+
+
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module DupFldFixity1 where
+
+data A = MkA { fld :: A -> A }
+
+infixr 4 `fld`
diff --git a/testsuite/tests/overloadedrecflds/should_compile/DupFldFixity2.hs b/testsuite/tests/overloadedrecflds/should_compile/DupFldFixity2.hs
new file mode 100644
index 0000000000..85811c3b0f
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/DupFldFixity2.hs
@@ -0,0 +1,12 @@
+
+{-# LANGUAGE NoFieldSelectors #-}
+
+module DupFldFixity2 where
+
+data A = MkA { fld :: A -> A }
+data B
+
+fld :: B -> B -> B
+fld x _ = x
+
+infixr 4 `fld`
diff --git a/testsuite/tests/overloadedrecflds/should_compile/DupFldFixity3.hs b/testsuite/tests/overloadedrecflds/should_compile/DupFldFixity3.hs
new file mode 100644
index 0000000000..73d8490d57
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/DupFldFixity3.hs
@@ -0,0 +1,9 @@
+
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module DupFldFixity3 where
+
+data A = MkA { fld :: A -> A }
+data B = MkB { fld :: A -> A }
+
+infixr 4 `fld`
diff --git a/testsuite/tests/overloadedrecflds/should_compile/NoDRFModuleExport.hs b/testsuite/tests/overloadedrecflds/should_compile/NoDRFModuleExport.hs
new file mode 100644
index 0000000000..11a21af800
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/NoDRFModuleExport.hs
@@ -0,0 +1,6 @@
+-- Test that we can re-export a module defining
+-- duplicate record fields, without ourselves enabling
+-- the DuplicateRecordFields extension.
+
+module NoDRFModuleExport ( module NoDRFModuleExport_aux ) where
+ import NoDRFModuleExport_aux
diff --git a/testsuite/tests/overloadedrecflds/should_compile/NoDRFModuleExport_aux.hs b/testsuite/tests/overloadedrecflds/should_compile/NoDRFModuleExport_aux.hs
new file mode 100644
index 0000000000..4720fdd547
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/NoDRFModuleExport_aux.hs
@@ -0,0 +1,4 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+module NoDRFModuleExport_aux where
+ data A = MkA { foo :: A }
+ data B = MkB { foo :: B }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_A.hs b/testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_A.hs
new file mode 100644
index 0000000000..ae25153621
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_A.hs
@@ -0,0 +1,5 @@
+{-# LANGUAGE TypeFamilies #-}
+module OverloadedRecFlds10_A where
+
+data family F a
+data instance F Int = MkFInt { foo :: Int }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_B.hs b/testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_B.hs
new file mode 100644
index 0000000000..0f7be47880
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_B.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE TypeFamilies #-}
+module OverloadedRecFlds10_B (F(..)) where
+
+import OverloadedRecFlds10_A hiding (foo)
+
+data instance F Bool = MkFBool { foo :: Int }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_C.hs b/testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_C.hs
new file mode 100644
index 0000000000..29c4863334
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/OverloadedRecFlds10_C.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE DuplicateRecordFields, TypeFamilies #-}
+module OverloadedRecFlds10_C (F(..)) where
+
+import OverloadedRecFlds10_A
+
+data instance F Char = MkFChar { foo :: Char }
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T11103.hs b/testsuite/tests/overloadedrecflds/should_compile/T11103.hs
index 2791dc4fca..6662b29cfa 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/T11103.hs
+++ b/testsuite/tests/overloadedrecflds/should_compile/T11103.hs
@@ -1,9 +1,7 @@
--- When using DuplicateRecordFields with TemplateHaskell, it is not possible to
--- reify ambiguous names that are output by reifying field labels.
--- See also overloadedrecflds/should_run/overloadedrecfldsrun04.hs
-
{-# LANGUAGE DuplicateRecordFields, TemplateHaskell #-}
+module T11103 where
+
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T13352.hs b/testsuite/tests/overloadedrecflds/should_compile/T13352.hs
new file mode 100644
index 0000000000..9d85b725b6
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T13352.hs
@@ -0,0 +1,4 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+module T13352 (S(foo), T(foo)) where
+ import T13352_A (S(..))
+ import T13352_B (T(..))
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T13352_A.hs b/testsuite/tests/overloadedrecflds/should_compile/T13352_A.hs
new file mode 100644
index 0000000000..2639b4bb38
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T13352_A.hs
@@ -0,0 +1,2 @@
+module T13352_A where
+ data S = MkS { foo :: Int }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T13352_B.hs b/testsuite/tests/overloadedrecflds/should_compile/T13352_B.hs
new file mode 100644
index 0000000000..b04cd1168f
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T13352_B.hs
@@ -0,0 +1,2 @@
+module T13352_B where
+ data T = MkT { foo :: Int }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T13352_hard.hs b/testsuite/tests/overloadedrecflds/should_compile/T13352_hard.hs
new file mode 100644
index 0000000000..982305e71d
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T13352_hard.hs
@@ -0,0 +1,4 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+module T13352_hard (S(foo), T(foo)) where
+ import T13352_hard_A (S(..))
+ import T13352_hard_B (T(..))
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T13352_hard.stderr b/testsuite/tests/overloadedrecflds/should_compile/T13352_hard.stderr
new file mode 100644
index 0000000000..bd4bf93121
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T13352_hard.stderr
@@ -0,0 +1,9 @@
+
+T13352_hard.hs:2:29: error: [GHC-69158]
+ Conflicting exports for ‘foo’:
+ ‘S(foo)’ exports ‘T13352_hard_A.foo’
+ imported from ‘T13352_hard_A’ at T13352_hard.hs:3:25-29
+ (and originally defined at T13352_hard_A.hs:3:16-18)
+ ‘T(foo)’ exports ‘T13352_hard_B.foo’
+ imported from ‘T13352_hard_B’ at T13352_hard.hs:4:25-29
+ (and originally defined at T13352_hard_B.hs:3:16-18)
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T13352_hard_A.hs b/testsuite/tests/overloadedrecflds/should_compile/T13352_hard_A.hs
new file mode 100644
index 0000000000..3fcba12280
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T13352_hard_A.hs
@@ -0,0 +1,3 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+module T13352_hard_A where
+ data S = C { foo :: Int }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T13352_hard_B.hs b/testsuite/tests/overloadedrecflds/should_compile/T13352_hard_B.hs
new file mode 100644
index 0000000000..7271dda542
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T13352_hard_B.hs
@@ -0,0 +1,3 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+module T13352_hard_B where
+ data T = C { foo :: Int }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T14848.hs b/testsuite/tests/overloadedrecflds/should_compile/T14848.hs
new file mode 100644
index 0000000000..f19ebbecca
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T14848.hs
@@ -0,0 +1,10 @@
+{-# language TemplateHaskell #-}
+{-# language DuplicateRecordFields #-}
+
+module T14848 where
+import Language.Haskell.TH
+import Language.Haskell.TH.Syntax
+
+data A = A {x :: Int, y :: String}
+a = A 3 "test"
+test = $([e|case a of A {x = b} -> b|])
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T17551.hs b/testsuite/tests/overloadedrecflds/should_compile/T17551.hs
new file mode 100644
index 0000000000..8fe5d9f808
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T17551.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module T17551 where
+
+import Language.Haskell.TH
+
+data Foo = Foo { foo :: Int }
+data Bar = Bar { foo :: Int }
+
+$(do
+ TyConI (DataD _ _ _ _ [RecC con [(field, _, _)]] _) <- reify ''Bar
+ reify field
+ pure []
+ )
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T21720.hs b/testsuite/tests/overloadedrecflds/should_compile/T21720.hs
new file mode 100644
index 0000000000..072bde217a
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T21720.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# OPTIONS_GHC -dcore-lint #-}
+
+module T21720 where
+
+import Language.Haskell.TH
+
+main :: IO ()
+main = pure ()
+
+$(do
+ let noBang = Bang NoSourceUnpackedness NoSourceStrictness
+ let mkData tn cn fn = DataD [] tn [] Nothing [RecC cn [(fn, noBang, ConT ''Integer)]] []
+ r1 <- mkData <$> newName "R1" <*> newName "C1" <*> newName "f"
+ r2 <- mkData <$> newName "R2" <*> newName "C2" <*> newName "f"
+ pure [r1,r2]
+ )
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T21898.hs b/testsuite/tests/overloadedrecflds/should_compile/T21898.hs
new file mode 100644
index 0000000000..b7b0b051e8
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T21898.hs
@@ -0,0 +1,15 @@
+{-# LANGUAGE DuplicateRecordFields, PatternSynonyms #-}
+
+module T21898 where
+
+pattern P :: Int -> Int -> (Int, Int)
+pattern P { proj_x, proj_y } = (proj_x, proj_y)
+
+pattern Q1 :: Int -> Int
+pattern Q1 { proj_x } = proj_x
+
+pattern Q2 :: Int -> Int
+pattern Q2 { proj_y } = proj_y
+
+blah :: (Int, Int) -> (Int, Int)
+blah p = p { proj_x = 0, proj_y = 1 }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T22160.hs b/testsuite/tests/overloadedrecflds/should_compile/T22160.hs
new file mode 100644
index 0000000000..28aaa3c735
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T22160.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+
+module T22160 where
+
+import T22160_A
+import T22160_B
+import T22160_C
+
+eg r = r { x = 1, y = 1 }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T22160_A.hs b/testsuite/tests/overloadedrecflds/should_compile/T22160_A.hs
new file mode 100644
index 0000000000..341df010ba
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T22160_A.hs
@@ -0,0 +1,3 @@
+module T22160_A where
+
+data A = MkA { x :: Int }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T22160_B.hs b/testsuite/tests/overloadedrecflds/should_compile/T22160_B.hs
new file mode 100644
index 0000000000..2da5511e6c
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T22160_B.hs
@@ -0,0 +1,3 @@
+module T22160_B where
+
+data B = MkB { y :: Int }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T22160_C.hs b/testsuite/tests/overloadedrecflds/should_compile/T22160_C.hs
new file mode 100644
index 0000000000..450463e0a6
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T22160_C.hs
@@ -0,0 +1,3 @@
+module T22160_C where
+
+data C = MkC { x, y :: Int }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T23010.hs b/testsuite/tests/overloadedrecflds/should_compile/T23010.hs
new file mode 100644
index 0000000000..7ae1ff5f98
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T23010.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module T23010 ( A(..) ) where
+
+import T23010_aux ( X )
+
+data A = MkA { fld :: A, other :: X }
+data B = MkB { fld :: B }
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T23010.hs-boot b/testsuite/tests/overloadedrecflds/should_compile/T23010.hs-boot
new file mode 100644
index 0000000000..ea72bd20f6
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T23010.hs-boot
@@ -0,0 +1,7 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module T23010 where
+
+data A
+
+fld :: A -> A
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T23010_aux.hs b/testsuite/tests/overloadedrecflds/should_compile/T23010_aux.hs
new file mode 100644
index 0000000000..1f1280b26a
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/T23010_aux.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module T23010_aux where
+
+import {-# SOURCE #-} T23010 ( fld )
+
+data X
+bar = fld
diff --git a/testsuite/tests/overloadedrecflds/should_compile/all.T b/testsuite/tests/overloadedrecflds/should_compile/all.T
index 9d49752f2b..000fd696e4 100644
--- a/testsuite/tests/overloadedrecflds/should_compile/all.T
+++ b/testsuite/tests/overloadedrecflds/should_compile/all.T
@@ -12,3 +12,38 @@ test('T19154', normal, compile, [''])
test('T20723', normal, compile, [''])
test('T20989', normal, compile, [''])
test('T21625', [], multimod_compile, ['T21625', '-v0'])
+test('DupFldFixity1', normal, compile, [''])
+test('DupFldFixity2', normal, compile, [''])
+test('T23010', [extra_files(['T23010.hs-boot', 'T23010_aux.hs'])]
+ , multimod_compile
+ , ['T23010', '-v0'])
+test('T14848', req_th, compile, [''])
+test('T17551', req_th, compile, [''])
+test('T11103', req_th, compile, [''])
+test('T13352'
+ , [extra_files(['T13352_A.hs', 'T13352_B.hs'])]
+ , multimod_compile, ['T13352_A T13352_B T13352', '-v0'])
+test('T13352_hard'
+ , [extra_files(['T13352_hard_A.hs', 'T13352_hard_B.hs'])]
+ , multimod_compile_fail, ['T13352_hard_A T13352_hard_B T13352_hard', '-v0'])
+test('T21720', req_th, compile, [''])
+test('T21898', normal, compile, [''])
+test('T22160', [extra_files(['T22160_A.hs', 'T22160_B.hs', 'T22160_C.hs'])]
+ , multimod_compile, ['T22160_A T22160_B T22160_C T22160', '-v0'])
+test('DupFldFixity3', normal, compile, [''])
+test('overloadedrecflds10'
+ , [extra_files(['OverloadedRecFlds10_A.hs', 'OverloadedRecFlds10_B.hs', 'OverloadedRecFlds10_C.hs'])]
+ , multimod_compile
+ , ['overloadedrecflds10', '-v0'])
+test('NoDRFModuleExport'
+ , [extra_files(['NoDRFModuleExport_aux.hs'])]
+ , multimod_compile
+ , ['NoDRFModuleExport', '-v0'])
+test('BootFldReexport'
+ , [extra_files([ 'BootFldReexport_N.hs', 'BootFldReexport_N.hs-boot'
+ , 'BootFldReexport_O.hs', 'BootFldReexport_O.hs-boot'
+ , 'BootFldReexport_B.hs' ])]
+ , multimod_compile_fail
+ # Should either pass or give an ambiguity error when compiling
+ # the final module (BootFldReexport), but not fail earlier.
+ , ['BootFldReexport', '-v0'])
diff --git a/testsuite/tests/overloadedrecflds/should_compile/overloadedrecflds10.hs b/testsuite/tests/overloadedrecflds/should_compile/overloadedrecflds10.hs
new file mode 100644
index 0000000000..c85d303d0e
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_compile/overloadedrecflds10.hs
@@ -0,0 +1,7 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+module Main (main, F(..)) where
+
+import OverloadedRecFlds10_B
+import OverloadedRecFlds10_C
+
+main = return ()
diff --git a/testsuite/tests/overloadedrecflds/should_fail/DRF9156.stderr b/testsuite/tests/overloadedrecflds/should_fail/DRF9156.stderr
index ea1d10dc10..5e18bdf59a 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/DRF9156.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/DRF9156.stderr
@@ -1,5 +1,3 @@
-DRF9156.hs:4:19: error:
- Multiple declarations of ‘f1’
- Declared at: DRF9156.hs:3:15
- DRF9156.hs:4:19
+DRF9156.hs:4:19: error: [GHC-85524]
+ Duplicate field name ‘f1’ in record declaration
diff --git a/testsuite/tests/overloadedrecflds/should_fail/DRFHoleFits.stderr b/testsuite/tests/overloadedrecflds/should_fail/DRFHoleFits.stderr
index 61779352c3..1fb78b2175 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/DRFHoleFits.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/DRFHoleFits.stderr
@@ -1,5 +1,3 @@
-[1 of 2] Compiling DRFHoleFits_A ( DRFHoleFits_A.hs, DRFHoleFits_A.o )
-[2 of 2] Compiling DRFHoleFits ( DRFHoleFits.hs, DRFHoleFits.o )
DRFHoleFits.hs:7:7: error: [GHC-88464]
• Found hole: _ :: T -> Int
@@ -19,6 +17,6 @@ DRFHoleFits.hs:8:7: error: [GHC-88464]
baz :: A.S -> Int (bound at DRFHoleFits.hs:8:1)
Valid hole fits include
baz :: A.S -> Int (defined at DRFHoleFits.hs:8:1)
- DRFHoleFits_A.foo :: A.S -> Int
+ A.foo :: A.S -> Int
(imported qualified from ‘DRFHoleFits_A’ at DRFHoleFits.hs:3:1-35
(and originally defined at DRFHoleFits_A.hs:5:16-18))
diff --git a/testsuite/tests/overloadedrecflds/should_fail/DRFUnused.stderr b/testsuite/tests/overloadedrecflds/should_fail/DRFUnused.stderr
index e020e8cd82..88e9e6537f 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/DRFUnused.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/DRFUnused.stderr
@@ -2,6 +2,6 @@
DRFUnused.hs:18:5: error:
Ambiguous occurrence ‘foo’
It could refer to
- either the field ‘foo’ of record ‘U’, defined at DRFUnused.hs:12:16
+ either the field ‘foo’ of record ‘S’, defined at DRFUnused.hs:10:16
or the field ‘foo’ of record ‘T’, defined at DRFUnused.hs:11:16
- or the field ‘foo’ of record ‘S’, defined at DRFUnused.hs:10:16
+ or the field ‘foo’ of record ‘U’, defined at DRFUnused.hs:12:16
diff --git a/testsuite/tests/overloadedrecflds/should_fail/NFS9156.stderr b/testsuite/tests/overloadedrecflds/should_fail/NFS9156.stderr
index 66ab58fcbd..c735f618e8 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/NFS9156.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/NFS9156.stderr
@@ -1,5 +1,3 @@
-NFS9156.hs:4:19: error:
- Multiple declarations of ‘f1’
- Declared at: NFS9156.hs:3:15
- NFS9156.hs:4:19
+NFS9156.hs:4:19: error: [GHC-85524]
+ Duplicate field name ‘f1’ in record declaration
diff --git a/testsuite/tests/overloadedrecflds/should_fail/NFSExport.hs b/testsuite/tests/overloadedrecflds/should_fail/NFSExport.hs
index 839b32bae4..86c21c2dcf 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/NFSExport.hs
+++ b/testsuite/tests/overloadedrecflds/should_fail/NFSExport.hs
@@ -1,3 +1,3 @@
{-# LANGUAGE NoFieldSelectors #-}
module NFSExport (T(foo), foo) where -- only T(foo) is supported
-data T = MkT { foo :: Bool }
+data T = MkT { foo :: T }
diff --git a/testsuite/tests/overloadedrecflds/should_fail/NFSMixed.hs b/testsuite/tests/overloadedrecflds/should_fail/NFSMixed.hs
index d2b3d8dd1b..05ddc0cd39 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/NFSMixed.hs
+++ b/testsuite/tests/overloadedrecflds/should_fail/NFSMixed.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+
module NFSMixed where
import NFSMixedA
diff --git a/testsuite/tests/overloadedrecflds/should_fail/NFSMixed.stderr b/testsuite/tests/overloadedrecflds/should_fail/NFSMixed.stderr
index 0419feb764..3f50bfe597 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/NFSMixed.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/NFSMixed.stderr
@@ -1,13 +1,7 @@
-NFSMixed.hs:5:18: error:
- Ambiguous occurrence ‘foo’
- It could refer to
- either the field ‘foo’ of record ‘Foo’,
- imported from ‘NFSMixedA’ at NFSMixed.hs:3:1-16
- (and originally defined at NFSMixedA.hs:4:18-20)
- or the field ‘foo’ of record ‘Bar’,
- imported from ‘NFSMixedA’ at NFSMixed.hs:3:1-16
- (and originally defined at NFSMixedA.hs:5:18-20)
- or ‘NFSMixedA.foo’,
- imported from ‘NFSMixedA’ at NFSMixed.hs:3:1-16
- (and originally defined at NFSMixedA.hs:8:1-3)
+NFSMixed.hs:7:14: error: [GHC-99339]
+ • Ambiguous record update with field ‘foo’
+ This field appears in both datatypes ‘Foo’ and ‘Bar’
+ • In the expression: x {foo = 0}
+ In the expression: \ x -> x {foo = 0}
+ In an equation for ‘test’: test = \ x -> x {foo = 0}
diff --git a/testsuite/tests/overloadedrecflds/should_fail/NoFieldSelectorsFail.stderr b/testsuite/tests/overloadedrecflds/should_fail/NoFieldSelectorsFail.stderr
index 6810d549ff..301b6bc4b8 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/NoFieldSelectorsFail.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/NoFieldSelectorsFail.stderr
@@ -9,32 +9,35 @@ NoFieldSelectorsFail.hs:9:14: error:
imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
(and originally defined at NoFieldSelectorsFailA.hs:6:18-20)
-NoFieldSelectorsFail.hs:12:15: error:
- Ambiguous occurrence ‘foo’
- It could refer to
- either the field ‘foo’ of record ‘Foo’,
- imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
- (and originally defined at NoFieldSelectorsFailA.hs:5:18-20)
- or the field ‘foo’ of record ‘Bar’,
- imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
- (and originally defined at NoFieldSelectorsFailA.hs:6:18-20)
+NoFieldSelectorsFail.hs:12:15: error: [GHC-56428]
+ Ambiguous record field ‘foo’.
+ It could refer to any of the following:
+ • record field ‘foo’ of ‘Foo’,
+ imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
+ (and originally defined at NoFieldSelectorsFailA.hs:5:18-20)
+ • record field ‘foo’ of ‘Bar’,
+ imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
+ (and originally defined at NoFieldSelectorsFailA.hs:6:18-20)
+ Suggested fix: Perhaps you intended to use DisambiguateRecordFields
-NoFieldSelectorsFail.hs:14:15: error:
- Ambiguous occurrence ‘foo’
- It could refer to
- either the field ‘foo’ of record ‘Foo’,
- imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
- (and originally defined at NoFieldSelectorsFailA.hs:5:18-20)
- or the field ‘foo’ of record ‘Bar’,
- imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
- (and originally defined at NoFieldSelectorsFailA.hs:6:18-20)
+NoFieldSelectorsFail.hs:14:15: error: [GHC-56428]
+ Ambiguous record field ‘foo’.
+ It could refer to any of the following:
+ • record field ‘foo’ of ‘Foo’,
+ imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
+ (and originally defined at NoFieldSelectorsFailA.hs:5:18-20)
+ • record field ‘foo’ of ‘Bar’,
+ imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
+ (and originally defined at NoFieldSelectorsFailA.hs:6:18-20)
+ Suggested fix: Perhaps you intended to use DisambiguateRecordFields
-NoFieldSelectorsFail.hs:16:15: error:
- Ambiguous occurrence ‘bar’
- It could refer to
- either the field ‘bar’ of record ‘Foo’,
- imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
- (and originally defined at NoFieldSelectorsFailA.hs:5:30-32)
- or ‘NoFieldSelectorsFailA.bar’,
- imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
- (and originally defined at NoFieldSelectorsFailA.hs:8:1-3)
+NoFieldSelectorsFail.hs:16:15: error: [GHC-56428]
+ Ambiguous record field ‘bar’.
+ It could refer to any of the following:
+ • record field ‘bar’ of ‘Foo’,
+ imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
+ (and originally defined at NoFieldSelectorsFailA.hs:5:30-32)
+ • variable ‘bar’,
+ imported from ‘NoFieldSelectorsFailA’ at NoFieldSelectorsFail.hs:4:1-28
+ (and originally defined at NoFieldSelectorsFailA.hs:8:1-3)
+ Suggested fix: Perhaps you intended to use DisambiguateRecordFields
diff --git a/testsuite/tests/overloadedrecflds/should_fail/NoParent.stderr b/testsuite/tests/overloadedrecflds/should_fail/NoParent.stderr
index b75b8c1df5..a18161d2e9 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/NoParent.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/NoParent.stderr
@@ -2,5 +2,5 @@
NoParent.hs:2:18: error: [GHC-88993]
• The type constructor ‘A’ is not the parent of the record selector ‘x’.
Record selectors can only be exported with their parent type constructor.
- Parents: C, B
+ Parents: B, C
• In the export: A(x)
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T11103.stderr b/testsuite/tests/overloadedrecflds/should_fail/T11103.stderr
deleted file mode 100644
index 076d067d36..0000000000
--- a/testsuite/tests/overloadedrecflds/should_fail/T11103.stderr
+++ /dev/null
@@ -1,6 +0,0 @@
-
-T11103.hs:13:2: error:
- Ambiguous occurrence ‘Main.foo’
- It could refer to
- either the field ‘foo’ of record ‘S’, defined at T11103.hs:11:16
- or the field ‘foo’ of record ‘R’, defined at T11103.hs:10:16
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T11167_ambiguous_fixity.stderr b/testsuite/tests/overloadedrecflds/should_fail/T11167_ambiguous_fixity.stderr
index 709ee2312d..277a5bd0ac 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/T11167_ambiguous_fixity.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/T11167_ambiguous_fixity.stderr
@@ -5,12 +5,12 @@
T11167_ambiguous_fixity.hs:6:16: error:
Ambiguous occurrence ‘foo’
It could refer to
- either the field ‘foo’ of record ‘C’,
- imported from ‘T11167_ambiguous_fixity_A’ at T11167_ambiguous_fixity.hs:3:1-32
- (and originally defined at T11167_ambiguous_fixity_A.hs:4:16-18)
- or the field ‘foo’ of record ‘A’,
+ either the field ‘foo’ of record ‘A’,
imported from ‘T11167_ambiguous_fixity_A’ at T11167_ambiguous_fixity.hs:3:1-32
(and originally defined at T11167_ambiguous_fixity_A.hs:3:16-18)
+ or the field ‘foo’ of record ‘C’,
+ imported from ‘T11167_ambiguous_fixity_A’ at T11167_ambiguous_fixity.hs:3:1-32
+ (and originally defined at T11167_ambiguous_fixity_A.hs:4:16-18)
or the field ‘foo’ of record ‘B’,
imported from ‘T11167_ambiguous_fixity_B’ at T11167_ambiguous_fixity.hs:4:1-32
(and originally defined at T11167_ambiguous_fixity_B.hs:2:16-18)
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T13132_duplicaterecflds.stderr b/testsuite/tests/overloadedrecflds/should_fail/T13132_duplicaterecflds.stderr
index a2a4428b0b..462b00416c 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/T13132_duplicaterecflds.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/T13132_duplicaterecflds.stderr
@@ -2,10 +2,10 @@
T13132_duplicaterecflds.hs:7:16: error:
Ambiguous occurrence ‘runContT’
It could refer to
- either the field ‘runContT’ of record ‘ContT2’,
- defined at T13132_duplicaterecflds.hs:5:33
- or the field ‘runContT’ of record ‘ContT’,
+ either the field ‘runContT’ of record ‘ContT’,
defined at T13132_duplicaterecflds.hs:4:31
+ or the field ‘runContT’ of record ‘ContT2’,
+ defined at T13132_duplicaterecflds.hs:5:33
T13132_duplicaterecflds.hs:9:11: error:
The operator ‘runContT’ [infixl 9] of a section
@@ -16,7 +16,7 @@ T13132_duplicaterecflds.hs:9:11: error:
T13132_duplicaterecflds.hs:9:12: error:
Ambiguous occurrence ‘runContT’
It could refer to
- either the field ‘runContT’ of record ‘ContT2’,
- defined at T13132_duplicaterecflds.hs:5:33
- or the field ‘runContT’ of record ‘ContT’,
+ either the field ‘runContT’ of record ‘ContT’,
defined at T13132_duplicaterecflds.hs:4:31
+ or the field ‘runContT’ of record ‘ContT2’,
+ defined at T13132_duplicaterecflds.hs:5:33
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T14953.stderr b/testsuite/tests/overloadedrecflds/should_fail/T14953.stderr
index 144e306483..19003fc78c 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/T14953.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/T14953.stderr
@@ -4,10 +4,10 @@
T14953.hs:2:33: error: [GHC-69158]
Conflicting exports for ‘unR’:
- ‘module T14953_A’ exports ‘unR’
+ ‘module T14953_A’ exports ‘T14953_A.unR’
imported from ‘T14953_A’ at T14953.hs:3:1-15
(and originally defined at T14953_A.hs:3:13-15)
- ‘module T14953_B’ exports ‘unR’
+ ‘module T14953_B’ exports ‘T14953_B.unR’
imported from ‘T14953_B’ at T14953.hs:4:1-15
(and originally defined at T14953_B.hs:3:13-15)
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T16745.stderr b/testsuite/tests/overloadedrecflds/should_fail/T16745.stderr
index 61a9567788..5969a540e0 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/T16745.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/T16745.stderr
@@ -6,9 +6,9 @@
T16745A.hs:8:9: error:
Ambiguous occurrence ‘field’
It could refer to
- either the field ‘field’ of record ‘T16745B.R’,
- imported from ‘T16745B’ at T16745A.hs:3:24-28
- (and originally defined at T16745B.hs:11:14-18)
- or ‘T16745B.field’,
+ either ‘T16745B.field’,
imported from ‘T16745B’ at T16745A.hs:3:24-28
(and originally defined in ‘T16745C’ at T16745C.hs:2:1-5)
+ or the field ‘field’ of record ‘T16745B.R’,
+ imported from ‘T16745B’ at T16745A.hs:3:24-28
+ (and originally defined at T16745B.hs:11:14-18)
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T17420.stderr b/testsuite/tests/overloadedrecflds/should_fail/T17420.stderr
index 5089f19ce2..e1db5fa195 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/T17420.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/T17420.stderr
@@ -4,9 +4,9 @@
T17420.hs:6:17: error:
Ambiguous occurrence ‘name’
It could refer to
- either the field ‘name’ of record ‘Human’,
- imported from ‘T17420A’ at T17420.hs:4:1-14
- (and originally defined at T17420A.hs:5:22-25)
- or the field ‘name’ of record ‘Dog’,
+ either the field ‘name’ of record ‘Dog’,
imported from ‘T17420A’ at T17420.hs:4:1-14
(and originally defined at T17420A.hs:4:18-21)
+ or the field ‘name’ of record ‘Human’,
+ imported from ‘T17420A’ at T17420.hs:4:1-14
+ (and originally defined at T17420A.hs:5:22-25)
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T18999_NoDisambiguateRecordFields.stderr b/testsuite/tests/overloadedrecflds/should_fail/T18999_NoDisambiguateRecordFields.stderr
index d271efc7f8..f462dcb187 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/T18999_NoDisambiguateRecordFields.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/T18999_NoDisambiguateRecordFields.stderr
@@ -8,11 +8,12 @@ T18999_NoDisambiguateRecordFields.hs:6:13: error:
or the field ‘not’ of record ‘Foo’,
defined at T18999_NoDisambiguateRecordFields.hs:4:18
-T18999_NoDisambiguateRecordFields.hs:8:11: error:
- Ambiguous occurrence ‘not’
- It could refer to
- either ‘Prelude.not’,
- imported from ‘Prelude’ at T18999_NoDisambiguateRecordFields.hs:2:8-40
- (and originally defined in ‘GHC.Classes’)
- or the field ‘not’ of record ‘Foo’,
- defined at T18999_NoDisambiguateRecordFields.hs:4:18
+T18999_NoDisambiguateRecordFields.hs:8:11: error: [GHC-56428]
+ Ambiguous record field ‘not’.
+ It could refer to any of the following:
+ • record field ‘not’ of ‘Foo’,
+ defined at T18999_NoDisambiguateRecordFields.hs:4:18
+ • variable ‘not’,
+ imported from ‘Prelude’ at T18999_NoDisambiguateRecordFields.hs:2:8-40
+ (and originally defined in ‘GHC.Classes’)
+ Suggested fix: Perhaps you intended to use DisambiguateRecordFields
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T19287.hs b/testsuite/tests/overloadedrecflds/should_fail/T19287.hs
index f3dedbe4bc..793d0e61e7 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/T19287.hs
+++ b/testsuite/tests/overloadedrecflds/should_fail/T19287.hs
@@ -1,7 +1,7 @@
{-# LANGUAGE DuplicateRecordFields #-}
module Main where
-data R a b = R { x :: a , x :: b}
+data R a b = R { x :: a , x :: b }
unsafeCoerce :: a -> b
unsafeCoerce i = case (R i i){x = i} of
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T19287.stderr b/testsuite/tests/overloadedrecflds/should_fail/T19287.stderr
index c0c5a0caa9..03a88e1f78 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/T19287.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/T19287.stderr
@@ -1,5 +1,3 @@
-T19287.hs:4:27: error:
- Multiple declarations of ‘x’
- Declared at: T19287.hs:4:18
- T19287.hs:4:27
+T19287.hs:4:27: error: [GHC-85524]
+ Duplicate field name ‘x’ in record declaration
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T21946.hs b/testsuite/tests/overloadedrecflds/should_fail/T21946.hs
new file mode 100644
index 0000000000..fdd0f09749
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/T21946.hs
@@ -0,0 +1,11 @@
+{-# LANGUAGE DuplicateRecordFields, PatternSynonyms #-}
+
+module T21946 where
+
+pattern R1 :: Int -> Int
+pattern R1 { fld } = fld
+
+pattern R2 :: Bool -> Bool
+pattern R2 { fld } = fld
+
+f r = (r :: Int) { fld = undefined }
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T21946.stderr b/testsuite/tests/overloadedrecflds/should_fail/T21946.stderr
new file mode 100644
index 0000000000..61254e3e3d
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/T21946.stderr
@@ -0,0 +1,8 @@
+
+T21946.hs:11:7: error: [GHC-33238]
+ • No data constructor of type constructor ‘Int’
+ has all of the fields:
+ ‘fld’
+ NB: type-directed disambiguation is not supported for pattern synonym record fields.
+ • In the expression: (r :: Int) {fld = undefined}
+ In an equation for ‘f’: f r = (r :: Int) {fld = undefined}
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T21959.hs b/testsuite/tests/overloadedrecflds/should_fail/T21959.hs
new file mode 100644
index 0000000000..b10c2a1355
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/T21959.hs
@@ -0,0 +1,6 @@
+module T21959 where
+
+data R = R { fld :: Int }
+
+f :: R -> R
+f r = r { T21959.fld = 1, fld = 2 }
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T21959.stderr b/testsuite/tests/overloadedrecflds/should_fail/T21959.stderr
new file mode 100644
index 0000000000..49d00962a0
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/T21959.stderr
@@ -0,0 +1,3 @@
+
+T21959.hs:6:7: error: [GHC-85524]
+ Duplicate field name ‘fld’ in record update
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T23010_fail.hs b/testsuite/tests/overloadedrecflds/should_fail/T23010_fail.hs
new file mode 100644
index 0000000000..83421fd2de
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/T23010_fail.hs
@@ -0,0 +1,7 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module T23010_fail where
+
+import T23010_fail_aux ( X )
+data A = MkA { fld :: A, other :: X }
+data B = MkB { fld :: B }
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T23010_fail.hs-boot b/testsuite/tests/overloadedrecflds/should_fail/T23010_fail.hs-boot
new file mode 100644
index 0000000000..699c994b1f
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/T23010_fail.hs-boot
@@ -0,0 +1,7 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module T23010_fail where
+
+data A
+
+fld :: A -> A
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T23010_fail.stderr b/testsuite/tests/overloadedrecflds/should_fail/T23010_fail.stderr
new file mode 100644
index 0000000000..61e93b95bb
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/T23010_fail.stderr
@@ -0,0 +1,8 @@
+
+T23010_fail.hs-boot:7:1: error:
+ Ambiguous occurrence ‘T23010_fail.fld’
+ It could refer to
+ either the field ‘fld’ of record ‘A’,
+ defined at T23010_fail.hs:6:16
+ or the field ‘fld’ of record ‘B’,
+ defined at T23010_fail.hs:7:16
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T23010_fail_aux.hs b/testsuite/tests/overloadedrecflds/should_fail/T23010_fail_aux.hs
new file mode 100644
index 0000000000..d1e5cfefb7
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/T23010_fail_aux.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module T23010_fail_aux where
+
+import {-# SOURCE #-} T23010_fail ( fld )
+
+data X
+bar = fld
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T23063.hs b/testsuite/tests/overloadedrecflds/should_fail/T23063.hs
new file mode 100644
index 0000000000..c2b57bdafd
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/T23063.hs
@@ -0,0 +1,5 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+module T23063 where
+import qualified T23063_aux as A
+
+baz = _ :: A.S -> Int
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T23063.stderr b/testsuite/tests/overloadedrecflds/should_fail/T23063.stderr
new file mode 100644
index 0000000000..89cfdc7a2d
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/T23063.stderr
@@ -0,0 +1,12 @@
+
+T23063.hs:5:7: error: [GHC-88464]
+ • Found hole: _ :: A.S -> Int
+ • In the expression: _ :: A.S -> Int
+ In an equation for ‘baz’: baz = _ :: A.S -> Int
+ • Relevant bindings include
+ baz :: A.S -> Int (bound at T23063.hs:5:1)
+ Valid hole fits include
+ baz :: A.S -> Int (defined at T23063.hs:5:1)
+ A.foo :: A.S -> Int
+ (imported qualified from ‘T23063_aux’ at T23063.hs:3:1-32
+ (and originally defined at T23063_aux.hs:4:16-18))
diff --git a/testsuite/tests/overloadedrecflds/should_fail/T23063_aux.hs b/testsuite/tests/overloadedrecflds/should_fail/T23063_aux.hs
new file mode 100644
index 0000000000..d5552ebd6d
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/T23063_aux.hs
@@ -0,0 +1,4 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+module T23063_aux where
+
+data S = MkS { foo :: Int }
diff --git a/testsuite/tests/overloadedrecflds/should_fail/all.T b/testsuite/tests/overloadedrecflds/should_fail/all.T
index 28ec4f7b7e..2da5c8da2f 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/all.T
+++ b/testsuite/tests/overloadedrecflds/should_fail/all.T
@@ -1,4 +1,6 @@
-test('overloadedrecfldsfail01', normal, compile_fail, [''])
+test('overloadedrecfldsfail01a', normal, compile_fail, [''])
+test('overloadedrecfldsfail01b', normal, compile_fail, [''])
+test('overloadedrecfldsfail01c', normal, compile_fail, [''])
test('overloadedrecfldsfail02', normal, compile_fail, [''])
test('overloadedrecfldsfail03', normal, compile_fail, [''])
test('overloadedrecfldsfail04', [extra_files(['OverloadedRecFldsFail04_A.hs'])], multimod_compile_fail,
@@ -20,7 +22,6 @@ test('overloadedrecfldsfail14', normal, compile_fail, [''])
test('overloadedlabelsfail01', normal, compile_fail, [''])
test('overloadedlabelsfail02', normal, compile_fail, [''])
test('overloadedlabelsfail03', normal, compile_fail, [''])
-test('T11103', req_th, compile_fail, [''])
test('T11167_ambiguous_fixity', [], multimod_compile_fail,
['T11167_ambiguous_fixity', ''])
test('T13132_duplicaterecflds', normal, compile_fail, [''])
@@ -37,7 +38,7 @@ test('T17420', [extra_files(['T17420A.hs'])], multimod_compile_fail,
test('T17469', [extra_files(['T17469A.hs'])], multimod_compile_fail,
['T17469', ''])
test('T17965', normal, compile_fail, [''])
-test('DRFHoleFits', extra_files(['DRFHoleFits_A.hs']), multimod_compile_fail, ['DRFHoleFits', ''])
+test('DRFHoleFits', extra_files(['DRFHoleFits_A.hs']), multimod_compile_fail, ['DRFHoleFits', '-v0'])
test('DRFPartialFields', normal, compile_fail, [''])
test('T16745', extra_files(['T16745C.hs', 'T16745B.hs']), multimod_compile_fail, ['T16745A', ''])
test('FieldSelectors', normal, compile_fail, [''])
@@ -52,3 +53,9 @@ test('T18999_NoDisambiguateRecordFields', normal, compile_fail, [''])
test('DRFUnused', normal, compile_fail, [''])
test('T19287', normal, compile_fail, [''])
test('overloadedrecfldswasrunnowfail06', normal, compile_fail, [''])
+test('T21946', normal, compile_fail, [''])
+test('T21959', normal, compile_fail, [''])
+test('T23010_fail', [extra_files(['T23010_fail.hs-boot', 'T23010_fail_aux.hs'])]
+ , multimod_compile_fail
+ , ['T23010_fail T23010_fail_aux', '-v0'])
+test('T23063', extra_files(['T23063_aux.hs']), multimod_compile_fail, ['T23063', '-v0']) \ No newline at end of file
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01.stderr
index 66089a586e..a2cdc2bfd5 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01.stderr
@@ -1,22 +1,4 @@
-overloadedrecfldsfail01.hs:11:10: error: [GHC-99339]
- • Record update is ambiguous, and requires a type signature
- • In the expression: r {x = 3}
- In an equation for ‘upd1’: upd1 r = r {x = 3}
-
-overloadedrecfldsfail01.hs:14:10: error: [GHC-33238]
- • No type has all these fields: ‘x’, ‘y’, ‘z’
- • In the expression: r {x = 3, y = True, z = False}
- In an equation for ‘upd2’: upd2 r = r {x = 3, y = True, z = False}
-
-overloadedrecfldsfail01.hs:17:10: error: [GHC-54721]
- • ‘x’ is not a (visible) field of type ‘U’
- • In the expression: r {w = True, x = 3, y = True} :: U
- In an equation for ‘upd3’:
- upd3 r = r {w = True, x = 3, y = True} :: U
-
-overloadedrecfldsfail01.hs:17:10: error: [GHC-54721]
- • ‘w’ is not a (visible) field of type ‘U’
- • In the expression: r {w = True, x = 3, y = True} :: U
- In an equation for ‘upd3’:
- upd3 r = r {w = True, x = 3, y = True} :: U
+overloadedrecfldsfail01.hs:14:10: error:
+ Invalid record update.
+ No constructor in scope has all of the following fields: ‘z’, ‘y’
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01a.hs b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01a.hs
new file mode 100644
index 0000000000..be7284267e
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01a.hs
@@ -0,0 +1,13 @@
+-- Test ambiguous updates are rejected with appropriate error messages
+
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module OverloadedRecFieldsFail1a where
+
+data R = MkR { w :: Bool, x :: Int, y :: Bool }
+data S = MkS { w :: Bool, x :: Int, y :: Bool }
+data T = MkT { x :: Int, z :: Bool }
+data U = MkU { y :: Bool }
+
+-- Straightforward ambiguous update
+upd1 r = r { x = 3 }
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01a.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01a.stderr
new file mode 100644
index 0000000000..7ac58b0e43
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01a.stderr
@@ -0,0 +1,6 @@
+
+overloadedrecfldsfail01a.hs:13:10: error: [GHC-99339]
+ • Ambiguous record update with field ‘x’
+ This field appears in all of the datatypes ‘R’, ‘S’ and ‘T’
+ • In the expression: r {x = 3}
+ In an equation for ‘upd1’: upd1 r = r {x = 3}
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01b.hs b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01b.hs
new file mode 100644
index 0000000000..d3e14f4056
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01b.hs
@@ -0,0 +1,13 @@
+-- Test ambiguous updates are rejected with appropriate error messages
+
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module OverloadedRecFieldsFail1b where
+
+data R = MkR { w :: Bool, x :: Int, y :: Bool }
+data S = MkS { w :: Bool, x :: Int, y :: Bool }
+data T = MkT { x :: Int, z :: Bool }
+data U = MkU { y :: Bool }
+
+-- No type has all these fields
+upd2 r = r { x = 3, y = True, z = False }
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01b.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01b.stderr
new file mode 100644
index 0000000000..2a55c5d92b
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01b.stderr
@@ -0,0 +1,4 @@
+
+overloadedrecfldsfail01b.hs:13:10: error: [GHC-14392]
+ Invalid record update.
+ No constructor in scope has all of the following fields: ‘z’, ‘y’
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01.hs b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01c.hs
index 8ce9be7d47..cfa079e7b9 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01.hs
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01c.hs
@@ -2,18 +2,12 @@
{-# LANGUAGE DuplicateRecordFields #-}
+module OverloadedRecFieldsFail1c where
+
data R = MkR { w :: Bool, x :: Int, y :: Bool }
data S = MkS { w :: Bool, x :: Int, y :: Bool }
data T = MkT { x :: Int, z :: Bool }
data U = MkU { y :: Bool }
--- Straightforward ambiguous update
-upd1 r = r { x = 3 }
-
--- No type has all these fields
-upd2 r = r { x = 3, y = True, z = False }
-
-- User-specified type does not have these fields
upd3 r = r { w = True, x = 3, y = True } :: U
-
-main = return ()
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01c.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01c.stderr
new file mode 100644
index 0000000000..146e364e99
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail01c.stderr
@@ -0,0 +1,8 @@
+
+overloadedrecfldsfail01c.hs:13:10: error: [GHC-33238]
+ • No data constructor of type constructor ‘U’
+ has all of the fields:
+ ‘w’, ‘x’, ‘y’
+ • In the expression: r {w = True, x = 3, y = True} :: U
+ In an equation for ‘upd3’:
+ upd3 r = r {w = True, x = 3, y = True} :: U
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail02.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail02.stderr
index f6d03433fb..6a27569776 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail02.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail02.stderr
@@ -2,7 +2,7 @@
overloadedrecfldsfail02.hs:8:18: error:
Ambiguous occurrence ‘x’
It could refer to
- either the field ‘x’ of record ‘S’,
- defined at overloadedrecfldsfail02.hs:6:16
- or the field ‘x’ of record ‘R’,
+ either the field ‘x’ of record ‘R’,
defined at overloadedrecfldsfail02.hs:5:16
+ or the field ‘x’ of record ‘S’,
+ defined at overloadedrecfldsfail02.hs:6:16
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail05.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail05.stderr
index 3e2e0572f1..bff9bd544f 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail05.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail05.stderr
@@ -1,3 +1,3 @@
overloadedrecfldsfail05.hs:7:16: error: [-Wunused-top-binds (in -Wextra, -Wunused-binds), Werror=unused-top-binds]
- Defined but not used: ‘foo’
+ Defined but not used: record field of MkT ‘foo’
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail06.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail06.stderr
index 7567a038b4..3f0b17106a 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail06.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail06.stderr
@@ -4,14 +4,14 @@ OverloadedRecFldsFail06_A.hs:9:15: warning: [-Wunused-top-binds (in -Wextra, -Wu
Defined but not used: data constructor ‘MkUnused’
OverloadedRecFldsFail06_A.hs:9:42: warning: [-Wunused-top-binds (in -Wextra, -Wunused-binds)]
- Defined but not used: ‘unused2’
+ Defined but not used: record field of MkUnused ‘unused2’
OverloadedRecFldsFail06_A.hs:9:59: warning: [-Wunused-top-binds (in -Wextra, -Wunused-binds)]
- Defined but not used: ‘used_locally’
+ Defined but not used: record field of MkUnused ‘used_locally’
[2 of 3] Compiling Main ( overloadedrecfldsfail06.hs, overloadedrecfldsfail06.o )
overloadedrecfldsfail06.hs:7:1: error: [-Wunused-imports (in -Wextra), Werror=unused-imports]
- The import of ‘Unused(unused), V(x), U(y), MkV, Unused’
+ The import of ‘MkV, Unused, Unused(unused), V(x), U(y)’
from module ‘OverloadedRecFldsFail06_A’ is redundant
overloadedrecfldsfail06.hs:8:1: error: [-Wunused-imports (in -Wextra), Werror=unused-imports]
@@ -24,13 +24,15 @@ overloadedrecfldsfail06.hs:9:1: error: [-Wunused-imports (in -Wextra), Werror=un
from module ‘OverloadedRecFldsFail06_A’ is redundant
overloadedrecfldsfail06.hs:10:1: error: [-Wunused-imports (in -Wextra), Werror=unused-imports]
- The qualified import of ‘U(x), U’
+ The qualified import of ‘U, U(x)’
from module ‘OverloadedRecFldsFail06_A’ is redundant
overloadedrecfldsfail06.hs:15:22: error: [GHC-02256] [-Wambiguous-fields (in -Wdefault), Werror=ambiguous-fields]
- The record update u {x = True} with type U is ambiguous.
- This will not be supported by -XDuplicateRecordFields in future releases of GHC.
+ Ambiguous record update with parent type constructor ‘U’.
+ This type-directed disambiguation mechanism will not be supported by -XDuplicateRecordFields in future releases of GHC.
+ Consider disambiguating using module qualification instead.
overloadedrecfldsfail06.hs:18:28: error: [GHC-02256] [-Wambiguous-fields (in -Wdefault), Werror=ambiguous-fields]
- The record update v {P.x = 3} with type V is ambiguous.
- This will not be supported by -XDuplicateRecordFields in future releases of GHC.
+ Ambiguous record update with parent type constructor ‘V’.
+ This type-directed disambiguation mechanism will not be supported by -XDuplicateRecordFields in future releases of GHC.
+ Consider disambiguating using module qualification instead.
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail08.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail08.stderr
index d364f079d8..24085ea57c 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail08.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail08.stderr
@@ -1,5 +1,4 @@
overloadedrecfldsfail08.hs:9:9: error: [GHC-14392]
- • No constructor has all these fields: ‘x’, ‘y’
- • In the expression: e {x = 3, y = True}
- In an equation for ‘foo’: foo e = e {x = 3, y = True}
+ Invalid record update.
+ No constructor in scope has all of the following fields: ‘x’, ‘y’
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail10.hs b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail10.hs
index ccb25d3387..508d5a69c1 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail10.hs
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail10.hs
@@ -1,8 +1,8 @@
--- Modules A and B both declare F(foo)
--- Module C declares F($sel:foo:MkFChar) but exports A.F(foo) as well
--- Thus we can't export F(..) even with DuplicateRecordFields enabled
+-- Module A exports $fld:MkFInt:foo
+-- Module B exports $fld:MkFBool:foo
+-- Module C exports $fld:MkFChar:foo and re-exports $fld:MkFInt:foo
+-- Thus we can't export F(..) without -XDuplicateRecordFields
-{-# LANGUAGE DuplicateRecordFields #-}
module Main (main, F(..)) where
import OverloadedRecFldsFail10_B
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail10.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail10.stderr
index 8b113e19ee..ad62403ddc 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail10.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail10.stderr
@@ -3,12 +3,28 @@
[3 of 5] Compiling OverloadedRecFldsFail10_C ( OverloadedRecFldsFail10_C.hs, OverloadedRecFldsFail10_C.o )
[4 of 5] Compiling Main ( overloadedrecfldsfail10.hs, overloadedrecfldsfail10.o )
-overloadedrecfldsfail10.hs:6:20: error: [GHC-69158]
- Conflicting exports for ‘foo’:
- ‘F(..)’ exports ‘OverloadedRecFldsFail10_B.foo’
+overloadedrecfldsfail10.hs:6:20: error: [GHC-97219]
+ Duplicate record field ‘foo’ in export list:
+ ‘F(..)’ exports the field ‘foo’
+ belonging to the constructor ‘MkFChar’
+ imported from ‘OverloadedRecFldsFail10_C’ at overloadedrecfldsfail10.hs:9:1-32
+ (and originally defined at OverloadedRecFldsFail10_C.hs:6:34-36)
+ ‘F(..)’ exports the field ‘foo’
+ belonging to the constructor ‘MkFInt’
+ imported from ‘OverloadedRecFldsFail10_C’ at overloadedrecfldsfail10.hs:9:1-32
+ (and originally defined in ‘OverloadedRecFldsFail10_A’
+ at OverloadedRecFldsFail10_A.hs:5:32-34)
+ Suggested fix: Perhaps you intended to use DuplicateRecordFields
+
+overloadedrecfldsfail10.hs:6:20: error: [GHC-97219]
+ Duplicate record field ‘foo’ in export list:
+ ‘F(..)’ exports the field ‘foo’
+ belonging to the constructor ‘MkFBool’
imported from ‘OverloadedRecFldsFail10_B’ at overloadedrecfldsfail10.hs:8:1-32
(and originally defined at OverloadedRecFldsFail10_B.hs:6:34-36)
- ‘F(..)’ exports ‘OverloadedRecFldsFail10_C.foo’
+ ‘F(..)’ exports the field ‘foo’
+ belonging to the constructor ‘MkFInt’
imported from ‘OverloadedRecFldsFail10_C’ at overloadedrecfldsfail10.hs:9:1-32
(and originally defined in ‘OverloadedRecFldsFail10_A’
at OverloadedRecFldsFail10_A.hs:5:32-34)
+ Suggested fix: Perhaps you intended to use DuplicateRecordFields
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail11.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail11.stderr
index a146a0e9c6..54472f4293 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail11.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail11.stderr
@@ -4,9 +4,9 @@
overloadedrecfldsfail11.hs:5:15: error:
Ambiguous occurrence ‘foo’
It could refer to
- either the field ‘foo’ of record ‘T’,
- imported from ‘OverloadedRecFldsFail11_A’ at overloadedrecfldsfail11.hs:3:1-32
- (and originally defined at OverloadedRecFldsFail11_A.hs:6:16-18)
- or the field ‘foo’ of record ‘S’,
+ either the field ‘foo’ of record ‘S’,
imported from ‘OverloadedRecFldsFail11_A’ at overloadedrecfldsfail11.hs:3:1-32
(and originally defined at OverloadedRecFldsFail11_A.hs:5:16-18)
+ or the field ‘foo’ of record ‘T’,
+ imported from ‘OverloadedRecFldsFail11_A’ at overloadedrecfldsfail11.hs:3:1-32
+ (and originally defined at OverloadedRecFldsFail11_A.hs:6:16-18)
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail13.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail13.stderr
index 20c9e2dd97..4fb285b327 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail13.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail13.stderr
@@ -2,31 +2,31 @@
overloadedrecfldsfail13.hs:10:5: error:
Ambiguous occurrence ‘x’
It could refer to
- either the field ‘x’ of record ‘T’,
- defined at overloadedrecfldsfail13.hs:7:16
- or the field ‘x’ of record ‘S’,
+ either the field ‘x’ of record ‘S’,
defined at overloadedrecfldsfail13.hs:6:16
+ or the field ‘x’ of record ‘T’,
+ defined at overloadedrecfldsfail13.hs:7:16
overloadedrecfldsfail13.hs:12:5: error:
Ambiguous occurrence ‘x’
It could refer to
- either the field ‘x’ of record ‘T’,
- defined at overloadedrecfldsfail13.hs:7:16
- or the field ‘x’ of record ‘S’,
+ either the field ‘x’ of record ‘S’,
defined at overloadedrecfldsfail13.hs:6:16
+ or the field ‘x’ of record ‘T’,
+ defined at overloadedrecfldsfail13.hs:7:16
overloadedrecfldsfail13.hs:15:5: error:
Ambiguous occurrence ‘x’
It could refer to
- either the field ‘x’ of record ‘T’,
- defined at overloadedrecfldsfail13.hs:7:16
- or the field ‘x’ of record ‘S’,
+ either the field ‘x’ of record ‘S’,
defined at overloadedrecfldsfail13.hs:6:16
+ or the field ‘x’ of record ‘T’,
+ defined at overloadedrecfldsfail13.hs:7:16
overloadedrecfldsfail13.hs:18:5: error:
Ambiguous occurrence ‘x’
It could refer to
- either the field ‘x’ of record ‘T’,
- defined at overloadedrecfldsfail13.hs:7:16
- or the field ‘x’ of record ‘S’,
+ either the field ‘x’ of record ‘S’,
defined at overloadedrecfldsfail13.hs:6:16
+ or the field ‘x’ of record ‘T’,
+ defined at overloadedrecfldsfail13.hs:7:16
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail14.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail14.stderr
index 7b0d276a96..400a633946 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail14.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldsfail14.stderr
@@ -1,5 +1,3 @@
-overloadedrecfldsfail14.hs:12:7: error: [GHC-33238]
- • No type has all these fields: ‘x’, ‘y’
- • In the expression: r {x = 3, y = False}
- In an equation for ‘f’: f r = r {x = 3, y = False}
+overloadedrecfldsfail14.hs:12:18: error: [GHC-22385]
+ Not in scope: record field ‘y’
diff --git a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldswasrunnowfail06.stderr b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldswasrunnowfail06.stderr
index 789d87a6a3..c5f1e431c9 100644
--- a/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldswasrunnowfail06.stderr
+++ b/testsuite/tests/overloadedrecflds/should_fail/overloadedrecfldswasrunnowfail06.stderr
@@ -2,39 +2,39 @@
overloadedrecfldswasrunnowfail06.hs:11:11: error:
Ambiguous occurrence ‘x’
It could refer to
- either the field ‘x’ of record ‘U’,
- defined at overloadedrecfldswasrunnowfail06.hs:8:18
+ either the field ‘x’ of record ‘S’,
+ defined at overloadedrecfldswasrunnowfail06.hs:6:16
or the field ‘x’ of record ‘T’,
defined at overloadedrecfldswasrunnowfail06.hs:7:16
- or the field ‘x’ of record ‘S’,
- defined at overloadedrecfldswasrunnowfail06.hs:6:16
+ or the field ‘x’ of record ‘U’,
+ defined at overloadedrecfldswasrunnowfail06.hs:8:18
overloadedrecfldswasrunnowfail06.hs:13:11: error:
Ambiguous occurrence ‘x’
It could refer to
- either the field ‘x’ of record ‘U’,
- defined at overloadedrecfldswasrunnowfail06.hs:8:18
+ either the field ‘x’ of record ‘S’,
+ defined at overloadedrecfldswasrunnowfail06.hs:6:16
or the field ‘x’ of record ‘T’,
defined at overloadedrecfldswasrunnowfail06.hs:7:16
- or the field ‘x’ of record ‘S’,
- defined at overloadedrecfldswasrunnowfail06.hs:6:16
+ or the field ‘x’ of record ‘U’,
+ defined at overloadedrecfldswasrunnowfail06.hs:8:18
overloadedrecfldswasrunnowfail06.hs:15:13: error:
Ambiguous occurrence ‘x’
It could refer to
- either the field ‘x’ of record ‘U’,
- defined at overloadedrecfldswasrunnowfail06.hs:8:18
+ either the field ‘x’ of record ‘S’,
+ defined at overloadedrecfldswasrunnowfail06.hs:6:16
or the field ‘x’ of record ‘T’,
defined at overloadedrecfldswasrunnowfail06.hs:7:16
- or the field ‘x’ of record ‘S’,
- defined at overloadedrecfldswasrunnowfail06.hs:6:16
+ or the field ‘x’ of record ‘U’,
+ defined at overloadedrecfldswasrunnowfail06.hs:8:18
overloadedrecfldswasrunnowfail06.hs:21:20: error:
Ambiguous occurrence ‘x’
It could refer to
- either the field ‘x’ of record ‘U’,
- defined at overloadedrecfldswasrunnowfail06.hs:8:18
+ either the field ‘x’ of record ‘S’,
+ defined at overloadedrecfldswasrunnowfail06.hs:6:16
or the field ‘x’ of record ‘T’,
defined at overloadedrecfldswasrunnowfail06.hs:7:16
- or the field ‘x’ of record ‘S’,
- defined at overloadedrecfldswasrunnowfail06.hs:6:16
+ or the field ‘x’ of record ‘U’,
+ defined at overloadedrecfldswasrunnowfail06.hs:8:18
diff --git a/testsuite/tests/overloadedrecflds/should_run/T17551b.hs b/testsuite/tests/overloadedrecflds/should_run/T17551b.hs
new file mode 100644
index 0000000000..c78da2b23c
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_run/T17551b.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module Main where
+
+data Foo = Foo { foo :: Int, biz :: Bool }
+data Bar = Bar { foo :: Int }
+
+main :: IO ()
+main = print $
+ $$( [|| \ ( Bar { foo } ) -> foo ||] ) ( Bar 3 )
+ + case $$( [|| \ r -> r { foo = 2, biz = False } ||] ) ( Foo 1 False ) of
+ Foo { foo } -> foo
+
diff --git a/testsuite/tests/overloadedrecflds/should_run/T17551b.stdout b/testsuite/tests/overloadedrecflds/should_run/T17551b.stdout
new file mode 100644
index 0000000000..7ed6ff82de
--- /dev/null
+++ b/testsuite/tests/overloadedrecflds/should_run/T17551b.stdout
@@ -0,0 +1 @@
+5
diff --git a/testsuite/tests/overloadedrecflds/should_run/all.T b/testsuite/tests/overloadedrecflds/should_run/all.T
index ce4bbfd728..b3a08e7138 100644
--- a/testsuite/tests/overloadedrecflds/should_run/all.T
+++ b/testsuite/tests/overloadedrecflds/should_run/all.T
@@ -18,3 +18,4 @@ test('hasfieldrun02', normal, compile_and_run, [''])
test('T12243', normal, compile_and_run, [''])
test('T11228', normal, compile_and_run, [''])
test('T11671_run', normal, compile_and_run, [''])
+test('T17551b', [req_th], compile_and_run, [''])
diff --git a/testsuite/tests/parser/should_compile/T14189.stderr b/testsuite/tests/parser/should_compile/T14189.stderr
index caede8b720..1bd38be52a 100644
--- a/testsuite/tests/parser/should_compile/T14189.stderr
+++ b/testsuite/tests/parser/should_compile/T14189.stderr
@@ -186,14 +186,14 @@
(L
(SrcSpanAnn (EpAnnNotUsed) { T14189.hs:3:3-15 })
(IEThingWith
- [(L
- { T14189.hs:3:11 }
- (FieldLabel
- (FieldLabelString
- {FastString: "f"})
- (NoDuplicateRecordFields)
- (FieldSelectors)
- {Name: T14189.f}))]
+ (EpAnn
+ (Anchor
+ { T14189.hs:3:3-8 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnOpenP (EpaSpan { T14189.hs:3:10 }))
+ ,(AddEpAnn AnnCloseP (EpaSpan { T14189.hs:3:15 }))]
+ (EpaComments
+ []))
(L
(SrcSpanAnn (EpAnnNotUsed) { T14189.hs:3:3-8 })
(IEName
@@ -203,6 +203,21 @@
{Name: T14189.MyType})))
(NoIEWildcard)
[(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { T14189.hs:3:11 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddCommaAnn
+ (EpaSpan { T14189.hs:3:12 }))])
+ (EpaComments
+ [])) { T14189.hs:3:11 })
+ (IEName
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T14189.hs:3:11 })
+ {Name: T14189.f})))
+ ,(L
(SrcSpanAnn (EpAnnNotUsed) { T14189.hs:3:13-14 })
(IEName
(NoExtField)
@@ -211,17 +226,9 @@
{Name: T14189.NT})))]))
[(AvailTC
{Name: T14189.MyType}
- [(NormalGreName
- {Name: T14189.MyType})
- ,(NormalGreName
- {Name: T14189.NT})
- ,(FieldGreName
- (FieldLabel
- (FieldLabelString
- {FastString: "f"})
- (NoDuplicateRecordFields)
- (FieldSelectors)
- {Name: T14189.f}))])])])
+ [{Name: T14189.MyType}
+ ,{Name: T14189.f}
+ ,{Name: T14189.NT}])])])
(Nothing)))
diff --git a/testsuite/tests/patsyn/should_fail/mixed-pat-syn-record-sels.stderr b/testsuite/tests/patsyn/should_fail/mixed-pat-syn-record-sels.stderr
index 934a55a87e..3c20c90285 100644
--- a/testsuite/tests/patsyn/should_fail/mixed-pat-syn-record-sels.stderr
+++ b/testsuite/tests/patsyn/should_fail/mixed-pat-syn-record-sels.stderr
@@ -1,5 +1,4 @@
mixed-pat-syn-record-sels.hs:9:9: error: [GHC-14392]
- • No constructor has all these fields: ‘a’, ‘b’
- • In the expression: x {a = True, b = False}
- In an equation for ‘foo’: foo x = x {a = True, b = False}
+ Invalid record update.
+ No constructor in scope has all of the following fields: ‘a’, ‘b’
diff --git a/testsuite/tests/patsyn/should_fail/records-mixing-fields.stderr b/testsuite/tests/patsyn/should_fail/records-mixing-fields.stderr
index 77901b9eee..9829eef3c3 100644
--- a/testsuite/tests/patsyn/should_fail/records-mixing-fields.stderr
+++ b/testsuite/tests/patsyn/should_fail/records-mixing-fields.stderr
@@ -1,14 +1,5 @@
-records-mixing-fields.hs:10:14: error: [GHC-40887]
- • Cannot use a mixture of pattern synonym and record selectors
- Record selectors defined by ‘MyRec’: qux
- Pattern synonym selectors defined by ‘HisRec’: f1
- • In the expression: a {f1 = 1, qux = "two"}
- In an equation for ‘updater1’: updater1 a = a {f1 = 1, qux = "two"}
-
-records-mixing-fields.hs:12:14: error: [GHC-40887]
- • Cannot use a mixture of pattern synonym and record selectors
- Record selectors defined by ‘MyRec’: foo
- Pattern synonym selectors defined by ‘HisRec’: f1
- • In the expression: a {f1 = 1, foo = 2}
- In an equation for ‘updater2’: updater2 a = a {f1 = 1, foo = 2}
+records-mixing-fields.hs:10:14: error: [GHC-14392]
+ Invalid record update.
+ No constructor in scope has all of the following fields:
+ ‘f1’, ‘qux’
diff --git a/testsuite/tests/perf/compiler/Makefile b/testsuite/tests/perf/compiler/Makefile
index 33d2878db7..762883b0b4 100644
--- a/testsuite/tests/perf/compiler/Makefile
+++ b/testsuite/tests/perf/compiler/Makefile
@@ -32,4 +32,3 @@ MultiLayerModulesTH_OneShot_Prep: MultiLayerModulesTH_Make_Prep
InstanceMatching:
./genMatchingTest 0
'$(TEST_HC)' $(TEST_HC_OPTS) -fno-code -fwrite-interface Defs.hs
-
diff --git a/testsuite/tests/perf/compiler/all.T b/testsuite/tests/perf/compiler/all.T
index 96d30e8017..37a6fdb2f9 100644
--- a/testsuite/tests/perf/compiler/all.T
+++ b/testsuite/tests/perf/compiler/all.T
@@ -660,3 +660,12 @@ test ('InfiniteListFusion',
[collect_stats('bytes allocated',2), when(arch('i386'), skip), js_broken(22576)],
compile_and_run,
['-O2 -package ghc'])
+
+# Track performance of record update renaming/typechecking
+test('RecordUpdPerf',
+ [ collect_compiler_stats('bytes allocated',2),
+ pre_cmd('./genRecordUpdPerf'),
+ extra_files(['genRecordUpdPerf']),
+ ],
+ multimod_compile,
+ ['RecordUpdPerf', '-fno-code -v0'])
diff --git a/testsuite/tests/perf/compiler/genRecordUpdPerf b/testsuite/tests/perf/compiler/genRecordUpdPerf
new file mode 100755
index 0000000000..2ccbb67407
--- /dev/null
+++ b/testsuite/tests/perf/compiler/genRecordUpdPerf
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+RECORDS=15
+FIELDS=20
+UPDATES_PER_RECORD=5
+echo "{-# LANGUAGE DuplicateRecordFields #-}" > RecordUpdPerf.hs
+echo "module RecordUpdPerf where" >> RecordUpdPerf.hs
+for r in $(seq -w 1 $RECORDS); do
+ echo "data R$r = MkR$r {" >> RecordUpdPerf.hs
+ for f in $(seq -w 1 $FIELDS); do
+ echo " r$f :: Int," >> RecordUpdPerf.hs
+ echo " s${r}_$f :: Int," >> RecordUpdPerf.hs
+ done
+ echo " t :: Bool }" >> RecordUpdPerf.hs
+done
+
+for u in $(seq -w 1 $UPDATES_PER_RECORD); do
+ for r in $(seq -w 1 $RECORDS); do
+ echo "f${r}_$u r = r {" >> RecordUpdPerf.hs
+ for f in $(seq -w 1 $FIELDS); do
+ echo " r$f = $u * $r * $f," >> RecordUpdPerf.hs
+ done
+ echo " s${r}_$FIELDS = $u + $r }" >> RecordUpdPerf.hs
+ done
+done
diff --git a/testsuite/tests/perf/compiler/hard_hole_fits.stderr b/testsuite/tests/perf/compiler/hard_hole_fits.stderr
index bfabc44219..694741f71d 100644
--- a/testsuite/tests/perf/compiler/hard_hole_fits.stderr
+++ b/testsuite/tests/perf/compiler/hard_hole_fits.stderr
@@ -492,10 +492,7 @@ hard_hole_fits.hs:38:33: warning: [GHC-88464] [-Wtyped-holes (in -Wdefault)]
• Found hole: _ :: Int
• In an equation for ‘testMe’: testMe (RecordUpd xru gl gls) = _
• Relevant bindings include
- gls :: Either
- [Language.Haskell.Syntax.Pat.LHsRecUpdField GhcPs]
- [LHsRecUpdProj GhcPs]
- (bound at hard_hole_fits.hs:38:26)
+ gls :: LHsRecUpdFields GhcPs (bound at hard_hole_fits.hs:38:26)
gl :: LHsExpr GhcPs (bound at hard_hole_fits.hs:38:23)
xru :: Language.Haskell.Syntax.Extension.XRecordUpd GhcPs
(bound at hard_hole_fits.hs:38:19)
diff --git a/testsuite/tests/plugins/static-plugins.stdout b/testsuite/tests/plugins/static-plugins.stdout
index 5da8e9bee8..98d70197cd 100644
--- a/testsuite/tests/plugins/static-plugins.stdout
+++ b/testsuite/tests/plugins/static-plugins.stdout
@@ -5,9 +5,9 @@ interfacePlugin: GHC.Base
interfacePlugin: GHC.Float
interfacePlugin: GHC.Prim.Ext
interfacePlugin: System.IO
-typeCheckPlugin (rn)
interfacePlugin: GHC.Types
interfacePlugin: GHC.Show
+typeCheckPlugin (rn)
interfacePlugin: GHC.TopHandler
typeCheckPlugin (tc)
interfacePlugin: GHC.CString
diff --git a/testsuite/tests/rename/should_compile/T22122.hs b/testsuite/tests/rename/should_compile/T22122.hs
new file mode 100644
index 0000000000..25f8377e96
--- /dev/null
+++ b/testsuite/tests/rename/should_compile/T22122.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module T22122 where
+
+import T22122_aux ( data_decls, record_upds )
+
+-- This test checks that we can handle record declarations and updates
+-- when the field 'Name's share the same underlying string.
+
+-- data D1 = MkD1 { fld1 :: Char, fld2 :: String }
+-- data D2 = MkD2A { fld1 :: Char } | MkD2B { fld2 :: String }
+$(return data_decls)
+
+-- rec_upd r = r { fld1 = 'c', fld2 = "foo" }
+$(return record_upds)
diff --git a/testsuite/tests/rename/should_compile/T22122_aux.hs b/testsuite/tests/rename/should_compile/T22122_aux.hs
new file mode 100644
index 0000000000..b62aaa5840
--- /dev/null
+++ b/testsuite/tests/rename/should_compile/T22122_aux.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE DeriveTraversable #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE TemplateHaskell #-}
+
+module T22122_aux where
+
+import Language.Haskell.TH.Syntax
+ ( Name, Type(ConT), Lit(CharL, StringL)
+ , Dec(DataD, FunD), Con(RecC), Exp(LitE, VarE, RecUpdE), Pat(VarP)
+ , Clause(Clause), Body(NormalB)
+ , Bang(..), SourceUnpackedness(..), SourceStrictness(..)
+ , newNameIO )
+import System.IO.Unsafe
+ ( unsafePerformIO )
+
+
+data Names a
+ = Names { d1_name, d2_name
+ , mkd1_name, mkd2a_name, mkd2b_name
+ , d1_fld1_name, d1_fld2_name, d2_fld1_name, d2_fld2_name
+ , upd_name, upd_var_name :: a }
+ deriving stock ( Functor, Foldable, Traversable )
+
+string_names :: Names String
+string_names =
+ Names
+ { d1_name = "D1"
+ , d2_name = "D2"
+ , mkd1_name = "MkD1"
+ , mkd2a_name = "MkD2A"
+ , mkd2b_name = "MkD2B"
+ , d1_fld1_name = "fld" -- these are deliberately the same,
+ , d1_fld2_name = "fld" -- to check that we correctly use the exact Names
+ , d2_fld1_name = "fld" -- in a record update, and not simply the
+ , d2_fld2_name = "fld" -- field label strings
+ , upd_name = "upd"
+ , upd_var_name = "r"
+ }
+
+names :: Names Name
+names = unsafePerformIO $ traverse newNameIO string_names
+
+noBang :: Bang
+noBang = Bang NoSourceUnpackedness NoSourceStrictness
+
+-- data D1 = MkD1 { fld1 :: Char, fld2 :: String }
+-- data D2 = MkD2A { fld1 :: Char } | MkD2B { fld2 :: String }
+data_decls :: [ Dec ]
+data_decls = [ d1, d2 ]
+ where
+ Names { .. } = names
+ d1 = DataD [] d1_name [] Nothing [mkd1] []
+ d2 = DataD [] d2_name [] Nothing [mkd2_a, mkd2_b] []
+ mkd1 = RecC mkd1_name [(d1_fld1_name, noBang, ConT ''Char), (d1_fld2_name, noBang, ConT ''String)]
+ mkd2_a = RecC mkd2a_name [(d2_fld1_name, noBang, ConT ''Char)]
+ mkd2_b = RecC mkd2b_name [(d2_fld2_name, noBang, ConT ''String)]
+
+-- upd r = r { fld1 = 'c', fld2 = "foo" }
+record_upds :: [ Dec ]
+record_upds = [ rec_upd ]
+ where
+ Names { .. } = names
+ rec_upd = FunD upd_name [upd_clause]
+ upd_clause = Clause [VarP upd_var_name] (NormalB rec_upd_body) []
+ rec_upd_body = RecUpdE (VarE upd_var_name)
+ [ (d1_fld1_name, LitE (CharL 'c'))
+ , (d1_fld2_name, LitE (StringL "foo")) ]
diff --git a/testsuite/tests/rename/should_compile/all.T b/testsuite/tests/rename/should_compile/all.T
index ba05c88357..55f58fcebc 100644
--- a/testsuite/tests/rename/should_compile/all.T
+++ b/testsuite/tests/rename/should_compile/all.T
@@ -208,3 +208,4 @@ test('GADTSymbolicRecordRecordWildcard', normal, compile, [''])
test('ImportNullaryRecordWildcard', [extra_files(['NullaryRecordWildcard.hs', 'NullaryRecordRecordWildcard.hs'])], multimod_compile, ['ImportNullaryRecordWildcard', '-v0'])
test('GHCINullaryRecordWildcard', combined_output, ghci_script, ['GHCINullaryRecordWildcard.script'])
test('GHCIImplicitImportNullaryRecordWildcard', combined_output, ghci_script, ['GHCIImplicitImportNullaryRecordWildcard.script'])
+test('T22122', [expect_broken(22122), extra_files(['T22122_aux.hs'])], multimod_compile, ['T22122', '-v0'])
diff --git a/testsuite/tests/rename/should_fail/T11167_ambig.stderr b/testsuite/tests/rename/should_fail/T11167_ambig.stderr
index 8c9c6a7848..74c7064414 100644
--- a/testsuite/tests/rename/should_fail/T11167_ambig.stderr
+++ b/testsuite/tests/rename/should_fail/T11167_ambig.stderr
@@ -2,15 +2,15 @@
T11167_ambig.hs:10:13: error:
Ambiguous occurrence ‘runContT’
It could refer to
- either the field ‘runContT’ of record ‘ContT'’,
- defined at T11167_ambig.hs:7:32
- or the field ‘runContT’ of record ‘ContT’,
+ either the field ‘runContT’ of record ‘ContT’,
defined at T11167_ambig.hs:6:30
+ or the field ‘runContT’ of record ‘ContT'’,
+ defined at T11167_ambig.hs:7:32
T11167_ambig.hs:17:9: error:
Ambiguous occurrence ‘runContT’
It could refer to
- either the field ‘runContT’ of record ‘ContT'’,
- defined at T11167_ambig.hs:7:32
- or the field ‘runContT’ of record ‘ContT’,
+ either the field ‘runContT’ of record ‘ContT’,
defined at T11167_ambig.hs:6:30
+ or the field ‘runContT’ of record ‘ContT'’,
+ defined at T11167_ambig.hs:7:32
diff --git a/testsuite/tests/rename/should_fail/T12681.stderr b/testsuite/tests/rename/should_fail/T12681.stderr
index 3a48d80c17..6b57b8517b 100644
--- a/testsuite/tests/rename/should_fail/T12681.stderr
+++ b/testsuite/tests/rename/should_fail/T12681.stderr
@@ -1,4 +1,5 @@
T12681.hs:4:17: error: [GHC-76037]
Not in scope: ‘a’
- Suggested fix: Perhaps use ‘T12681a.a’ (imported from T12681a)
+ Suggested fix:
+ Perhaps use record field of A ‘T12681a.a’ (imported from T12681a)
diff --git a/testsuite/tests/rename/should_fail/T19843f.stderr b/testsuite/tests/rename/should_fail/T19843f.stderr
index c7c4d5dc58..4cf8e47089 100644
--- a/testsuite/tests/rename/should_fail/T19843f.stderr
+++ b/testsuite/tests/rename/should_fail/T19843f.stderr
@@ -1,8 +1,4 @@
-T19843f.hs:8:12: error: [GHC-76037]
- Not in scope: ‘mup’
- Suggested fix: Perhaps use ‘mop’ (line 5)
-
-T19843f.hs:10:10: error: [GHC-76037]
- Not in scope: ‘mup’
- Suggested fix: Perhaps use ‘mop’ (line 5)
+T19843f.hs:8:12: error: [GHC-22385]
+ Not in scope: record field ‘mup’
+ Suggested fix: Perhaps use record field of A ‘mop’ (line 5)
diff --git a/testsuite/tests/rename/should_fail/T19843g.stderr b/testsuite/tests/rename/should_fail/T19843g.stderr
index 78ee13eadf..e6441413be 100644
--- a/testsuite/tests/rename/should_fail/T19843g.stderr
+++ b/testsuite/tests/rename/should_fail/T19843g.stderr
@@ -1,4 +1,4 @@
-T19843g.hs:10:12: error: [GHC-76037]
- Not in scope: ‘mup’
- Suggested fix: Perhaps use ‘mop’ (line 7)
+T19843g.hs:10:12: error: [GHC-22385]
+ Not in scope: record field ‘mup’
+ Suggested fix: Perhaps use record field of A ‘mop’ (line 7)
diff --git a/testsuite/tests/rename/should_fail/T19843h.stderr b/testsuite/tests/rename/should_fail/T19843h.stderr
index 43cf59befd..55d3fcdd96 100644
--- a/testsuite/tests/rename/should_fail/T19843h.stderr
+++ b/testsuite/tests/rename/should_fail/T19843h.stderr
@@ -2,7 +2,7 @@
T19843h.hs:14:7: error: [GHC-39999]
• No instance for ‘GHC.Records.HasField "mup" r4 a4’
arising from selecting the field ‘mup’
- Perhaps use ‘mop’ (line 11)
+ Perhaps use record field of A ‘mop’ (line 11)
• In the expression: undefined.mup
In an equation for ‘foo’: foo = undefined.mup
@@ -27,7 +27,7 @@ T19843h.hs:20:8: error: [GHC-39999]
T19843h.hs:24:8: error: [GHC-39999]
• No instance for ‘GHC.Records.HasField "getAll" r0 a0’
arising from selecting the field ‘getAll’
- Perhaps use ‘getAlt’ (imported from Data.Monoid)
+ Perhaps use record field of Alt ‘getAlt’ (imported from Data.Monoid)
Perhaps you want to add ‘getAll’ to the import list
in the import of ‘Data.Monoid’ (T19843h.hs:9:1-28).
• In the expression: undefined.getAll
diff --git a/testsuite/tests/rename/should_fail/T21605a.stderr b/testsuite/tests/rename/should_fail/T21605a.stderr
index 7be47098df..ce199cfb8f 100644
--- a/testsuite/tests/rename/should_fail/T21605a.stderr
+++ b/testsuite/tests/rename/should_fail/T21605a.stderr
@@ -4,7 +4,6 @@ T21605a.hs:5:13: error: [GHC-76037]
NB: the module ‘Prelude’ does not export ‘true’.
Suggested fix:
Perhaps use one of these:
+ data constructor ‘Prelude.True’ (imported from Prelude),
type constructor or class ‘Prelude.Num’ (imported from Prelude),
- type constructor or class ‘Prelude.Ord’ (imported from Prelude),
- type constructor or class ‘Prelude.Enum’ (imported from Prelude)
-
+ type constructor or class ‘Prelude.Ord’ (imported from Prelude)
diff --git a/testsuite/tests/rename/should_fail/T21605d.stderr b/testsuite/tests/rename/should_fail/T21605d.stderr
index 3db644aa93..0c0c3975af 100644
--- a/testsuite/tests/rename/should_fail/T21605d.stderr
+++ b/testsuite/tests/rename/should_fail/T21605d.stderr
@@ -1,8 +1,9 @@
-T21605d.hs:3:9: [GHC-37479]
+
+T21605d.hs:3:9: error: [GHC-37479]
‘Prelude.id’ is a term-level binding
and can not be used at the type level.
Suggested fix:
Perhaps use one of these:
+ data constructor ‘Prelude.EQ’ (imported from Prelude),
type constructor or class ‘Prelude.Eq’ (imported from Prelude),
- type constructor or class ‘Prelude.IO’ (imported from Prelude),
- type constructor or class ‘Prelude.Ord’ (imported from Prelude) \ No newline at end of file
+ data constructor ‘Prelude.GT’ (imported from Prelude)
diff --git a/testsuite/tests/rename/should_fail/T7943.hs b/testsuite/tests/rename/should_fail/T7943.hs
index a1a99d508a..335cb350c7 100644
--- a/testsuite/tests/rename/should_fail/T7943.hs
+++ b/testsuite/tests/rename/should_fail/T7943.hs
@@ -1,4 +1,4 @@
module T7943 where
data Foo = A { bar :: String }
- | B String { bar :: String }
+ | B String { bar :: String }
diff --git a/testsuite/tests/rename/should_fail/T7943.stderr b/testsuite/tests/rename/should_fail/T7943.stderr
index 3100928e51..352d4c1f40 100644
--- a/testsuite/tests/rename/should_fail/T7943.stderr
+++ b/testsuite/tests/rename/should_fail/T7943.stderr
@@ -1,6 +1,3 @@
-T7943.hs:4:22: error: [GHC-89246]
- • Record syntax is illegal here: {bar :: String}
- • In the type ‘{bar :: String}’
- In the definition of data constructor ‘B’
- In the data declaration for ‘Foo’
+T7943.hs:4:21: error: [GHC-89246]
+ Record syntax is illegal here: {bar :: String}
diff --git a/testsuite/tests/rename/should_fail/T9077.stderr b/testsuite/tests/rename/should_fail/T9077.stderr
index a3a9d49ece..c20800b12f 100644
--- a/testsuite/tests/rename/should_fail/T9077.stderr
+++ b/testsuite/tests/rename/should_fail/T9077.stderr
@@ -1,2 +1,2 @@
-T9077.hs:3:12: Record syntax is illegal here: {}
+T9077.hs:3:12: error: [GHC-89246] Record syntax is illegal here: {}
diff --git a/testsuite/tests/rename/should_fail/T9156.stderr b/testsuite/tests/rename/should_fail/T9156.stderr
index 361ed379df..1dbfb9b02e 100644
--- a/testsuite/tests/rename/should_fail/T9156.stderr
+++ b/testsuite/tests/rename/should_fail/T9156.stderr
@@ -1,5 +1,3 @@
-T9156.hs:4:19:
- Multiple declarations of ‘f1’
- Declared at: T9156.hs:3:15
- T9156.hs:4:19
+T9156.hs:4:19: error: [GHC-85524]
+ Duplicate field name ‘f1’ in record declaration
diff --git a/testsuite/tests/rename/should_fail/T9156_DF.hs b/testsuite/tests/rename/should_fail/T9156_DF.hs
new file mode 100644
index 0000000000..aa55756c71
--- /dev/null
+++ b/testsuite/tests/rename/should_fail/T9156_DF.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE TypeFamilies #-}
+
+module T9156_DF where
+
+data X = MkX
+
+data family D a
+data instance D Int
+ = D1 { f1 :: X }
+ | D2 { f1 :: X, f2 :: X, f1 :: X }
diff --git a/testsuite/tests/rename/should_fail/T9156_DF.stderr b/testsuite/tests/rename/should_fail/T9156_DF.stderr
new file mode 100644
index 0000000000..61e2af19a4
--- /dev/null
+++ b/testsuite/tests/rename/should_fail/T9156_DF.stderr
@@ -0,0 +1,3 @@
+
+T9156_DF.hs:10:29: error: [GHC-85524]
+ Duplicate field name ‘f1’ in record declaration
diff --git a/testsuite/tests/rename/should_fail/all.T b/testsuite/tests/rename/should_fail/all.T
index 2255117886..8d3029bd06 100644
--- a/testsuite/tests/rename/should_fail/all.T
+++ b/testsuite/tests/rename/should_fail/all.T
@@ -104,6 +104,7 @@ test('RnStaticPointersFail02', [], compile_fail, [''])
test('RnStaticPointersFail03', [], compile_fail, ['-dsuppress-uniques'])
test('T9006', [], multimod_compile_fail, ['T9006', '-v0'])
test('T9156', normal, compile_fail, [''])
+test('T9156_DF', normal, compile_fail, [''])
test('T9177', normal, compile_fail, [''])
test('T9177a', normal, compile_fail, [''])
test('T9436', normal, compile_fail, [''])
diff --git a/testsuite/tests/rename/should_fail/rn_dup.hs b/testsuite/tests/rename/should_fail/rn_dup.hs
index 927e15ff32..7c2fc3380e 100644
--- a/testsuite/tests/rename/should_fail/rn_dup.hs
+++ b/testsuite/tests/rename/should_fail/rn_dup.hs
@@ -12,7 +12,7 @@ data P = MkP { rf :: Int, rf :: Int }
data Q = MkQ { rf :: Int }
class C a where
- data CT a
+ data CT a
f :: CT a -> a
data CT a
f :: CT a -> a
diff --git a/testsuite/tests/rename/should_fail/rn_dup.stderr b/testsuite/tests/rename/should_fail/rn_dup.stderr
index 5c4246d8b6..907fc38fe8 100644
--- a/testsuite/tests/rename/should_fail/rn_dup.stderr
+++ b/testsuite/tests/rename/should_fail/rn_dup.stderr
@@ -9,14 +9,12 @@ rn_dup.hs:9:10: error:
Declared at: rn_dup.hs:7:10
rn_dup.hs:9:10
-rn_dup.hs:12:16: error:
- Multiple declarations of ‘rf’
- Declared at: rn_dup.hs:11:27
- rn_dup.hs:12:16
+rn_dup.hs:11:27: error: [GHC-85524]
+ Duplicate field name ‘rf’ in record declaration
rn_dup.hs:12:16: error:
Multiple declarations of ‘rf’
- Declared at: rn_dup.hs:11:16
+ Declared at: rn_dup.hs:11:27
rn_dup.hs:12:16
rn_dup.hs:17:3: error:
diff --git a/testsuite/tests/rename/should_fail/rnfail054.stderr b/testsuite/tests/rename/should_fail/rnfail054.stderr
index 04fff51118..3cb01c63da 100644
--- a/testsuite/tests/rename/should_fail/rnfail054.stderr
+++ b/testsuite/tests/rename/should_fail/rnfail054.stderr
@@ -1,5 +1,3 @@
-rnfail054.hs:6:13: error: [GHC-47535]
- • ‘foo’ is not a record selector
- • In the expression: x {foo = 1}
- In an equation for ‘foo’: foo x = x {foo = 1}
+rnfail054.hs:6:13: error: [GHC-22385]
+ Not in scope: record field ‘foo’
diff --git a/testsuite/tests/rep-poly/T20113.stderr b/testsuite/tests/rep-poly/T20113.stderr
index 3d52dbe734..1358d188ea 100644
--- a/testsuite/tests/rep-poly/T20113.stderr
+++ b/testsuite/tests/rep-poly/T20113.stderr
@@ -4,12 +4,11 @@ T20113.hs:7:35: error: [GHC-55287]
does not have a fixed runtime representation.
Its type is:
a :: TYPE rep
- • In the pattern: MkY {y_fld = $sel:y_fld:MkY}
- In an equation for ‘T20113.$sel:y_fld:MkY’:
- T20113.$sel:y_fld:MkY MkY {y_fld = $sel:y_fld:MkY} = $sel:y_fld:MkY
+ • In the pattern: MkY {y_fld = y_fld}
+ In an equation for ‘y_fld’: y_fld MkY {y_fld = y_fld} = y_fld
T20113.hs:7:35: error: [GHC-55287]
- The first pattern in the equation for ‘$sel:y_fld:MkY’
+ The first pattern in the equation for ‘y_fld’
does not have a fixed runtime representation.
Its type is:
Y a :: TYPE rep
diff --git a/testsuite/tests/th/T10279.stderr b/testsuite/tests/th/T10279.stderr
index 5993cdbf82..4a06b1d775 100644
--- a/testsuite/tests/th/T10279.stderr
+++ b/testsuite/tests/th/T10279.stderr
@@ -4,5 +4,8 @@ T10279.hs:10:9: error: [GHC-52243]
no unit id matching ‘rts-1.0.2’ was found
(This unit ID looks like the source package ID;
the real unit ID is ‘rts’)
- • In the expression: rts-1.0.2:A.Foo
- In an equation for ‘blah’: blah = (rts-1.0.2:A.Foo)
+ • In the untyped splice:
+ $(conE
+ (Name
+ (mkOccName "Foo")
+ (NameG VarName (mkPkgName "rts-1.0.2") (mkModName "A"))))
diff --git a/testsuite/tests/th/T10828.hs b/testsuite/tests/th/T10828.hs
index ffb4525f6a..d73b5015ae 100644
--- a/testsuite/tests/th/T10828.hs
+++ b/testsuite/tests/th/T10828.hs
@@ -6,6 +6,7 @@ module T10828 where
import Language.Haskell.TH hiding (Type)
import System.IO
import Data.Kind (Type)
+import qualified Data.List.NonEmpty as NE ( singleton )
$( do { decl <- [d| data family D a :: Type -> Type
data instance D Int Bool :: Type where
@@ -33,7 +34,7 @@ $( return
[ DataD [] (mkName "T")
[ PlainTV (mkName "a") () ]
(Just StarT)
- [ GadtC [(mkName "MkT")]
+ [ GadtC (NE.singleton (mkName "MkT"))
[ ( Bang NoSourceUnpackedness NoSourceStrictness
, VarT (mkName "a")
)
@@ -46,7 +47,7 @@ $( return
, ForallC [PlainTV (mkName "a") SpecifiedSpec, PlainTV (mkName "b") SpecifiedSpec]
[AppT (AppT EqualityT (VarT $ mkName "a" ) )
(ConT $ mkName "Int") ] $
- RecGadtC [(mkName "MkC")]
+ RecGadtC (NE.singleton (mkName "MkC"))
[ ( mkName "foo"
, Bang NoSourceUnpackedness NoSourceStrictness
, VarT (mkName "a")
diff --git a/testsuite/tests/th/T10828b.hs b/testsuite/tests/th/T10828b.hs
index 03706d6b7c..36e91eb11a 100644
--- a/testsuite/tests/th/T10828b.hs
+++ b/testsuite/tests/th/T10828b.hs
@@ -4,6 +4,7 @@ module T10828b where
import Language.Haskell.TH
import System.IO
+import qualified Data.List.NonEmpty as NE ( singleton )
-- attempting to mix GADT and normal constructors
$( return
@@ -23,7 +24,7 @@ $( return
[AppT (AppT EqualityT (VarT $ mkName "a" ) )
(ConT $ mkName "Int") ] $
RecGadtC
- [ (mkName "MkC")]
+ (NE.singleton (mkName "MkC"))
[ ( mkName "foo"
, Bang NoSourceUnpackedness NoSourceStrictness
, VarT (mkName "a")
diff --git a/testsuite/tests/th/T10828b.stderr b/testsuite/tests/th/T10828b.stderr
index 357c86c458..6e78ca9087 100644
--- a/testsuite/tests/th/T10828b.stderr
+++ b/testsuite/tests/th/T10828b.stderr
@@ -1,5 +1,5 @@
-T10828b.hs:9:2: error: [GHC-24104]
+T10828b.hs:10:2: error: [GHC-24104]
Cannot mix GADT constructors with Haskell 98 constructors
When splicing a TH declaration:
data T a :: *
diff --git a/testsuite/tests/th/T11345.hs b/testsuite/tests/th/T11345.hs
index 2288cdad15..11de6d8bd5 100644
--- a/testsuite/tests/th/T11345.hs
+++ b/testsuite/tests/th/T11345.hs
@@ -5,6 +5,7 @@
module Main (main) where
import Language.Haskell.TH
+import qualified Data.List.NonEmpty as NE ( singleton )
infixr 7 :***:
data GADT a where
@@ -16,11 +17,11 @@ $(do gadtName <- newName "GADT2"
infixName <- newName ":****:"
a <- newName "a"
return [ DataD [] gadtName [KindedTV a () StarT] Nothing
- [ GadtC [prefixName]
+ [ GadtC (NE.singleton prefixName)
[ (Bang NoSourceUnpackedness NoSourceStrictness,ConT ''Int)
, (Bang NoSourceUnpackedness NoSourceStrictness,ConT ''Int)
] (AppT (ConT gadtName) (ConT ''Int))
- , GadtC [infixName]
+ , GadtC (NE.singleton infixName)
[ (Bang NoSourceUnpackedness NoSourceStrictness,ConT ''Int)
, (Bang NoSourceUnpackedness NoSourceStrictness,ConT ''Int)
] (AppT (ConT gadtName) (ConT ''Int))
diff --git a/testsuite/tests/th/T11941.stderr b/testsuite/tests/th/T11941.stderr
index 39a25c7425..7a66251092 100644
--- a/testsuite/tests/th/T11941.stderr
+++ b/testsuite/tests/th/T11941.stderr
@@ -1,7 +1,7 @@
-T11941.hs:7:30: error: [GHC-76037]
- Not in scope: ‘getFrst’
+T11941.hs:7:30: error: [GHC-22385]
+ Not in scope: record field ‘getFrst’
Suggested fix:
Perhaps use one of these:
- ‘getFirst’ (imported from Data.Monoid),
- ‘getLast’ (imported from Data.Monoid)
+ record field of First ‘getFirst’ (imported from Data.Monoid),
+ record field of Last ‘getLast’ (imported from Data.Monoid)
diff --git a/testsuite/tests/th/T17379a.hs b/testsuite/tests/th/T17379a.hs
deleted file mode 100644
index 66702bb9b8..0000000000
--- a/testsuite/tests/th/T17379a.hs
+++ /dev/null
@@ -1,8 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE GADTSyntax #-}
-
-module T17379a where
-
-import Language.Haskell.TH
-
-$(let typ = mkName "T" in pure [ DataD [] typ [] Nothing [GadtC [] [] (ConT typ)] [] ])
diff --git a/testsuite/tests/th/T17379a.stderr b/testsuite/tests/th/T17379a.stderr
deleted file mode 100644
index ebb899e750..0000000000
--- a/testsuite/tests/th/T17379a.stderr
+++ /dev/null
@@ -1,4 +0,0 @@
-
-T17379a.hs:8:2: error: [GHC-38140]
- GadtC must have at least one constructor name
- When splicing a TH declaration: data T where :: T
diff --git a/testsuite/tests/th/T17379b.hs b/testsuite/tests/th/T17379b.hs
deleted file mode 100644
index c83d180d18..0000000000
--- a/testsuite/tests/th/T17379b.hs
+++ /dev/null
@@ -1,8 +0,0 @@
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE GADTSyntax #-}
-
-module T17379b where
-
-import Language.Haskell.TH
-
-$(let typ = mkName "T" in pure [ DataD [] typ [] Nothing [RecGadtC [] [] (ConT typ)] [] ])
diff --git a/testsuite/tests/th/T17379b.stderr b/testsuite/tests/th/T17379b.stderr
deleted file mode 100644
index 9a4aabc250..0000000000
--- a/testsuite/tests/th/T17379b.stderr
+++ /dev/null
@@ -1,4 +0,0 @@
-
-T17379b.hs:8:2: error: [GHC-18816]
- RecGadtC must have at least one constructor name
- When splicing a TH declaration: data T where :: {} -> T
diff --git a/testsuite/tests/th/all.T b/testsuite/tests/th/all.T
index a4f948bc76..2b792da6e2 100644
--- a/testsuite/tests/th/all.T
+++ b/testsuite/tests/th/all.T
@@ -504,8 +504,6 @@ test('T17296', normal, compile, ['-v0'])
test('T17305', normal, compile, ['-v0'])
test('T17380', normal, compile_fail, [''])
test('T17394', normal, compile, ['-v0 -ddump-splices -dsuppress-uniques'])
-test('T17379a', normal, compile_fail, [''])
-test('T17379b', normal, compile_fail, [''])
test('T17461', normal, compile, ['-v0 -ddump-splices -dsuppress-uniques'])
test('T17511', normal, compile, [''])
test('T17608', normal, compile, ['-v0 -ddump-splices -dsuppress-uniques'])
diff --git a/testsuite/tests/typecheck/should_compile/QualifiedRecordUpdate.hs b/testsuite/tests/typecheck/should_compile/QualifiedRecordUpdate.hs
new file mode 100644
index 0000000000..3657ab4463
--- /dev/null
+++ b/testsuite/tests/typecheck/should_compile/QualifiedRecordUpdate.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module QualifiedRecordUpdate where
+
+import QualifiedRecordUpdate_aux ( R(fld1, fld2), S(fld1, fld2) )
+import qualified QualifiedRecordUpdate_aux as B ( R(fld1, fld2), S(fld1) )
+
+-- Unambiguous record update: the only record datatype in the B namespace
+-- which contains field fld2 is R.
+f r = r { B.fld1 = 3, B.fld2 = False }
diff --git a/testsuite/tests/typecheck/should_compile/QualifiedRecordUpdate_aux.hs b/testsuite/tests/typecheck/should_compile/QualifiedRecordUpdate_aux.hs
new file mode 100644
index 0000000000..c03abe277c
--- /dev/null
+++ b/testsuite/tests/typecheck/should_compile/QualifiedRecordUpdate_aux.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module QualifiedRecordUpdate_aux where
+
+data R = R { fld1 :: Int, fld2 :: Bool }
+data S = S { fld1 :: Int, fld2 :: Bool, fld3 :: Char }
diff --git a/testsuite/tests/typecheck/should_compile/T21443.hs b/testsuite/tests/typecheck/should_compile/T21443.hs
new file mode 100644
index 0000000000..7dbd451c09
--- /dev/null
+++ b/testsuite/tests/typecheck/should_compile/T21443.hs
@@ -0,0 +1,10 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module T21443 where
+
+data R = MkR1 { foo :: Int }
+ | MkR2 { bar :: Int }
+
+data S = MkS { foo :: Int, bar :: Int }
+
+blah x = x { foo = 5, bar = 6 }
diff --git a/testsuite/tests/typecheck/should_compile/all.T b/testsuite/tests/typecheck/should_compile/all.T
index 327dd93675..4c200961f4 100644
--- a/testsuite/tests/typecheck/should_compile/all.T
+++ b/testsuite/tests/typecheck/should_compile/all.T
@@ -865,4 +865,8 @@ test('T22985a', normal, compile, ['-O'])
test('T22985b', normal, compile, [''])
test('T23018', normal, compile, [''])
test('T21909', normal, compile, [''])
-test('T21909b', normal, compile, ['']) \ No newline at end of file
+test('T21909b', normal, compile, [''])
+test('T21443', normal, compile, [''])
+test('QualifiedRecordUpdate',
+ [ extra_files(['QualifiedRecordUpdate_aux.hs']) ]
+ , multimod_compile, ['QualifiedRecordUpdate', '-v0'])
diff --git a/testsuite/tests/typecheck/should_fail/T12035.hs b/testsuite/tests/typecheck/should_fail/T12035.hs
index 87e20ff07c..cd12eee917 100644
--- a/testsuite/tests/typecheck/should_fail/T12035.hs
+++ b/testsuite/tests/typecheck/should_fail/T12035.hs
@@ -1,7 +1,7 @@
module T12035 where
import T12035a
type T = Bool
-y = f True
+--y = f True
-- This should error that 'type T = Int' doesn't match 'data T',
-- NOT that f expects argument of type T but got Bool.
diff --git a/testsuite/tests/typecheck/should_fail/T21444.hs b/testsuite/tests/typecheck/should_fail/T21444.hs
new file mode 100644
index 0000000000..28f2010dbd
--- /dev/null
+++ b/testsuite/tests/typecheck/should_fail/T21444.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module T21444 where
+
+data S = MkS { foo, bar, baz :: Int }
+data T = MkT { foo, bar, baz :: Int }
+
+blah x = x { foo = 1, bar = 2, baz = 3 }
diff --git a/testsuite/tests/typecheck/should_fail/T21444.stderr b/testsuite/tests/typecheck/should_fail/T21444.stderr
new file mode 100644
index 0000000000..cd4795c969
--- /dev/null
+++ b/testsuite/tests/typecheck/should_fail/T21444.stderr
@@ -0,0 +1,6 @@
+
+T21444.hs:8:10: error: [GHC-99339]
+ • Ambiguous record update with fields ‘foo’, ‘bar’ and ‘baz’
+ These fields appear in both datatypes ‘S’ and ‘T’
+ • In the expression: x {foo = 1, bar = 2, baz = 3}
+ In an equation for ‘blah’: blah x = x {foo = 1, bar = 2, baz = 3}
diff --git a/testsuite/tests/typecheck/should_fail/T7989.stderr b/testsuite/tests/typecheck/should_fail/T7989.stderr
index 7413b06648..f5271b2167 100644
--- a/testsuite/tests/typecheck/should_fail/T7989.stderr
+++ b/testsuite/tests/typecheck/should_fail/T7989.stderr
@@ -1,15 +1,4 @@
T7989.hs:6:7: error: [GHC-14392]
- • No constructor has all these fields: ‘a0’, ‘b0’
- • In the expression: x {a0 = 3, a1 = 2, b0 = 4, b1 = 5}
- In an equation for ‘f’: f x = x {a0 = 3, a1 = 2, b0 = 4, b1 = 5}
-
-T7989.hs:9:7: error: [GHC-14392]
- • No constructor has all these fields: ‘x’, ‘y’, ‘z’
- • In the expression: a {x = 0, y = 0, z = 0, v = 0}
- In an equation for ‘g’: g a = a {x = 0, y = 0, z = 0, v = 0}
-
-T7989.hs:11:7: error: [GHC-14392]
- • No constructor has all these fields: ‘x’, ‘a0’
- • In the expression: a {x = 0, a0 = 0}
- In an equation for ‘h’: h a = a {x = 0, a0 = 0}
+ Invalid record update.
+ No constructor in scope has all of the following fields: ‘a0’, ‘b0’
diff --git a/testsuite/tests/typecheck/should_fail/all.T b/testsuite/tests/typecheck/should_fail/all.T
index 209f292737..2afc480451 100644
--- a/testsuite/tests/typecheck/should_fail/all.T
+++ b/testsuite/tests/typecheck/should_fail/all.T
@@ -675,3 +675,4 @@ test('T19627', normal, compile_fail, [''])
test('PatSynExistential', normal, compile_fail, [''])
test('PatSynArity', normal, compile_fail, [''])
test('PatSynUnboundVar', normal, compile_fail, [''])
+test('T21444', normal, compile_fail, [''])
diff --git a/testsuite/tests/typecheck/should_fail/tcfail114.stderr b/testsuite/tests/typecheck/should_fail/tcfail114.stderr
index 7516ebb712..b751b31cd0 100644
--- a/testsuite/tests/typecheck/should_fail/tcfail114.stderr
+++ b/testsuite/tests/typecheck/should_fail/tcfail114.stderr
@@ -1,5 +1,3 @@
-tcfail114.hs:11:20: error: [GHC-47535]
- • ‘foo’ is not a record selector
- • In the expression: undefined {foo = ()}
- In an equation for ‘test’: test = undefined {foo = ()}
+tcfail114.hs:11:20: error: [GHC-22385]
+ Not in scope: record field ‘foo’
diff --git a/testsuite/tests/warnings/should_compile/DodgyExports01.stderr b/testsuite/tests/warnings/should_compile/DodgyExports01.stderr
index d3cae826ab..f916bcfaa4 100644
--- a/testsuite/tests/warnings/should_compile/DodgyExports01.stderr
+++ b/testsuite/tests/warnings/should_compile/DodgyExports01.stderr
@@ -1,5 +1,4 @@
DodgyExports01.hs:2:13: warning: [GHC-75356] [-Wdodgy-exports (in -Wextra)]
The export item ‘T(..)’ suggests that
- ‘T’ has (in-scope) constructors or class methods,
- but it has none
+ ‘T’ has (in-scope) constructors or record fields, but it has none