Do not warn about unused underscore-prefixed fields (fixes Trac #12609)
authorAdam Gundry <adam@well-typed.com>
Sat, 1 Oct 2016 21:56:58 +0000 (17:56 -0400)
committerBen Gamari <ben@smart-cactus.org>
Sun, 2 Oct 2016 00:01:29 +0000 (20:01 -0400)
When DuplicateRecordFields is enabled, the mangling of selector names
was causing them to be reported as unused even if prefixed by an
underscore. This corrects the OccName used by the check.

Test Plan: New test overloadedrecflds/should_compile/T12609

Reviewers: austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2549

GHC Trac Issues: #12609

compiler/rename/RnEnv.hs
testsuite/tests/overloadedrecflds/should_compile/T12609.hs [new file with mode: 0644]
testsuite/tests/overloadedrecflds/should_compile/all.T

index 37e389e..b1cb7fe 100644 (file)
@@ -2145,7 +2145,7 @@ warnUnused flag names = do
 
 warnUnused1 :: WarningFlag -> NameEnv (FieldLabelString, Name) -> Name -> RnM ()
 warnUnused1 flag fld_env name
-  = when (reportable name) $
+  = when (reportable name occ) $
     addUnusedWarning flag
                      occ (nameSrcSpan name)
                      (text "Defined but not used")
@@ -2158,7 +2158,7 @@ warnUnusedGRE :: GlobalRdrElt -> RnM ()
 warnUnusedGRE gre@(GRE { gre_name = name, gre_lcl = lcl, gre_imp = is })
   | lcl       = do fld_env <- mkFieldEnv <$> getGlobalRdrEnv
                    warnUnused1 Opt_WarnUnusedTopBinds fld_env name
-  | otherwise = when (reportable name) (mapM_ warn is)
+  | otherwise = when (reportable name occ) (mapM_ warn is)
   where
     occ = greOccName gre
     warn spec = addUnusedWarning Opt_WarnUnusedTopBinds occ span msg
@@ -2176,12 +2176,15 @@ mkFieldEnv rdr_env = mkNameEnv [ (gre_name gre, (lbl, par_is (gre_par gre)))
                                , Just lbl <- [greLabel gre]
                                ]
 
-reportable :: Name -> Bool
-reportable name
+-- | Should we report the fact that this 'Name' is unused? The
+-- 'OccName' may differ from 'nameOccName' due to
+-- DuplicateRecordFields.
+reportable :: Name -> OccName -> Bool
+reportable name occ
   | isWiredInName name = False    -- Don't report unused wired-in names
                                   -- Otherwise we get a zillion warnings
                                   -- from Data.Tuple
-  | otherwise = not (startsWithUnderscore (nameOccName name))
+  | otherwise = not (startsWithUnderscore occ)
 
 addUnusedWarning :: WarningFlag -> OccName -> SrcSpan -> SDoc -> RnM ()
 addUnusedWarning flag occ span msg
diff --git a/testsuite/tests/overloadedrecflds/should_compile/T12609.hs b/testsuite/tests/overloadedrecflds/should_compile/T12609.hs
new file mode 100644 (file)
index 0000000..7b8205b
--- /dev/null
@@ -0,0 +1,8 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# OPTIONS_GHC -Werror -Wunused-top-binds #-}
+module Main (main, T(MkT)) where
+
+data T = MkT { _x :: Int }
+
+main :: IO ()
+main = return ()
index ea5baf8..264fa11 100644 (file)
@@ -1 +1,2 @@
 test('T11173', extra_clean(['T11173a.hi', 'T11173a.o']), multimod_compile, ['T11173', '-v0'])
+test('T12609', normal, compile, [''])