Home | History | Annotate | Line # | Download | only in lint1
msg_193.c revision 1.21.2.1
      1  1.21.2.1  perseant /*	$NetBSD: msg_193.c,v 1.21.2.1 2025/08/02 05:58:17 perseant Exp $	*/
      2       1.1    rillig # 3 "msg_193.c"
      3       1.1    rillig 
      4  1.21.2.1  perseant // 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.21.2.1  perseant 		/* 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.21.2.1  perseant 	/* 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.21.2.1  perseant 	/* 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