Re: gcc -Wimplicit-fallthrough and pg_unreachable - Mailing list pgsql-hackers

From Tom Lane
Subject Re: gcc -Wimplicit-fallthrough and pg_unreachable
Date
Msg-id 784601.1606582097@sss.pgh.pa.us
Whole thread Raw
In response to gcc -Wimplicit-fallthrough and pg_unreachable  (Chapman Flack <chap@anastigmatix.net>)
List pgsql-hackers
Chapman Flack <chap@anastigmatix.net> writes:
> I noticed in CI builds of PL/Java with PG 13 that -Wimplicit-fallthrough=3
> in pg_config's CFLAGS was causing some switch case fallthrough warnings
> after an elog(ERROR. [1]

Yeah, I can replicate this here (gcc 8.3.1 on RHEL8).  My recollection
is that we saw this when trialling -Wimplicit-fallthrough, and determined
that the hack used to teach the compiler that elog(ERROR) doesn't return
fails to prevent -Wimplicit-fallthrough warnings even though it does work
for other purposes.  Using this test case:

int
foo(int p)
{
    int x;

    switch (p)
    {
        case 0:
            x = 1;
            break;
        case 1:
            elog(ERROR, "bogus");
            break;
        case 2:
            x = 2;
            break;
        default:
            x = 3;
    }

    return x;
}

I do not get a warning about x being possibly uninitialized (so it
knows elog(ERROR) doesn't return?), but without the "break" after
elog() I do get a fallthrough warning (so it doesn't know that?).

Seems like a minor gcc bug; no idea if anyone's complained to them.
I think we've found other weak spots in -Wimplicit-fallthrough's
coverage though, so it's not one of gcc's best areas.

As illustrated here, I'd just add a "break" rather than
"pg_unreachable()", but that's a matter of taste.

            regards, tom lane



pgsql-hackers by date:

Previous
From: Chapman Flack
Date:
Subject: gcc -Wimplicit-fallthrough and pg_unreachable
Next
From: Andrey Lepikhov
Date:
Subject: Re: Removing unneeded self joins