Home | History | Annotate | Line # | Download | only in lint1
      1  1.22  rillig /*	$NetBSD: msg_193.c,v 1.22 2024/11/13 04:32:49 rillig Exp $	*/
      2   1.1  rillig # 3 "msg_193.c"
      3   1.1  rillig 
      4  1.22  rillig // Test for message: '%s' statement not reached [193]
      5   1.1  rillig 
      6  1.21  rillig /* lint1-extra-flags: -X 351 */
      7  1.21  rillig 
      8   1.3  rillig /*
      9   1.3  rillig  * Test the reachability of statements in a function.
     10   1.3  rillig  *
     11   1.3  rillig  *	if
     12   1.3  rillig  *	if-else
     13   1.3  rillig  *	if-else-if-else
     14   1.3  rillig  *	for
     15   1.3  rillig  *	while
     16   1.3  rillig  *	do-while
     17   1.3  rillig  *	switch
     18   1.3  rillig  *	break
     19   1.3  rillig  *	continue
     20   1.3  rillig  *	goto
     21   1.3  rillig  *	return
     22   1.3  rillig  *
     23   1.3  rillig  *	constant expression
     24   1.3  rillig  *	system-dependent constant expression
     25   1.3  rillig  */
     26   1.3  rillig 
     27  1.10  rillig extern void reachable(void);
     28  1.10  rillig extern void unreachable(void);
     29  1.10  rillig extern _Bool maybe(void);
     30  1.10  rillig 
     31   1.3  rillig 
     32   1.3  rillig void
     33   1.3  rillig test_statement(void)
     34   1.3  rillig {
     35   1.3  rillig 	reachable();
     36   1.3  rillig 	reachable();
     37   1.3  rillig }
     38   1.3  rillig 
     39   1.3  rillig void
     40   1.3  rillig test_compound_statement(void)
     41   1.3  rillig {
     42   1.3  rillig 	reachable();
     43   1.3  rillig 	{
     44   1.3  rillig 		reachable();
     45   1.3  rillig 		reachable();
     46   1.3  rillig 	}
     47   1.3  rillig 	reachable();
     48   1.3  rillig }
     49   1.3  rillig 
     50   1.3  rillig void
     51   1.3  rillig test_if_statement(void)
     52   1.3  rillig {
     53   1.3  rillig 	if (1)
     54   1.3  rillig 		reachable();
     55   1.3  rillig 	reachable();
     56   1.3  rillig 	if (0)
     57  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
     58   1.3  rillig 	reachable();
     59   1.3  rillig }
     60   1.3  rillig 
     61   1.3  rillig void
     62   1.3  rillig test_if_compound_statement(void)
     63   1.3  rillig {
     64   1.3  rillig 	if (1) {
     65   1.3  rillig 		reachable();
     66   1.3  rillig 	}
     67   1.3  rillig 	if (1) {
     68   1.3  rillig 		{
     69   1.3  rillig 			{
     70   1.3  rillig 				reachable();
     71   1.3  rillig 			}
     72   1.3  rillig 		}
     73   1.3  rillig 	}
     74   1.3  rillig 
     75   1.3  rillig 	if (0) {
     76  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
     77   1.3  rillig 	}
     78   1.3  rillig 	if (0) {
     79   1.3  rillig 		{
     80   1.3  rillig 			{
     81  1.19  rillig 				unreachable();	/* expect+0: ... [193] */
     82   1.3  rillig 			}
     83   1.3  rillig 		}
     84   1.3  rillig 	}
     85   1.3  rillig }
     86   1.3  rillig 
     87   1.3  rillig void
     88   1.3  rillig test_if_without_else(void)
     89   1.3  rillig {
     90   1.3  rillig 	if (1)
     91   1.3  rillig 		reachable();
     92   1.3  rillig 	reachable();
     93   1.3  rillig 
     94   1.3  rillig 	if (0)
     95  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
     96   1.3  rillig 	reachable();
     97   1.3  rillig }
     98   1.3  rillig 
     99   1.3  rillig void
    100   1.3  rillig test_if_with_else(void)
    101   1.3  rillig {
    102   1.3  rillig 	if (1)
    103   1.3  rillig 		reachable();
    104   1.3  rillig 	else
    105  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    106   1.3  rillig 	reachable();
    107   1.3  rillig 
    108   1.3  rillig 	if (0)
    109  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    110   1.3  rillig 	else
    111   1.3  rillig 		reachable();
    112   1.3  rillig 	reachable();
    113   1.3  rillig }
    114   1.3  rillig 
    115   1.3  rillig void
    116   1.3  rillig test_if_else_if_else(void)
    117   1.3  rillig {
    118   1.3  rillig 	if (1)
    119   1.3  rillig 		reachable();
    120  1.19  rillig 	else if (1)			/* expect+0: ... [193] */
    121   1.4  rillig 		unreachable();
    122   1.3  rillig 	else
    123  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    124   1.3  rillig 
    125   1.3  rillig 	if (0)
    126  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    127   1.3  rillig 	else if (1)
    128   1.3  rillig 		reachable();
    129   1.3  rillig 	else
    130  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    131   1.3  rillig 
    132   1.3  rillig 	if (0)
    133  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    134   1.3  rillig 	else if (0)
    135  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    136   1.3  rillig 	else
    137   1.3  rillig 		reachable();
    138   1.3  rillig }
    139   1.3  rillig 
    140   1.3  rillig void
    141   1.3  rillig test_if_return(void)
    142   1.3  rillig {
    143   1.3  rillig 	if (1)
    144   1.3  rillig 		return;
    145  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    146   1.3  rillig }
    147   1.3  rillig 
    148   1.3  rillig void
    149   1.3  rillig test_if_else_return(void)
    150   1.3  rillig {
    151   1.3  rillig 	if (1)
    152   1.3  rillig 		reachable();
    153   1.3  rillig 	else
    154  1.19  rillig 		return;			/* expect+0: ... [193] */
    155   1.3  rillig 	reachable();
    156   1.3  rillig }
    157   1.3  rillig 
    158   1.3  rillig void
    159   1.3  rillig test_for_forever(void)
    160   1.3  rillig {
    161   1.3  rillig 	for (;;)
    162   1.3  rillig 		reachable();
    163  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    164   1.3  rillig }
    165   1.3  rillig 
    166   1.3  rillig void
    167   1.3  rillig test_for_true(void)
    168   1.3  rillig {
    169   1.3  rillig 	for (; 1;)
    170   1.3  rillig 		reachable();
    171  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    172   1.3  rillig }
    173   1.3  rillig 
    174   1.3  rillig void
    175   1.3  rillig test_for_false(void)
    176   1.3  rillig {
    177   1.3  rillig 	for (; 0;)
    178  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    179   1.3  rillig 	reachable();
    180   1.3  rillig }
    181   1.3  rillig 
    182   1.3  rillig void
    183   1.3  rillig test_for_break(void)
    184   1.3  rillig {
    185   1.3  rillig 	for (;;) {
    186   1.3  rillig 		reachable();
    187   1.3  rillig 		break;
    188  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    189   1.3  rillig 	}
    190   1.3  rillig 	reachable();
    191   1.3  rillig }
    192   1.3  rillig 
    193   1.3  rillig void
    194   1.3  rillig test_for_if_break(void)
    195   1.3  rillig {
    196   1.3  rillig 	for (;;) {
    197   1.3  rillig 		reachable();
    198   1.3  rillig 		if (0) {
    199  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    200   1.3  rillig 			break;
    201  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    202   1.3  rillig 		}
    203   1.3  rillig 		if (1) {
    204   1.3  rillig 			reachable();
    205   1.3  rillig 			break;
    206  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    207   1.3  rillig 		}
    208  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    209   1.3  rillig 	}
    210   1.3  rillig 	reachable();
    211   1.3  rillig }
    212   1.3  rillig 
    213   1.3  rillig void
    214   1.3  rillig test_for_continue(void)
    215   1.3  rillig {
    216   1.3  rillig 	for (;;) {
    217   1.3  rillig 		reachable();
    218   1.3  rillig 		continue;
    219  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    220   1.3  rillig 	}
    221  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    222   1.3  rillig }
    223   1.3  rillig 
    224   1.3  rillig void
    225   1.3  rillig test_for_if_continue(void)
    226   1.3  rillig {
    227   1.3  rillig 	for (;;) {
    228   1.3  rillig 		reachable();
    229   1.3  rillig 		if (0) {
    230  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    231   1.3  rillig 			continue;
    232  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    233   1.3  rillig 		}
    234   1.3  rillig 		if (1) {
    235   1.3  rillig 			reachable();
    236   1.3  rillig 			continue;
    237  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    238   1.3  rillig 		}
    239  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    240   1.3  rillig 	}
    241  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    242   1.3  rillig }
    243   1.3  rillig 
    244   1.3  rillig void
    245   1.3  rillig test_for_return(void)
    246   1.2  rillig {
    247   1.3  rillig 	for (;;) {
    248   1.3  rillig 		reachable();
    249   1.3  rillig 		return;
    250  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    251   1.3  rillig 	}
    252  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    253   1.2  rillig }
    254   1.3  rillig 
    255   1.3  rillig void
    256   1.3  rillig test_for_if_return(void)
    257   1.3  rillig {
    258   1.3  rillig 	for (;;) {
    259   1.3  rillig 		reachable();
    260   1.3  rillig 		if (0) {
    261  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    262   1.3  rillig 			return;
    263  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    264   1.3  rillig 		}
    265   1.3  rillig 		if (1) {
    266   1.3  rillig 			reachable();
    267   1.3  rillig 			return;
    268  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    269   1.3  rillig 		}
    270  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    271   1.3  rillig 	}
    272  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    273   1.3  rillig }
    274   1.3  rillig 
    275   1.3  rillig void
    276   1.3  rillig test_while_true(void)
    277   1.3  rillig {
    278   1.3  rillig 	while (1)
    279   1.3  rillig 		reachable();
    280  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    281   1.3  rillig }
    282   1.3  rillig 
    283   1.3  rillig void
    284   1.3  rillig test_while_false(void)
    285   1.3  rillig {
    286   1.3  rillig 	while (0)
    287  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    288   1.3  rillig 	reachable();
    289   1.3  rillig }
    290   1.3  rillig 
    291   1.3  rillig void
    292   1.3  rillig test_while_break(void)
    293   1.3  rillig {
    294   1.3  rillig 	while (1) {
    295   1.3  rillig 		reachable();
    296   1.3  rillig 		break;
    297  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    298   1.3  rillig 	}
    299   1.3  rillig 	reachable();
    300   1.3  rillig }
    301   1.3  rillig 
    302   1.3  rillig void
    303   1.3  rillig test_while_if_break(void)
    304   1.3  rillig {
    305   1.3  rillig 	while (1) {
    306   1.3  rillig 		reachable();
    307   1.3  rillig 		if (0) {
    308  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    309   1.3  rillig 			break;
    310  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    311   1.3  rillig 		}
    312   1.3  rillig 		if (1) {
    313   1.3  rillig 			reachable();
    314   1.3  rillig 			break;
    315  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    316   1.3  rillig 		}
    317  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    318   1.3  rillig 	}
    319   1.3  rillig 	reachable();
    320   1.3  rillig }
    321   1.3  rillig 
    322   1.3  rillig void
    323   1.3  rillig test_while_continue(void)
    324   1.3  rillig {
    325   1.3  rillig 	while (1) {
    326   1.3  rillig 		reachable();
    327   1.3  rillig 		continue;
    328  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    329   1.3  rillig 	}
    330  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    331   1.3  rillig }
    332   1.3  rillig 
    333   1.3  rillig void
    334   1.3  rillig test_while_if_continue(void)
    335   1.3  rillig {
    336   1.3  rillig 	while (1) {
    337   1.3  rillig 		reachable();
    338   1.3  rillig 		if (0) {
    339  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    340   1.3  rillig 			continue;
    341  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    342   1.3  rillig 		}
    343   1.3  rillig 		if (1) {
    344   1.3  rillig 			reachable();
    345   1.3  rillig 			continue;
    346  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    347   1.3  rillig 		}
    348  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    349   1.3  rillig 	}
    350  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    351   1.3  rillig }
    352   1.3  rillig 
    353   1.3  rillig void
    354   1.3  rillig test_while_return(void)
    355   1.3  rillig {
    356   1.3  rillig 	while (1) {
    357   1.3  rillig 		reachable();
    358   1.3  rillig 		return;
    359  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    360   1.3  rillig 	}
    361  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    362   1.3  rillig }
    363   1.3  rillig 
    364   1.3  rillig void
    365   1.3  rillig test_while_if_return(void)
    366   1.3  rillig {
    367   1.3  rillig 	while (1) {
    368   1.3  rillig 		reachable();
    369   1.3  rillig 		if (0) {
    370  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    371   1.3  rillig 			return;
    372  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    373   1.3  rillig 		}
    374   1.3  rillig 		if (1) {
    375   1.3  rillig 			reachable();
    376   1.3  rillig 			return;
    377  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    378   1.3  rillig 		}
    379  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    380   1.3  rillig 	}
    381  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    382   1.3  rillig }
    383   1.3  rillig 
    384   1.3  rillig void
    385   1.3  rillig test_do_while_true(void)
    386   1.3  rillig {
    387   1.3  rillig 	do {
    388   1.3  rillig 		reachable();
    389   1.3  rillig 	} while (1);
    390  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    391   1.3  rillig }
    392   1.3  rillig 
    393   1.3  rillig void
    394   1.3  rillig test_do_while_false(void)
    395   1.3  rillig {
    396   1.3  rillig 	do {
    397   1.3  rillig 		reachable();
    398   1.3  rillig 	} while (0);
    399   1.3  rillig 	reachable();
    400   1.3  rillig }
    401   1.3  rillig 
    402   1.3  rillig void
    403   1.3  rillig test_do_while_break(void)
    404   1.3  rillig {
    405   1.3  rillig 	do {
    406   1.3  rillig 		reachable();
    407   1.3  rillig 		break;
    408  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    409   1.3  rillig 	} while (1);
    410   1.3  rillig 	reachable();
    411   1.3  rillig }
    412   1.3  rillig 
    413   1.3  rillig void
    414   1.3  rillig test_do_while_if_break(void)
    415   1.3  rillig {
    416   1.3  rillig 	do {
    417   1.3  rillig 		reachable();
    418   1.3  rillig 		if (0) {
    419  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    420   1.3  rillig 			break;
    421  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    422   1.3  rillig 		}
    423   1.3  rillig 		if (1) {
    424   1.3  rillig 			reachable();
    425   1.3  rillig 			break;
    426  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    427   1.3  rillig 		}
    428  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    429   1.3  rillig 	} while (1);
    430   1.3  rillig 	reachable();
    431   1.3  rillig }
    432   1.3  rillig 
    433   1.3  rillig void
    434   1.3  rillig test_do_while_continue(void)
    435   1.3  rillig {
    436   1.3  rillig 	do {
    437   1.3  rillig 		reachable();
    438   1.3  rillig 		continue;
    439  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    440   1.3  rillig 	} while (1);
    441  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    442   1.3  rillig }
    443   1.3  rillig 
    444   1.3  rillig void
    445   1.3  rillig test_do_while_if_continue(void)
    446   1.3  rillig {
    447   1.3  rillig 	do {
    448   1.3  rillig 		reachable();
    449   1.3  rillig 		if (0) {
    450  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    451   1.3  rillig 			continue;
    452  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    453   1.3  rillig 		}
    454   1.3  rillig 		if (1) {
    455   1.3  rillig 			reachable();
    456   1.3  rillig 			continue;
    457  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    458   1.3  rillig 		}
    459  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    460   1.3  rillig 	} while (1);
    461  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    462   1.3  rillig }
    463   1.3  rillig 
    464   1.3  rillig void
    465   1.3  rillig test_do_while_return(void)
    466   1.3  rillig {
    467   1.3  rillig 	do {
    468   1.3  rillig 		reachable();
    469   1.3  rillig 		return;
    470  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    471   1.3  rillig 	} while (1);
    472  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    473   1.3  rillig }
    474   1.3  rillig 
    475   1.3  rillig void
    476   1.3  rillig test_do_while_if_return(void)
    477   1.3  rillig {
    478   1.3  rillig 	do {
    479   1.3  rillig 		reachable();
    480   1.3  rillig 		if (0) {
    481  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    482   1.3  rillig 			return;
    483  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    484   1.3  rillig 		}
    485   1.3  rillig 		if (1) {
    486   1.3  rillig 			reachable();
    487   1.3  rillig 			return;
    488  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    489   1.3  rillig 		}
    490  1.19  rillig 		unreachable();		/* expect+0: ... [193] */
    491   1.3  rillig 	} while (1);
    492  1.19  rillig 	unreachable();			/* expect+0: ... [193] */
    493   1.3  rillig }
    494   1.3  rillig 
    495   1.9  rillig void
    496   1.9  rillig test_if_nested(void)
    497   1.9  rillig {
    498   1.9  rillig 	if (0) {
    499  1.19  rillig 		if (1)			/* expect+0: ... [193] */
    500   1.9  rillig 			unreachable();
    501   1.9  rillig 		else
    502  1.19  rillig 			unreachable();	/* expect+0: ... [193] *//* XXX: redundant */
    503   1.9  rillig 
    504   1.9  rillig 		if (0)
    505  1.19  rillig 			unreachable();	/* expect+0: ... [193] *//* XXX: redundant */
    506   1.9  rillig 		else
    507   1.9  rillig 			unreachable();
    508   1.9  rillig 
    509   1.9  rillig 		unreachable();
    510   1.9  rillig 	}
    511   1.9  rillig 	reachable();
    512   1.9  rillig 
    513   1.9  rillig 	if (1) {
    514   1.9  rillig 		if (1)
    515   1.9  rillig 			reachable();
    516   1.9  rillig 		else
    517  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    518   1.9  rillig 
    519   1.9  rillig 		if (0)
    520  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    521   1.9  rillig 		else
    522   1.9  rillig 			reachable();
    523   1.9  rillig 
    524   1.9  rillig 		reachable();
    525   1.9  rillig 	}
    526   1.9  rillig 	reachable();
    527   1.9  rillig }
    528   1.9  rillig 
    529  1.10  rillig void
    530  1.10  rillig test_if_maybe(void)
    531  1.10  rillig {
    532  1.10  rillig 	if (maybe()) {
    533  1.10  rillig 		if (0)
    534  1.19  rillig 			unreachable();	/* expect+0: ... [193] */
    535  1.10  rillig 		else
    536  1.10  rillig 			reachable();
    537  1.10  rillig 		reachable();
    538  1.10  rillig 	}
    539  1.10  rillig 	reachable();
    540  1.10  rillig 
    541  1.10  rillig 	if (0) {
    542  1.19  rillig 		if (maybe())		/* expect+0: ... [193] */
    543  1.10  rillig 			unreachable();
    544  1.10  rillig 		else
    545  1.10  rillig 			unreachable();
    546  1.10  rillig 		unreachable();
    547  1.10  rillig 	}
    548  1.10  rillig 	reachable();
    549  1.10  rillig 
    550  1.10  rillig 	if (1) {
    551  1.10  rillig 		if (maybe())
    552  1.10  rillig 			reachable();
    553  1.10  rillig 		else
    554  1.10  rillig 			reachable();
    555  1.10  rillig 		reachable();
    556  1.10  rillig 	}
    557  1.10  rillig 	reachable();
    558  1.10  rillig }
    559  1.10  rillig 
    560  1.11  rillig /*
    561  1.11  rillig  * To compute the reachability graph of this little monster, lint would have
    562  1.11  rillig  * to keep all statements and their relations from the whole function in
    563  1.11  rillig  * memory.  It doesn't do that.  Therefore it does not warn about any
    564  1.11  rillig  * unreachable statements in this function.
    565  1.11  rillig  */
    566  1.11  rillig void
    567  1.11  rillig test_goto_numbers_alphabetically(void)
    568  1.11  rillig {
    569  1.11  rillig 	goto one;
    570  1.11  rillig eight:
    571  1.11  rillig 	goto nine;
    572  1.11  rillig five:
    573  1.11  rillig 	return;
    574  1.11  rillig four:
    575  1.11  rillig 	goto five;
    576  1.11  rillig nine:
    577  1.11  rillig 	goto ten;
    578  1.11  rillig one:
    579  1.11  rillig 	goto two;
    580  1.11  rillig seven:
    581  1.11  rillig 	goto eight;
    582  1.18  rillig six:
    583  1.18  rillig 	/* expect-1: warning: label 'six' unused in function 'test_goto_numbers_alphabetically' [232] */
    584  1.11  rillig 	goto seven;
    585  1.11  rillig ten:
    586  1.11  rillig 	return;
    587  1.11  rillig three:
    588  1.11  rillig 	goto four;
    589  1.11  rillig two:
    590  1.11  rillig 	goto three;
    591  1.11  rillig }
    592  1.11  rillig 
    593  1.11  rillig void
    594  1.11  rillig test_while_goto(void)
    595  1.11  rillig {
    596  1.11  rillig 	while (1) {
    597  1.11  rillig 		goto out;
    598  1.11  rillig 		break;		/* lint only warns with the -b option */
    599  1.11  rillig 	}
    600  1.19  rillig 	unreachable();		/* expect+0: ... [193] */
    601  1.11  rillig out:
    602  1.11  rillig 	reachable();
    603  1.11  rillig }
    604  1.11  rillig 
    605  1.11  rillig void
    606  1.11  rillig test_unreachable_label(void)
    607  1.11  rillig {
    608  1.11  rillig 	if (0)
    609  1.19  rillig 		goto unreachable;	/* expect+0: ... [193] */
    610  1.11  rillig 	goto reachable;
    611  1.11  rillig 
    612  1.11  rillig 	/* named_label assumes that any label is reachable. */
    613  1.11  rillig unreachable:
    614  1.11  rillig 	unreachable();
    615  1.11  rillig reachable:
    616  1.11  rillig 	reachable();
    617  1.11  rillig }
    618  1.11  rillig 
    619   1.3  rillig /* TODO: switch */
    620   1.3  rillig 
    621   1.3  rillig /* TODO: system-dependent constant expression (see tn_system_dependent) */
    622  1.13  rillig 
    623  1.13  rillig void suppressed(void);
    624  1.13  rillig 
    625  1.13  rillig void
    626  1.13  rillig lint_annotation_NOTREACHED(void)
    627  1.13  rillig {
    628  1.13  rillig 	if (0) {
    629  1.22  rillig 		/* expect+1: warning: 'call' statement not reached [193] */
    630  1.13  rillig 		unreachable();
    631  1.13  rillig 	}
    632  1.13  rillig 
    633  1.13  rillig 	if (0) {
    634  1.13  rillig 		/* NOTREACHED */
    635  1.13  rillig 		suppressed();
    636  1.13  rillig 	}
    637  1.13  rillig 
    638  1.13  rillig 	if (0)
    639  1.13  rillig 		/* NOTREACHED */
    640  1.13  rillig 		suppressed();
    641  1.13  rillig 
    642  1.13  rillig 	if (1) {
    643  1.13  rillig 		reachable();
    644  1.13  rillig 	}
    645  1.13  rillig 
    646  1.13  rillig 	if (1) {
    647  1.13  rillig 		/* NOTREACHED */
    648  1.13  rillig 		suppressed();
    649  1.13  rillig 	}
    650  1.13  rillig 
    651  1.14  rillig 	/*
    652  1.14  rillig 	 * Since the condition in the 'if' statement is constant, lint knows
    653  1.14  rillig 	 * that the branch is unconditionally taken.  The annotation comment
    654  1.14  rillig 	 * marks that branch as not reached, which means that any following
    655  1.14  rillig 	 * statement cannot be reached as well.
    656  1.14  rillig 	 */
    657  1.22  rillig 	/* expect+1: warning: 'if' statement not reached [193] */
    658  1.13  rillig 	if (1)
    659  1.13  rillig 		/* NOTREACHED */
    660  1.13  rillig 		suppressed();
    661  1.13  rillig }
    662  1.15  rillig 
    663  1.15  rillig /*
    664  1.16  rillig  * Since at least 2002 and before cgram.y 1.379 from 2022-01-16, lint did not
    665  1.16  rillig  * detect a double semicolon.  See cgram.y, expression_statement, T_SEMI.
    666  1.15  rillig  */
    667  1.15  rillig int
    668  1.16  rillig test_null_statement(void)
    669  1.15  rillig {
    670  1.16  rillig 	/*
    671  1.16  rillig 	 * The following 2 semicolons are superfluous but lint doesn't warn
    672  1.16  rillig 	 * about them.  Probably it should.  A null statement as part of a
    673  1.16  rillig 	 * block-list has no use.
    674  1.16  rillig 	 */
    675  1.16  rillig 	;;
    676  1.16  rillig 
    677  1.16  rillig 	/*
    678  1.17  rillig 	 * If assertions are disabled with -DNDEBUG and __lint__ is defined,
    679  1.17  rillig 	 * NetBSD's <assert.h> defines assert(x) to nothing, leaving only
    680  1.17  rillig 	 * the trailing semicolon.  If there are several assertions next to
    681  1.17  rillig 	 * each other, without any whitespace in between (very unusual), the
    682  1.17  rillig 	 * GCC preprocessor generates ";;" for them, which makes them
    683  1.17  rillig 	 * indistinguishable from the literal ";;" from the typo above.
    684  1.17  rillig 	 *
    685  1.17  rillig 	 * (echo '#include <assert.h>'; echo 'assert(0);assert(1);') \
    686  1.17  rillig 	 * | gcc -DNDEBUG -E - -D__lint__
    687  1.17  rillig 	 *
    688  1.17  rillig 	 * To actually see the difference, lint would need to look at the
    689  1.17  rillig 	 * code before preprocessing and compare it with the preprocessed
    690  1.17  rillig 	 * code, which would be a lot of work.
    691  1.17  rillig 	 *
    692  1.17  rillig 	 * Apart from the above edge case, detecting extra semicolons would
    693  1.17  rillig 	 * be possible, but lint would have to look at the whitespace between
    694  1.17  rillig 	 * the tokens, and this is something that it doesn't do at all, as of
    695  1.17  rillig 	 * 2022-01-16.
    696  1.17  rillig 	 */
    697  1.17  rillig 
    698  1.17  rillig 	/*
    699  1.16  rillig 	 * A stand-alone null statement, on the other hand, has its purpose.
    700  1.16  rillig 	 * Without it, the 'for' loop would not be complete.  The NetBSD
    701  1.16  rillig 	 * style is to use 'continue;' instead of a simple ';'.
    702  1.16  rillig 	 */
    703  1.16  rillig 	for (int i = 0; i < 10; i++)
    704  1.16  rillig 		;
    705  1.16  rillig 
    706  1.22  rillig 	/* expect+1: warning: 'empty' statement not reached [193] */
    707  1.16  rillig 	return 0;;
    708  1.15  rillig }
    709  1.20  rillig 
    710  1.20  rillig /*
    711  1.20  rillig  * Before func.c 1.149 from 2023-02-21, lint crashed due to a null pointer
    712  1.20  rillig  * dereference.
    713  1.20  rillig  */
    714  1.20  rillig void
    715  1.20  rillig invalid_case_expression(void)
    716  1.20  rillig {
    717  1.20  rillig 	switch (4) {
    718  1.20  rillig 	/* expect+1: error: operand of '~' has invalid type 'double' [108] */
    719  1.20  rillig 	case ~0.0:
    720  1.20  rillig 		;
    721  1.20  rillig 	}
    722  1.20  rillig }
    723