[ghc-steering-committee] #571: -Wsevere, Shepherd: Adam (rec: accept)

Adam Gundry adam at well-typed.com
Wed Sep 20 07:25:21 UTC 2023


I agree with Joachim's position here.

Having a -Wsevere group at all would be a good start, but the problem 
with stopping at "best-practice guidance" rather than changing the 
defaults is that it benefits only those who learn about and follow the 
guidance. So it remains a footgun for newcomers.

Regarding migration, given that GHC has issued these warnings by default 
for some time, I don't think we need be too shy about upgrading their 
severity. We could have -Wcompat imply -Werror=severe, but that 
complicates the semantics of warning groups, and will help only those 
who use -Wcompat but don't fix warnings that occur with -Wdefault.

I suppose as Moritz suggests we could introduce and advertise -Wsevere 
in 9.10, and mention in the warning message that this will be an error 
in the future, but only enable -Werror=severe in 9.14 (or 9.12?), so 
9.10 would give something like:

M.hs:8:10: warning: [-Wmissing-methods]
     • No explicit implementation for
         ‘<>’
     • In the instance declaration for ‘Semigroup T’
     • Warning: this may lead to an infinite loop or runtime exception.
     • This will become an error by default in a future GHC release;
       use -Werror=severe to make severe warnings into errors now.

Then in a future release:

M.hs:8:10: error: [-Wmissing-methods, -Werror=missing-methods]
     • No explicit implementation for
         ‘<>’
     • In the instance declaration for ‘Semigroup T’
     • Warning: this may lead to an infinite loop or runtime exception.
     • Use -Wwarn=missing-methods to permit this anyway.

Would that be a reasonable compromise?

Adam


On 19/09/2023 22:13, Joachim Breitner wrote:
> Hi,
> 
> Am Dienstag, dem 19.09.2023 um 15:26 +0100 schrieb Simon Peyton Jones:
>> Maybe implementing this "severe" category, but not changing its
>> default to error, would get us some of the way there?  Then "best-
>> practice guidance" could be "use -Werror=severe", and job done.
>> That's a bit easier to say than saying "use -Werrror=missing-methods
>> -Werror= ..." etc.
> 
> anyone using `-Werror` would already get this behavior. So what is the
> useful for using `-Werror=severe` instead? Presumably the rationale is:
> 
>   -Werror, while great _during_ development or in leaf packages, is not
>   is not good idea in _released_ code, i.e. code that is compiled by
>   others, as that code needs to keep working even as compilers and
>   dependencies change, such as libraries on hackage, or executables
>   built by distro packagers.
>   That’s why -Werror is frowned upon there.
> 
>   But some changes in upstream packages _ought_ to cause compilation to
>   fail, because they really need downstream code changes. These will
>   cause severe warnings, and therefore -Werror=severe is desirable
>   even for released code.
> 
> Is that a good way of phrasing your thoughts there?
> 
> It looks reasonable to me; if we think of deferable type error as
> severe warnings, it totally fits this description: It would be
> _possible_ to keep compiling the downstream code, but it would not be
> desirable. That's why compilation fails, and that’s why we don’t defer
> type errors by default.
> 
> But if -Werror=severe is desirable generally, it would be unfortunate
> if we cannot make it the default. If not right away, then maybe with a
> suitable migration strategy? (Although I wonder if there are many users
> out there that pay attention to deprecation warnings, e.g. watch
> -Wdeprecation, that would not have already fixed -Wdefault warnings
> about missing fields/methods already…)
> 
> 
> Cheers,
> Joachim

-- 
Adam Gundry, Haskell Consultant
Well-Typed LLP, https://www.well-typed.com/

Registered in England & Wales, OC335890
27 Old Gloucester Street, London WC1N 3AX, England



More information about the ghc-steering-committee mailing list