root/tests/usr.bin/xlint/lint1/msg_220.c
/*      $NetBSD: msg_220.c,v 1.11 2025/05/08 20:51:41 rillig Exp $      */
# 3 "msg_220.c"

// Test for message: fallthrough on case statement [220]

/* lint1-extra-flags: -h -X 351 */

extern void
println(const char *);

void
example(int n)
{
        switch (n) {
        case 1:
        case 3:
        case 5:
                println("odd");
                /* expect+1: warning: fallthrough on case statement [220] */
        case 2:
        case 7:
                println("prime");
                /* expect+1: warning: fallthrough on default statement [284] */
        default:
                println("number");
        }
}

void
example1(int n)
{
        switch (n) {
        case 1:
        case 3:
        case 5:
                println("odd");
                __attribute__((__fallthrough__));
        case 2:
        case 7:
                println("prime");
                __attribute__((__fallthrough__));
        default:
                println("number");
        }
}

/* https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wimplicit-fallthrough */
void
annotation_comment_variations(int n)
{
        switch (n) {
        case 0:
                println("0");
                /* FALLTHROUGH */
        case 1:
                println("1");
                /* Seen in libarchive/archive_string.c, macro WRITE_UC. */
                /* FALL THROUGH */
                /* Lint warned before lex.c 1.79 from 2021-08-29. */
        case 2:
                println("2");
                /* FALLS THROUGH */
                /* expect+1: warning: fallthrough on case statement [220] */
        case 3:
                println("3");
                /* intentionally falls through */
                /* expect+1: warning: fallthrough on case statement [220] */
        case 4:
                println("4");
                /* This is the Splint variant, which is seldom used. */
                /* @fallthrough@ */
                /* expect+1: warning: fallthrough on case statement [220] */
        case 5:
                println("5");
                /* Seen in unbound/lookup3.c, function hashlittle. */
                /* Lint warned before lex.c 1.80 from 2021-08-29. */
                /* fallthrough */
        case 6:
                println("6");
        }
}


void do_return(void);
void noreturn(void)
    __attribute__((__noreturn__));
void noreturn_attr_comma(void)
    __attribute__((__unused__, __noreturn__));
void noreturn_attr_attr(void)
    __attribute__((__unused__))
    __attribute__((__noreturn__));

void
call_noreturn(void)
{
        switch (0) {
        case 0:
                do_return();
                /* expect+1: warning: fallthrough on case statement [220] */
        case 1:
                noreturn();
        case 2:
                noreturn_attr_comma();
        case 3:
                noreturn_attr_attr();
        case 4:
                return;
        }
}