Fix Trac #2141: invalid record update
authorsimonpj@microsoft.com <unknown>
Wed, 2 Apr 2008 13:20:57 +0000 (13:20 +0000)
committersimonpj@microsoft.com <unknown>
Wed, 2 Apr 2008 13:20:57 +0000 (13:20 +0000)
See Note [Record field lookup] in TcEnv.  The fix here
is quite straightforward.

compiler/typecheck/TcEnv.lhs

index aa27a43..1f9d305 100644 (file)
@@ -134,10 +134,22 @@ tcLookupGlobal name
 
 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