From 3d638f1b7b665c0e67e4e20827ad98cf307ff381 Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Thu, 23 Apr 2009 09:42:37 +0000 Subject: [PATCH] Fix Trac #3176: intercept naughty record selectors When making record selectors into ordinary functions (rather than magial implicit Ids) I forgot that they could therefore show up in the *local* TcEnv, not the global one. This fixes that problem, and thereby Trac #3176. --- compiler/typecheck/TcExpr.lhs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/compiler/typecheck/TcExpr.lhs b/compiler/typecheck/TcExpr.lhs index 51d6f4b..b255fdb 100644 --- a/compiler/typecheck/TcExpr.lhs +++ b/compiler/typecheck/TcExpr.lhs @@ -1069,6 +1069,9 @@ lookupFun orig id_name -- nor does it need the 'lifting' treatment ATcId { tct_id = id, tct_type = ty, tct_co = mb_co, tct_level = lvl } + | isNaughtyRecordSelector id -> failWithTc (naughtyRecordSel id) + -- Note [Local record selectors] + | otherwise -> do { thLocalId orig id ty lvl ; case mb_co of Unrefineable -> return (HsVar id, ty) @@ -1147,6 +1150,12 @@ thBrackId orig id ps_var lie_var #endif /* GHCI */ \end{code} +Local record selectors +~~~~~~~~~~~~~~~~~~~~~~ +Record selectors for TyCons in this module are ordinary local bindings, +which show up as ATcIds rather than AGlobals. So we need to check for +naughtiness in both branches. c.f. TcTyClsBindings.mkAuxBinds. + %************************************************************************ %* * -- 1.7.10.4