import SrcLoc
import Outputable
import Maybes
+import FastString
\end{code}
tcLookupField :: Name -> TcM Id -- Returns the selector Id
tcLookupField name = do
- thing <- tcLookupGlobal name
+ thing <- tcLookup name -- Note [Record field lookup]
case thing of
- AnId id -> return id
- other -> wrongThingErr "field name" (AGlobal thing) name
+ AGlobal (AnId id) -> return id
+ thing -> wrongThingErr "field name" thing name
+
+{- Note [Record field lookup]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+You might think we should have tcLookupGlobal here, since record fields
+are always top level. But consider
+ f = e { f = True }
+Then the renamer (which does not keep track of what is a record selector
+and what is not) will rename the definition thus
+ f_7 = e { f_7 = True }
+Now the type checker will find f_7 in the *local* type environment, not
+the global one. It's wrong, of course, but we want to report a tidy
+error, not in TcEnv.notFound. -}
tcLookupDataCon :: Name -> TcM DataCon
tcLookupDataCon name = do