https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103597

--- Comment #8 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Marek Polacek <mpola...@gcc.gnu.org>:

https://gcc.gnu.org/g:d886a5248e66ab911391af18bf955beb87ee8461

commit r12-7899-gd886a5248e66ab911391af18bf955beb87ee8461
Author: Marek Polacek <pola...@redhat.com>
Date:   Mon Mar 28 18:19:20 2022 -0400

    gimple: Wrong -Wimplicit-fallthrough with if(1) [PR103597]

    This patch fixes a wrong -Wimplicit-fallthrough warning for

        case 0:
          if (1)  // wrong may fallthrough
            return 0;
        case 1:

    which in .gimple looks like

        <D.1981>: // case 0
        if (1 != 0) goto <D.1985>; else goto <D.1986>;
        <D.1985>:
        D.1987 = 0;
        // predicted unlikely by early return (on trees) predictor.
        return D.1987;
        <D.1986>:  // dead
        <D.1982>: // case 1

    and the warning thinks that <D.1986>: falls through to <D.1982>:.  It
    does not know that <D.1986> is effectively a dead label, only reachable
    through fallthrough from previous instructions, never jumped to.  To
    that effect, Jakub introduced UNUSED_LABEL_P, which is set on such dead
    labels.

    collect_fallthrough_labels has code to deal with cases like

        case 2:
          if (e != 10)
            i++; // this may fallthru, warn
          else
            return 44;
        case 3:

    which collects labels that may fall through.  Here it sees the "goto
<D.1990>;"
    at the end of the then branch and so when the warning reaches

        ...
        <D.1990>: // from if-then
        <D.1984>: // case 3

    it knows it should warn about the possible fallthrough.  But an
UNUSED_LABEL_P
    is not a label that can fallthrough like that, so it should ignore those.

    However, we still want to warn about this:

        case 0:
          if (1)
            n++; // falls through
        case 1:

    so collect_fallthrough_labels needs to return the "n = n + 1;" statement,
rather
    than the dead label.

    Co-authored-by: Jakub Jelinek <ja...@redhat.com>

            PR middle-end/103597

    gcc/ChangeLog:

            * gimplify.cc (collect_fallthrough_labels): Don't push
UNUSED_LABEL_Ps
            into labels.  Maybe set prev to the statement preceding
UNUSED_LABEL_P.
            (gimplify_cond_expr): Set UNUSED_LABEL_P.
            * tree.h (UNUSED_LABEL_P): New.

    gcc/testsuite/ChangeLog:

            * c-c++-common/Wimplicit-fallthrough-39.c: New test.

Reply via email to