summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKari Pahula <kaol@iki.fi>2019-09-24 16:33:15 +0300
committerMarge Bot <ben+marge-bot@smart-cactus.org>2019-09-25 13:52:48 -0400
commit2970dc7ab95f7daa793112c6a4a682263561761c (patch)
treebcbc7c565479441427e5e512b6c71d85ce6d497e
parent218c5dbfbd60a416588e1b952c167ebd18ef9c56 (diff)
downloadhaskell-2970dc7ab95f7daa793112c6a4a682263561761c.tar.gz
Add -Wderiving-defaults (#15839)
Enabling both DeriveAnyClass and GeneralizedNewtypeDeriving can cause a warning when no explicit deriving strategy is in use. This change adds an enable/suppress flag for it.
-rw-r--r--compiler/main/DynFlags.hs3
-rw-r--r--compiler/typecheck/TcDeriv.hs3
-rw-r--r--docs/users_guide/8.10.1-notes.rst10
-rw-r--r--docs/users_guide/using-warnings.rst18
-rw-r--r--testsuite/tests/deriving/should_compile/T16179.stderr7
-rw-r--r--testsuite/tests/typecheck/should_compile/T15839a.hs6
-rw-r--r--testsuite/tests/typecheck/should_compile/T15839a.stderr6
-rw-r--r--testsuite/tests/typecheck/should_compile/T15839b.hs8
-rw-r--r--testsuite/tests/typecheck/should_compile/all.T2
9 files changed, 59 insertions, 4 deletions
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index 5bd8cb819f..45a465bd9c 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -920,6 +920,7 @@ data WarningFlag =
| Opt_WarnUnusedPackages -- Since 8.10
| Opt_WarnInferredSafeImports -- Since 8.10
| Opt_WarnMissingSafeHaskellMode -- Since 8.10
+ | Opt_WarnDerivingDefaults
deriving (Eq, Show, Enum)
data Language = Haskell98 | Haskell2010
@@ -4026,6 +4027,7 @@ wWarningFlagsDeps = [
Opt_WarnDeferredOutOfScopeVariables,
flagSpec "deprecations" Opt_WarnWarningsDeprecations,
flagSpec "deprecated-flags" Opt_WarnDeprecatedFlags,
+ flagSpec "deriving-defaults" Opt_WarnDerivingDefaults,
flagSpec "deriving-typeable" Opt_WarnDerivingTypeable,
flagSpec "dodgy-exports" Opt_WarnDodgyExports,
flagSpec "dodgy-foreign-imports" Opt_WarnDodgyForeignImports,
@@ -4824,6 +4826,7 @@ standardWarnings -- see Note [Documenting warning flags]
Opt_WarnPartialTypeSignatures,
Opt_WarnUnrecognisedPragmas,
Opt_WarnDuplicateExports,
+ Opt_WarnDerivingDefaults,
Opt_WarnOverflowedLiterals,
Opt_WarnEmptyEnumerations,
Opt_WarnMissingFields,
diff --git a/compiler/typecheck/TcDeriv.hs b/compiler/typecheck/TcDeriv.hs
index 0b78b8e2ed..d2b32e7d7d 100644
--- a/compiler/typecheck/TcDeriv.hs
+++ b/compiler/typecheck/TcDeriv.hs
@@ -1756,7 +1756,8 @@ mkNewTypeEqn
-- DeriveAnyClass, but emitting a warning about the choice.
-- See Note [Deriving strategies]
when (newtype_deriving && deriveAnyClass) $
- lift $ addWarnTc NoReason $ sep
+ lift $ whenWOptM Opt_WarnDerivingDefaults $
+ addWarnTc (Reason Opt_WarnDerivingDefaults) $ sep
[ text "Both DeriveAnyClass and"
<+> text "GeneralizedNewtypeDeriving are enabled"
, text "Defaulting to the DeriveAnyClass strategy"
diff --git a/docs/users_guide/8.10.1-notes.rst b/docs/users_guide/8.10.1-notes.rst
index 2ca9ce5c08..e8316d7059 100644
--- a/docs/users_guide/8.10.1-notes.rst
+++ b/docs/users_guide/8.10.1-notes.rst
@@ -90,6 +90,16 @@ Language
for a ``newtype``. This was proposed in
`GHC proposal #13 <https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0013-unlifted-newtypes.rst>`__.
+- New flag :ghc-flag:`-Wderiving-defaults` that controls a warning
+ message when both :extension:`DeriveAnyClass` and
+ :extension:`GeneralizedNewtypeDeriving` are enabled and no explicit
+ deriving strategy is in use. The warning is enabled by default and
+ has been present in earlier GHC versions but without the option of
+ disabling it. For example, this code would trigger the warning: ::
+
+ class C a
+ newtype T a = MkT a deriving C
+
Compiler
~~~~~~~~
diff --git a/docs/users_guide/using-warnings.rst b/docs/users_guide/using-warnings.rst
index dda7bb656c..31060d701d 100644
--- a/docs/users_guide/using-warnings.rst
+++ b/docs/users_guide/using-warnings.rst
@@ -26,6 +26,7 @@ generally likely to indicate bugs in your program. These are:
* :ghc-flag:`-Wdeprecated-flags`
* :ghc-flag:`-Wunrecognised-pragmas`
* :ghc-flag:`-Wduplicate-exports`
+ * :ghc-flag:`-Wderiving-defaults`
* :ghc-flag:`-Woverflowed-literals`
* :ghc-flag:`-Wempty-enumerations`
* :ghc-flag:`-Wmissing-fields`
@@ -640,6 +641,23 @@ of ``-W(no-)*``.
Causes a warning to be emitted if an enumeration is empty, e.g.
``[5 .. 3]``.
+.. ghc-flag:: -Wderiving-defaults
+ :shortdesc: warn about default deriving when using both
+ DeriveAnyClass and GeneralizedNewtypeDeriving
+ :type: dynamic
+ :reverse: -Wno-deriving-defaults
+ :category:
+
+ :since: 8.10
+
+ Causes a warning when both :ref:`DeriveAnyClass` and
+ :ref:`GeneralizedNewtypeDeriving` are enabled and no explicit
+ deriving strategy is in use. For example, this would result a
+ warning: ::
+
+ class C a
+ newtype T a = MkT a deriving C
+
.. ghc-flag:: -Wduplicate-constraints
:shortdesc: warn when a constraint appears duplicated in a type signature
:type: dynamic
diff --git a/testsuite/tests/deriving/should_compile/T16179.stderr b/testsuite/tests/deriving/should_compile/T16179.stderr
index c3815d138f..ae40e85a0e 100644
--- a/testsuite/tests/deriving/should_compile/T16179.stderr
+++ b/testsuite/tests/deriving/should_compile/T16179.stderr
@@ -1,5 +1,6 @@
-T16179.hs:7:30: warning:
- Both DeriveAnyClass and GeneralizedNewtypeDeriving are enabled
+
+T16179.hs:7:30: warning: [-Wderiving-defaults (in -Wdefault)]
+ • Both DeriveAnyClass and GeneralizedNewtypeDeriving are enabled
Defaulting to the DeriveAnyClass strategy for instantiating C
Use DerivingStrategies to pick a different strategy
- In the newtype declaration for ‘T’
+ • In the newtype declaration for ‘T’
diff --git a/testsuite/tests/typecheck/should_compile/T15839a.hs b/testsuite/tests/typecheck/should_compile/T15839a.hs
new file mode 100644
index 0000000000..28763aa971
--- /dev/null
+++ b/testsuite/tests/typecheck/should_compile/T15839a.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE DeriveAnyClass, GeneralizedNewtypeDeriving #-}
+
+module T15839a () where
+
+class C a
+newtype T a = MkT a deriving C
diff --git a/testsuite/tests/typecheck/should_compile/T15839a.stderr b/testsuite/tests/typecheck/should_compile/T15839a.stderr
new file mode 100644
index 0000000000..b4aef83367
--- /dev/null
+++ b/testsuite/tests/typecheck/should_compile/T15839a.stderr
@@ -0,0 +1,6 @@
+
+T15839a.hs:6:30: warning: [-Wderiving-defaults (in -Wdefault)]
+ • Both DeriveAnyClass and GeneralizedNewtypeDeriving are enabled
+ Defaulting to the DeriveAnyClass strategy for instantiating C
+ Use DerivingStrategies to pick a different strategy
+ • In the newtype declaration for ‘T’
diff --git a/testsuite/tests/typecheck/should_compile/T15839b.hs b/testsuite/tests/typecheck/should_compile/T15839b.hs
new file mode 100644
index 0000000000..02b9bfbd9b
--- /dev/null
+++ b/testsuite/tests/typecheck/should_compile/T15839b.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE DeriveAnyClass, GeneralizedNewtypeDeriving #-}
+
+{-# OPTIONS_GHC -Wno-deriving-defaults #-}
+
+module T15839a () where
+
+class C a
+newtype T a = MkT a deriving C
diff --git a/testsuite/tests/typecheck/should_compile/all.T b/testsuite/tests/typecheck/should_compile/all.T
index e359f8db6b..30a64518fe 100644
--- a/testsuite/tests/typecheck/should_compile/all.T
+++ b/testsuite/tests/typecheck/should_compile/all.T
@@ -689,3 +689,5 @@ test('T16946', normal, compile, [''])
test('T17007', normal, compile, [''])
test('T17067', normal, compile, [''])
test('T17202', expect_broken(17202), compile, [''])
+test('T15839a', normal, compile, [''])
+test('T15839b', normal, compile, [''])