xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_217.c (revision cd4ee416b8ecb6a5d3739b2d808bd6e8e4173867)
1*cd4ee416Srillig /*	$NetBSD: msg_217.c,v 1.16 2024/11/30 11:27:20 rillig Exp $	*/
2a0a15c14Srillig # 3 "msg_217.c"
3a0a15c14Srillig 
440a9b8fdSrillig // Test for message: function '%s' falls off bottom without returning value [217]
5a0a15c14Srillig 
6e6298b92Srillig /* lint1-extra-flags: -X 351 */
7e6298b92Srillig 
830295665Srillig int
930295665Srillig random(int n)
1030295665Srillig {
1130295665Srillig 	if (n < 0)
1230295665Srillig 		return -3;
1336dcebf9Srillig }
1440a9b8fdSrillig /* expect-1: warning: function 'random' falls off bottom without returning value [217] */
150b129208Srillig 
160b129208Srillig /*
170b129208Srillig  * The pattern 'do { } while (0)' is often used in statement macros.
180b129208Srillig  * Putting a 'return' at the end of such a macro is legitimate, the embracing
190b129208Srillig  * 'do { } while (0)' is probably there to conform to a coding standard or
200b129208Srillig  * to otherwise reduce confusion.
210b129208Srillig  *
220b129208Srillig  * Seen in external/bsd/libevent/dist/event_tagging.c, function
230b129208Srillig  * encode_int_internal.
240b129208Srillig  *
2585a09d20Srillig  * Before tree.c 1.243 from 2021-03-21, lint wrongly reported that the
2685a09d20Srillig  * 'while 0' was unreachable.  This has been fixed by allowing the 'while 0'
2785a09d20Srillig  * in a do-while-false loop to be unreachable.  The same could be useful for a
2885a09d20Srillig  * do-while-true.
298c4298c3Srillig  *
308c4298c3Srillig  * Before func.c 1.83 from 2021-03-21, lint wrongly reported that the function
318c4298c3Srillig  * would fall off the bottom.
320b129208Srillig  */
330b129208Srillig int
340b129208Srillig do_while_return(int i)
350b129208Srillig {
360b129208Srillig 	do {
370b129208Srillig 		return i;
3885a09d20Srillig 	} while (0);
398c4298c3Srillig }
40ab7cfcc5Srillig 
41ab7cfcc5Srillig /*
42ab7cfcc5Srillig  * C99 5.1.2.2.3 "Program termination" p1 defines that as a special exception,
43ab7cfcc5Srillig  * the function 'main' does not have to return a value, reaching the bottom
44ab7cfcc5Srillig  * is equivalent to returning 0.
45ab7cfcc5Srillig  *
46ab7cfcc5Srillig  * Before func.c 1.72 from 2021-02-21, lint had wrongly warned about this.
47ab7cfcc5Srillig  */
48ab7cfcc5Srillig int
49ab7cfcc5Srillig main(void)
50ab7cfcc5Srillig {
51ab7cfcc5Srillig }
52295da532Srillig 
53295da532Srillig int
54295da532Srillig reachable_continue_leads_to_endless_loop(void)
55295da532Srillig {
56295da532Srillig 	for (;;) {
57295da532Srillig 		if (1)
58295da532Srillig 			continue;
59295da532Srillig 		break;
60295da532Srillig 	}
61352b5b3bSrillig }
62295da532Srillig 
63295da532Srillig int
64295da532Srillig unreachable_continue_falls_through(void)
65295da532Srillig {
66295da532Srillig 	for (;;) {
67295da532Srillig 		if (0)
686937eff3Srillig 			/* expect+1: warning: 'continue' statement not reached [193] */
6936dcebf9Srillig 			continue;
70295da532Srillig 		break;
71295da532Srillig 	}
7236dcebf9Srillig }
7340a9b8fdSrillig /* expect-1: warning: function 'unreachable_continue_falls_through' falls off bottom without returning value [217] */
746222d4a1Srillig 
756222d4a1Srillig 
766222d4a1Srillig _Noreturn void noreturn_c11(void);
776222d4a1Srillig [[noreturn]] void noreturn_c23(void);
786222d4a1Srillig __attribute__((__noreturn__)) void noreturn_gnu_prefix(void);
796222d4a1Srillig void __attribute__((__noreturn__)) noreturn_gnu_infix(void);
806222d4a1Srillig void noreturn_gnu_suffix(void) __attribute__((__noreturn__));
816222d4a1Srillig 
826222d4a1Srillig int
836222d4a1Srillig call_noreturn_c11(void)
846222d4a1Srillig {
856222d4a1Srillig 	noreturn_c11();
866222d4a1Srillig }
876222d4a1Srillig 
88*cd4ee416Srillig inline int
896222d4a1Srillig call_noreturn_c23(void)
906222d4a1Srillig {
916222d4a1Srillig 	noreturn_c23();
926222d4a1Srillig }
936222d4a1Srillig 
946222d4a1Srillig int
956222d4a1Srillig call_noreturn_gnu_prefix(void)
966222d4a1Srillig {
976222d4a1Srillig 	noreturn_gnu_prefix();
986222d4a1Srillig }
996222d4a1Srillig 
1006222d4a1Srillig int
1016222d4a1Srillig call_noreturn_gnu_infix(void)
1026222d4a1Srillig {
1036222d4a1Srillig 	noreturn_gnu_infix();
1046222d4a1Srillig }
1056222d4a1Srillig 
1066222d4a1Srillig int
1076222d4a1Srillig call_noreturn_gnu_suffix(void)
1086222d4a1Srillig {
1096222d4a1Srillig 	noreturn_gnu_suffix();
1106222d4a1Srillig }
111*cd4ee416Srillig 
112*cd4ee416Srillig 
113*cd4ee416Srillig double *force_function_attributes_in_diagnostic[] = {
114*cd4ee416Srillig 	// Force the word 'noreturn' to occur in a diagnostic.
115*cd4ee416Srillig 	/* expect+1: warning: illegal combination of 'pointer to double' and 'pointer to noreturn function(void) returning void', op 'init' [124] */
116*cd4ee416Srillig 	noreturn_c23,
117*cd4ee416Srillig 	// The 'inline' does affect the type of the function.
118*cd4ee416Srillig 	/* expect+1: warning: illegal combination of 'pointer to double' and 'pointer to function(void) returning int', op 'init' [124] */
119*cd4ee416Srillig 	call_noreturn_c23,
120*cd4ee416Srillig };
121