Skip to content

unused-top-binds wrongly warns about underscore-prefixed field names when DuplicateRecordFields enabled

Given this code:

module Main (main) where

data Foo
  = Foo { _foo :: String
        , _bar :: String
        } deriving (Eq, Show)


main :: IO ()
main = do
  let x = Foo "apple" "bear"
  putStrLn $ "x = " ++ show x

Saved as unused-fields.hs

Then with ghc 8.0.1:

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.0.1

The following command will compile without error or warning:

$ ghc -Wall -Werror -o unused-fields ./unused-fields.hs

But if DuplicateRecordFields is enabled, then:

$ ghc -Wall -Werror -o unused-fields ./unused-fields.hs -XDuplicateRecordFields
[1 of 1] Compiling Main             ( unused-fields.hs, unused-fields.o ) [flags changed]

unused-fields.hs:21:11: warning: [-Wunused-top-binds]
    Defined but not used: ‘_foo’

unused-fields.hs:22:11: warning: [-Wunused-top-binds]
    Defined but not used: ‘_bar’

<no location info>: error:
Failing due to -Werror.

I would have no warnings, since _foo and _bar have underscore prefixes, which is a documented way of selectively disabling this warning. (c.f. https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/using-warnings.html#ghc-flag--Wunused-top-binds).

Details requested by https://ghc.haskell.org/trac/ghc/wiki/ReportABug:

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.38)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

GOOD (without -XDuplicateRecordFields)

$ ghc -dcore-lint -v -Wall -Werror -o unused-fields ./unused-fields.hs
Glasgow Haskell Compiler, Version 8.0.1, stage 2 booted by GHC version 7.10.3
Using binary package database: /nix/store/vvn40k4257a2f6dlps52jnff6qa41ph3-ghc-8.0.1/lib/ghc-8.0.1/package.conf.d/package.cache
loading package database /nix/store/vvn40k4257a2f6dlps52jnff6qa41ph3-ghc-8.0.1/lib/ghc-8.0.1/package.conf.d
wired-in package ghc-prim mapped to ghc-prim-0.5.0.0
wired-in package integer-gmp mapped to integer-gmp-1.0.0.1
wired-in package base mapped to base-4.9.0.0
wired-in package rts mapped to rts
wired-in package template-haskell mapped to template-haskell-2.11.0.0
wired-in package ghc mapped to ghc-8.0.1
wired-in package dph-seq not found.
wired-in package dph-par not found.
Hsc static flags:
loading package database /nix/store/vvn40k4257a2f6dlps52jnff6qa41ph3-ghc-8.0.1/lib/ghc-8.0.1/package.conf.d
wired-in package ghc-prim mapped to ghc-prim-0.5.0.0
wired-in package integer-gmp mapped to integer-gmp-1.0.0.1
wired-in package base mapped to base-4.9.0.0
wired-in package rts mapped to rts-1.0
wired-in package template-haskell mapped to template-haskell-2.11.0.0
wired-in package ghc mapped to ghc-8.0.1
wired-in package dph-seq not found.
wired-in package dph-par not found.
*** Chasing dependencies:
Chasing modules from: *unused-fields.hs
!!! Chasing dependencies: finished in 0.68 milliseconds, allocated 0.777 megabytes
Stable obj: [Main]
Stable BCO: []
Ready for upsweep
  [NONREC
      ModSummary {
         ms_hs_date = 2016-09-22 08:27:24 UTC
         ms_mod = Main,
         ms_textual_imps = [(Nothing, Prelude)]
         ms_srcimps = []
      }]
*** Deleting temp files:
Deleting:
compile: input file unused-fields.hs
*** Checking old interface for Main:
[1 of 1] Skipping  Main             ( unused-fields.hs, unused-fields.o )
Upsweep completely successful.
*** Deleting temp files:
Deleting:
link: linkables are ...
LinkableM (2016-09-22 08:45:48 UTC) Main
   [DotO unused-fields.o]
Linking unused-fields ...
Created temporary directory: /var/folders/6q/jpykk8bn6dq68ynzm6c1r7c40000gn/T/ghc62639_0
*** C Compiler:
/nix/store/a5f6qqgzgmmvw0xkvlfdsjzaprmnlz2s-clang-wrapper-3.7.1/bin/cc -m64 -fno-stack-protector -DTABLES_NEXT_TO_CODE -c /var/folders/6q/jpykk8bn6dq68ynzm6c1r7c40000gn/T/ghc62639_0/ghc_1.c -o /var/folders/6q/jpykk8bn6dq68ynzm6c1r7c40000gn/T/ghc62639_0/ghc_2.o -fno-common -U__PIC__ -D__PIC__ -I/nix/store/vvn40k4257a2f6dlps52jnff6qa41ph3-ghc-8.0.1/lib/ghc-8.0.1/include
*** Linker:
/nix/store/a5f6qqgzgmmvw0xkvlfdsjzaprmnlz2s-clang-wrapper-3.7.1/bin/cc -m64 -fno-stack-protector -DTABLES_NEXT_TO_CODE -m64 -o unused-fields -Wl,-no_compact_unwind unused-fields.o -L/nix/store/vvn40k4257a2f6dlps52jnff6qa41ph3-ghc-8.0.1/lib/ghc-8.0.1/base-4.9.0.0 -L/nix/store/8dkzvp7d7vpprc8cblmjcyyyzyy9940i-libiconv-osx-10.9.5/lib -L/nix/store/vvn40k4257a2f6dlps52jnff6qa41ph3-ghc-8.0.1/lib/ghc-8.0.1/integer-gmp-1.0.0.1 -L/nix/store/8b7big21k9ipi44mqlnp8njbkncwhh27-gmp-6.1.0/lib -L/nix/store/vvn40k4257a2f6dlps52jnff6qa41ph3-ghc-8.0.1/lib/ghc-8.0.1/ghc-prim-0.5.0.0 -L/nix/store/vvn40k4257a2f6dlps52jnff6qa41ph3-ghc-8.0.1/lib/ghc-8.0.1/rts /var/folders/6q/jpykk8bn6dq68ynzm6c1r7c40000gn/T/ghc62639_0/ghc_2.o -Wl,-u,_ghczmprim_GHCziTypes_Izh_static_info -Wl,-u,_ghczmprim_GHCziTypes_Czh_static_info -Wl,-u,_ghczmprim_GHCziTypes_Fzh_static_info -Wl,-u,_ghczmprim_GHCziTypes_Dzh_static_info -Wl,-u,_base_GHCziPtr_Ptr_static_info -Wl,-u,_ghczmprim_GHCziTypes_Wzh_static_info -Wl,-u,_base_GHCziInt_I8zh_static_info -Wl,-u,_base_GHCziInt_I16zh_static_info -Wl,-u,_base_GHCziInt_I32zh_static_info -Wl,-u,_base_GHCziInt_I64zh_static_info -Wl,-u,_base_GHCziWord_W8zh_static_info -Wl,-u,_base_GHCziWord_W16zh_static_info -Wl,-u,_base_GHCziWord_W32zh_static_info -Wl,-u,_base_GHCziWord_W64zh_static_info -Wl,-u,_base_GHCziStable_StablePtr_static_info -Wl,-u,_ghczmprim_GHCziTypes_Izh_con_info -Wl,-u,_ghczmprim_GHCziTypes_Czh_con_info -Wl,-u,_ghczmprim_GHCziTypes_Fzh_con_info -Wl,-u,_ghczmprim_GHCziTypes_Dzh_con_info -Wl,-u,_base_GHCziPtr_Ptr_con_info -Wl,-u,_base_GHCziPtr_FunPtr_con_info -Wl,-u,_base_GHCziStable_StablePtr_con_info -Wl,-u,_ghczmprim_GHCziTypes_False_closure -Wl,-u,_ghczmprim_GHCziTypes_True_closure -Wl,-u,_base_GHCziPack_unpackCString_closure -Wl,-u,_base_GHCziIOziException_stackOverflow_closure -Wl,-u,_base_GHCziIOziException_heapOverflow_closure -Wl,-u,_base_ControlziExceptionziBase_nonTermination_closure -Wl,-u,_base_GHCziIOziException_blockedIndefinitelyOnMVar_closure -Wl,-u,_base_GHCziIOziException_blockedIndefinitelyOnSTM_closure -Wl,-u,_base_GHCziIOziException_allocationLimitExceeded_closure -Wl,-u,_base_ControlziExceptionziBase_nestedAtomically_closure -Wl,-u,_base_GHCziEventziThread_blockedOnBadFD_closure -Wl,-u,_base_GHCziWeak_runFinalizzerBatch_closure -Wl,-u,_base_GHCziTopHandler_flushStdHandles_closure -Wl,-u,_base_GHCziTopHandler_runIO_closure -Wl,-u,_base_GHCziTopHandler_runNonIO_closure -Wl,-u,_base_GHCziConcziIO_ensureIOManagerIsRunning_closure -Wl,-u,_base_GHCziConcziIO_ioManagerCapabilitiesChanged_closure -Wl,-u,_base_GHCziConcziSync_runSparks_closure -Wl,-u,_base_GHCziConcziSignal_runHandlersPtr_closure -Wl,-search_paths_first -lHSbase-4.9.0.0 -lHSinteger-gmp-1.0.0.1 -lHSghc-prim-0.5.0.0 -lHSrts -lCffi -liconv -lgmp -lm -ldl
link: done
*** Deleting temp files:
Deleting: /var/folders/6q/jpykk8bn6dq68ynzm6c1r7c40000gn/T/ghc62639_0/ghc_2.o /var/folders/6q/jpykk8bn6dq68ynzm6c1r7c40000gn/T/ghc62639_0/ghc_1.c
*** Deleting temp dirs:
Deleting: /var/folders/6q/jpykk8bn6dq68ynzm6c1r7c40000gn/T/ghc62639_0

BAD

$ ghc -dcore-lint -v -Wall -Werror -o unused-fields ./unused-fields.hs -XDuplicateRecordFields
Glasgow Haskell Compiler, Version 8.0.1, stage 2 booted by GHC version 7.10.3
Using binary package database: /nix/store/vvn40k4257a2f6dlps52jnff6qa41ph3-ghc-8.0.1/lib/ghc-8.0.1/package.conf.d/package.cache
loading package database /nix/store/vvn40k4257a2f6dlps52jnff6qa41ph3-ghc-8.0.1/lib/ghc-8.0.1/package.conf.d
wired-in package ghc-prim mapped to ghc-prim-0.5.0.0
wired-in package integer-gmp mapped to integer-gmp-1.0.0.1
wired-in package base mapped to base-4.9.0.0
wired-in package rts mapped to rts
wired-in package template-haskell mapped to template-haskell-2.11.0.0
wired-in package ghc mapped to ghc-8.0.1
wired-in package dph-seq not found.
wired-in package dph-par not found.
Hsc static flags:
loading package database /nix/store/vvn40k4257a2f6dlps52jnff6qa41ph3-ghc-8.0.1/lib/ghc-8.0.1/package.conf.d
wired-in package ghc-prim mapped to ghc-prim-0.5.0.0
wired-in package integer-gmp mapped to integer-gmp-1.0.0.1
wired-in package base mapped to base-4.9.0.0
wired-in package rts mapped to rts-1.0
wired-in package template-haskell mapped to template-haskell-2.11.0.0
wired-in package ghc mapped to ghc-8.0.1
wired-in package dph-seq not found.
wired-in package dph-par not found.
*** Chasing dependencies:
Chasing modules from: *unused-fields.hs
!!! Chasing dependencies: finished in 1.05 milliseconds, allocated 0.777 megabytes
Stable obj: [Main]
Stable BCO: []
Ready for upsweep
  [NONREC
      ModSummary {
         ms_hs_date = 2016-09-22 08:27:24 UTC
         ms_mod = Main,
         ms_textual_imps = [(Nothing, Prelude)]
         ms_srcimps = []
      }]
*** Deleting temp files:
Deleting:
compile: input file unused-fields.hs
*** Checking old interface for Main:
[1 of 1] Compiling Main             ( unused-fields.hs, unused-fields.o ) [flags changed]
*** Parser [Main]:
!!! Parser [Main]: finished in 1.27 milliseconds, allocated 0.517 megabytes
*** Renamer/typechecker [Main]:
!!! Renamer/typechecker [Main]: finished in 128.27 milliseconds, allocated 49.950 megabytes
*** Desugar [Main]:
Result size of Desugar (after optimization)
  = {terms: 141, types: 94, coercions: 0}
*** Core Linted result of Desugar (after optimization):
!!! Desugar [Main]: finished in 5.14 milliseconds, allocated 1.194 megabytes

unused-fields.hs:22:11: warning: [-Wunused-top-binds]
    Defined but not used: ‘_foo’

unused-fields.hs:23:11: warning: [-Wunused-top-binds]
    Defined but not used: ‘_bar’

<no location info>: error:
Failing due to -Werror.
Upsweep partially successful.
*** Deleting temp files:
Deleting:
link(batch): upsweep (partially) failed OR
   Main.main not exported; not linking.
*** Deleting temp files:
Deleting:
*** Deleting temp dirs:
Deleting:
Trac metadata
Trac field Value
Version 8.0.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information