summaryrefslogtreecommitdiff
path: root/compiler/GHC/Rename/Env.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Rename/Env.hs')
-rw-r--r--compiler/GHC/Rename/Env.hs38
1 files changed, 11 insertions, 27 deletions
diff --git a/compiler/GHC/Rename/Env.hs b/compiler/GHC/Rename/Env.hs
index e19697bb40..cd40ab100a 100644
--- a/compiler/GHC/Rename/Env.hs
+++ b/compiler/GHC/Rename/Env.hs
@@ -495,7 +495,8 @@ lookupRecFieldOcc mb_con rdr_name
, isUnboundName con -- Avoid error cascade
= return (mkUnboundNameRdr rdr_name)
| Just con <- mb_con
- = do { flds <- lookupConstructorFields con
+ = lookupExactOrOrig rdr_name id $ -- See Note [Record field names and Template Haskell]
+ do { flds <- lookupConstructorFields con
; env <- getGlobalRdrEnv
; let lbl = occNameFS (rdrNameOcc rdr_name)
mb_field = do fl <- find ((== lbl) . flLabel) flds
@@ -511,12 +512,13 @@ lookupRecFieldOcc mb_con rdr_name
; case mb_field of
Just (fl, gre) -> do { addUsedGRE True gre
; return (flSelector fl) }
- Nothing -> lookupGlobalOccRn' WantBoth rdr_name }
- -- See Note [Fall back on lookupGlobalOccRn in lookupRecFieldOcc]
- | otherwise
- -- This use of Global is right as we are looking up a selector which
- -- can only be defined at the top level.
+ Nothing -> do { addErr (badFieldConErr con lbl)
+ ; return (mkUnboundNameRdr rdr_name) } }
+
+ | otherwise -- Can't use the data constructor to disambiguate
= lookupGlobalOccRn' WantBoth rdr_name
+ -- This use of Global is right as we are looking up a selector,
+ -- which can only be defined at the top level.
-- | Look up an occurrence of a field in a record update, returning the selector
-- name.
@@ -632,25 +634,8 @@ Unlike with constructors or pattern-matching, we do not allow the module
qualifier to be omitted, because we do not have a data constructor from which to
determine it.
-
-Note [Fall back on lookupGlobalOccRn in lookupRecFieldOcc]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Whenever we fail to find the field or it is not in scope, mb_field
-will be False, and we fall back on looking it up normally using
-lookupGlobalOccRn. We don't report an error immediately because the
-actual problem might be located elsewhere. For example (#9975):
-
- data Test = Test { x :: Int }
- pattern Test wat = Test { x = wat }
-
-Here there are multiple declarations of Test (as a data constructor
-and as a pattern synonym), which will be reported as an error. We
-shouldn't also report an error about the occurrence of `x` in the
-pattern synonym RHS. However, if the pattern synonym gets added to
-the environment first, we will try and fail to find `x` amongst the
-(nonexistent) fields of the pattern synonym.
-
-Alternatively, the scope check can fail due to Template Haskell.
+Note [Record field names and Template Haskell]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Consider (#12130):
module Foo where
@@ -669,7 +654,6 @@ lookupGlobalOccRn will find it.
-}
-
-- | Used in export lists to lookup the children.
lookupSubBndrOcc_helper :: Bool -> Bool -> Name -> RdrName
-> RnM ChildLookupResult
@@ -834,7 +818,7 @@ lookupSubBndrOcc :: Bool
-> RdrName
-> RnM (Either NotInScopeError Name)
-- Find all the things the rdr-name maps to
--- and pick the one with the right parent namep
+-- and pick the one with the right parent name
lookupSubBndrOcc warn_if_deprec the_parent doc rdr_name = do
res <-
lookupExactOrOrig rdr_name (FoundChild NoParent . NormalGreName) $