#12609 closed bug (fixed)

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

Reported by: jml Owned by: adamgundry
Priority: normal Milestone: 8.0.2
Component: Compiler Version: 8.0.1
Keywords: newcomer, ORF Cc: adamgundry
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: Incorrect warning at compile-time Test Case: overloadedrecflds/should_compile/T12609
Blocked By: Blocking:
Related Tickets: Differential Rev(s): Phab:D2549
Wiki Page:

Description

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:

Change History (8)

comment:1 Changed 14 months ago by mpickering

Keywords: newcomer added

comment:2 Changed 14 months ago by simonpj

Cc: adamgundry added
Keywords: ORF added

Adam, might you look?

comment:3 Changed 14 months ago by adamgundry

Milestone: 8.2.1
Owner: set to adamgundry
Type of failure: None/UnknownIncorrect warning at compile-time

@jml thanks for the report. I'll fix.

comment:4 Changed 14 months ago by adamgundry

Differential Rev(s): Phab:D2549
Status: newpatch
Test Case: overloadedrecflds/should_compile/T12609

comment:5 Changed 14 months ago by Ben Gamari <ben@…>

In 48ff0843/ghc:

Do not warn about unused underscore-prefixed fields (fixes Trac #12609)

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

comment:6 Changed 14 months ago by bgamari

Resolution: fixed
Status: patchclosed

comment:7 Changed 14 months ago by bgamari

Milestone: 8.2.18.0.2
Status: closedmerge

Second thoughts, perhaps we should try merging this.

comment:8 Changed 14 months ago by bgamari

Status: mergeclosed
Note: See TracTickets for help on using tickets.