This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [c++] switch ( enum ) vs. default statment.
- From: Ralf Baechle <ralf at linux-mips dot org>
- To: Alexandre Oliva <aoliva at redhat dot com>
- Cc: Manuel López-Ibáñez <lopezibanez at gmail dot com>, PaweÅ Sikora <pluto at agmk dot net>, Mark Mitchell <mark at codesourcery dot com>, gcc at gcc dot gnu dot org
- Date: Tue, 6 Feb 2007 20:00:29 +0000
- Subject: Re: [c++] switch ( enum ) vs. default statment.
- References: <45BDC001.8000801@agmk.net> <6c33472e0701290306j66b7decfxfdc7910570ff3018@mail.gmail.com> <orodo7m8gt.fsf@free.oliva.athome.lsd.ic.unicamp.br>
On Tue, Feb 06, 2007 at 04:44:50PM -0200, Alexandre Oliva wrote:
> > * You can add a return 0 or an exit(1) at the end of the function or
> > in a default label. Since in your case the code is unreachable, the
> > optimiser may remove it or it will never be executed.
>
> But this would generate additional code for no useful purpose.
> See Ralf Baechle's posting with Subject: False ânoreturnâ function
> does return warnings.
>
> /me thinks it would make sense for us to add a __builtin_unreachable()
> that would indicate to GCC that no further action is needed from that
> point on. A command-line flag could then tell whether GCC should
> generate abort() for such cases, or take a more general "undefined
> behavior" approach without generating additional code to that end.
>
> Meanwhile, there's __builtin_trap() already, and Ralf might use that
> even to remove the asm volatile, and PaweÅ could use it in a default:
> label. It's still worse than a __builtin_assume(e == X || e == Y),
> but it's probably much simpler to implement. But then,
> __builtin_unreachable() might very well be implemented as
> __builtin_assume(0).
The Linux/MIPS BUG() macro uses a break 512 instruction while
__builtin_trap() generates a plain break that is break 0 instruction.
Aside of that __builtin_trap() would be fine ...
Ralf