Warn about missing instance methods that start with an underscore
authorRyan Scott <ryan.gl.scott@gmail.com>
Thu, 15 Dec 2016 16:17:49 +0000 (11:17 -0500)
committerBen Gamari <ben@smart-cactus.org>
Thu, 15 Dec 2016 18:07:14 +0000 (13:07 -0500)
Previously, GHC would not warn whenever there was a class instance that
didn't implement a class method whose name begins with an underscore.

Fixes #12959.

Test Plan: make test TEST=WarnMinimal

Reviewers: austin, bgamari, simonpj

Reviewed By: bgamari, simonpj

Subscribers: thomie

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

GHC Trac Issues: #12959

compiler/typecheck/TcClassDcl.hs
docs/users_guide/8.2.1-notes.rst
testsuite/tests/warnings/minimal/WarnMinimal.hs
testsuite/tests/warnings/minimal/WarnMinimal.stderr

index 162e91a..c5a4c3a 100644 (file)
@@ -293,12 +293,10 @@ tcClassMinimalDef _clas sigs op_info
                    (\bf -> addWarnTc NoReason (warningMinimalDefIncomplete bf))
         return mindef
   where
-    -- By default require all methods without a default
-    -- implementation whose names don't start with '_'
+    -- By default require all methods without a default implementation
     defMindef :: ClassMinimalDef
     defMindef = mkAnd [ noLoc (mkVar name)
-                      | (name, _, Nothing) <- op_info
-                      , not (startsWithUnderscore (getOccName name)) ]
+                      | (name, _, Nothing) <- op_info ]
 
 instantiateMethod :: Class -> Id -> [TcType] -> TcType
 -- Take a class operation, say
index 2e9033c..3011a29 100644 (file)
@@ -100,6 +100,18 @@ Compiler
 - The Mingw-w64 toolchain for the Windows version of GHC has been updated. GHC now uses
   `GCC 6.2.0` and `binutils 2.27`.
 
+- Previously, :ghc-flag:`-Wmissing-methods` would not warn whenever a type
+  class method beginning with an underscore was not implemented in an instance.
+  For instance, this code would compile without any warnings: ::
+
+     class Foo a where
+       _Bar :: a -> Int
+
+     instance Foo Int
+
+  :ghc-flag:`-Wmissing-methods` will now warn that ``_Bar`` is not implemented
+  in the ``Foo Int`` instance.
+
 GHCi
 ~~~~
 
index d369065..d6c9b7b 100644 (file)
@@ -87,7 +87,7 @@ class Cheater a where  -- WARNING LINE
 
 class Cheater2 a where
   _cheater2 :: a
-  {-# MINIMAL #-} -- no warning
+  {-# MINIMAL #-} -- warning!
 
 class Cheater3 a where  -- WARNING LINE
   cheater3, cheater3b :: a
@@ -100,7 +100,7 @@ instance Num Bool where  -- WARNING LINE
 
 class NoExplicit a where
   needed :: a
-  _optional :: a
+  _alsoNeeded :: a
 
 instance NoExplicit Int where  -- WARNING LINE
 
index d907a6c..4323a91 100644 (file)
@@ -30,6 +30,12 @@ WarnMinimal.hs:84:1: warning:
       but there is no default implementation.
     • In the class declaration for ‘Cheater’
 
+WarnMinimal.hs:88:1: warning:
+    • The MINIMAL pragma does not require:
+        ‘_cheater2’
+      but there is no default implementation.
+    • In the class declaration for ‘Cheater2’
+
 WarnMinimal.hs:92:1: warning:
     • The MINIMAL pragma does not require:
         ‘cheater3b’
@@ -45,7 +51,7 @@ WarnMinimal.hs:99:10: warning: [-Wmissing-methods (in -Wdefault)]
 
 WarnMinimal.hs:105:10: warning: [-Wmissing-methods (in -Wdefault)]
     • No explicit implementation for
-        ‘needed’
+        ‘needed’ and ‘_alsoNeeded’
     • In the instance declaration for ‘NoExplicit Int’
 
 WarnMinimal.hs:116:10: warning: [-Wmissing-methods (in -Wdefault)]