Home | History | Annotate | Line # | Download | only in lint1
msg_220.c revision 1.10
      1  1.10    rillig /*	$NetBSD: msg_220.c,v 1.10 2025/05/08 20:45:21 rillig Exp $	*/
      2   1.1    rillig # 3 "msg_220.c"
      3   1.1    rillig 
      4   1.1    rillig // Test for message: fallthrough on case statement [220]
      5   1.1    rillig 
      6   1.9    rillig /* lint1-extra-flags: -h -X 351 */
      7   1.2    rillig 
      8   1.2    rillig extern void
      9   1.2    rillig println(const char *);
     10   1.2    rillig 
     11   1.2    rillig void
     12   1.2    rillig example(int n)
     13   1.2    rillig {
     14   1.2    rillig 	switch (n) {
     15   1.2    rillig 	case 1:
     16   1.2    rillig 	case 3:
     17   1.2    rillig 	case 5:
     18   1.2    rillig 		println("odd");
     19   1.8    rillig 		/* expect+1: warning: fallthrough on case statement [220] */
     20   1.8    rillig 	case 2:
     21   1.2    rillig 	case 7:
     22   1.2    rillig 		println("prime");
     23   1.8    rillig 		/* expect+1: warning: fallthrough on default statement [284] */
     24   1.8    rillig 	default:
     25   1.2    rillig 		println("number");
     26   1.2    rillig 	}
     27   1.2    rillig }
     28   1.3  christos 
     29   1.3  christos void
     30   1.3  christos example1(int n)
     31   1.3  christos {
     32   1.3  christos 	switch (n) {
     33   1.3  christos 	case 1:
     34   1.3  christos 	case 3:
     35   1.3  christos 	case 5:
     36   1.3  christos 		println("odd");
     37   1.3  christos 		__attribute__((__fallthrough__));
     38   1.3  christos 	case 2:
     39   1.3  christos 	case 7:
     40   1.3  christos 		println("prime");
     41   1.3  christos 		__attribute__((__fallthrough__));
     42   1.3  christos 	default:
     43   1.3  christos 		println("number");
     44   1.3  christos 	}
     45   1.3  christos }
     46   1.4    rillig 
     47   1.4    rillig /* https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wimplicit-fallthrough */
     48   1.4    rillig void
     49   1.4    rillig annotation_comment_variations(int n)
     50   1.4    rillig {
     51   1.4    rillig 	switch (n) {
     52   1.4    rillig 	case 0:
     53   1.4    rillig 		println("0");
     54   1.4    rillig 		/* FALLTHROUGH */
     55   1.4    rillig 	case 1:
     56   1.4    rillig 		println("1");
     57   1.7    rillig 		/* Seen in libarchive/archive_string.c, macro WRITE_UC. */
     58   1.4    rillig 		/* FALL THROUGH */
     59   1.7    rillig 		/* Lint warned before lex.c 1.79 from 2021-08-29. */
     60   1.4    rillig 	case 2:
     61   1.4    rillig 		println("2");
     62   1.4    rillig 		/* FALLS THROUGH */
     63   1.4    rillig 		/* expect+1: warning: fallthrough on case statement [220] */
     64   1.4    rillig 	case 3:
     65   1.4    rillig 		println("3");
     66   1.4    rillig 		/* intentionally falls through */
     67   1.4    rillig 		/* expect+1: warning: fallthrough on case statement [220] */
     68   1.4    rillig 	case 4:
     69   1.4    rillig 		println("4");
     70   1.7    rillig 		/* This is the Splint variant, which is seldom used. */
     71   1.4    rillig 		/* @fallthrough@ */
     72   1.4    rillig 		/* expect+1: warning: fallthrough on case statement [220] */
     73   1.4    rillig 	case 5:
     74   1.4    rillig 		println("5");
     75   1.7    rillig 		/* Seen in unbound/lookup3.c, function hashlittle. */
     76   1.7    rillig 		/* Lint warned before lex.c 1.80 from 2021-08-29. */
     77   1.6    rillig 		/* fallthrough */
     78   1.6    rillig 	case 6:
     79   1.6    rillig 		println("6");
     80   1.4    rillig 	}
     81   1.4    rillig }
     82  1.10    rillig 
     83  1.10    rillig 
     84  1.10    rillig void do_return(void);
     85  1.10    rillig void noreturn(void)
     86  1.10    rillig     __attribute__((__noreturn__));
     87  1.10    rillig void noreturn_attr_comma(void)
     88  1.10    rillig     __attribute__((__unused__, __noreturn__));
     89  1.10    rillig void noreturn_attr_attr(void)
     90  1.10    rillig     __attribute__((__unused__))
     91  1.10    rillig     __attribute__((__noreturn__));
     92  1.10    rillig 
     93  1.10    rillig void
     94  1.10    rillig call_noreturn(void)
     95  1.10    rillig {
     96  1.10    rillig 	switch (0) {
     97  1.10    rillig 	case 0:
     98  1.10    rillig 		do_return();
     99  1.10    rillig 		/* expect+1: warning: fallthrough on case statement [220] */
    100  1.10    rillig 	case 1:
    101  1.10    rillig 		noreturn();
    102  1.10    rillig 	case 2:
    103  1.10    rillig 		noreturn_attr_comma();
    104  1.10    rillig 		// FIXME
    105  1.10    rillig 		/* expect+1: warning: fallthrough on case statement [220] */
    106  1.10    rillig 	case 3:
    107  1.10    rillig 		noreturn_attr_attr();
    108  1.10    rillig 		// FIXME
    109  1.10    rillig 		/* expect+1: warning: fallthrough on case statement [220] */
    110  1.10    rillig 	case 4:
    111  1.10    rillig 		return;
    112  1.10    rillig 	}
    113  1.10    rillig }
    114