Subject: Re: bug#75964: Switching the Emacs build to -Wswitch-enum in src/

From: Eli Zaretskii <[email-masked]>
Date: Tue, 04 Feb 2025 21:36:35 +0200

> From: Stefan Monnier <[email-masked]>
> Cc: [email-masked],  [email-masked],  [email-masked],
>   [email-masked],  [email-masked]
> Date: Tue, 04 Feb 2025 11:55:12 -0500
> 
> >> Yes, this part of C sucks and I had forgotten about it.
> > What sucks and why?
> 
> That
> 
>     switch ((enum Lisp_Type) 53) {
>     case Lisp_Symbol:
>     case Lisp_Type_Unused0:
>     case Lisp_Int0:
>     case Lisp_Int1:
>     case Lisp_String:
>     case Lisp_Vectorlike:
>     case Lisp_Cons:
>     case Lisp_Float:
>       return 1;
>     }
>     return 2;
> 
> should return 2, because I'd prefer that it aborts and/or that the
> programmer have a way to say explicitly what should happen.  `default:`
> works for that in the case where you have listed *all* the enum's
> values, but then you get stiffed in the case where you add an enum value
> because the compiler won't tell you that you forgot to update this
> `switch` accordingly.

So you want a device that would abort for unexpected values?  Then why
use switch at all?  You want eassert or even a simple if:

  if ((enum foo) foo > max_enum_value)
    emacs_abort ();

Or what am I missing?