Home | History | Annotate | Line # | Download | only in lint1
      1  1.17  rillig /*	$NetBSD: msg_217.c,v 1.17 2025/04/12 15:49:50 rillig Exp $	*/
      2   1.1  rillig # 3 "msg_217.c"
      3   1.1  rillig 
      4  1.11  rillig // Test for message: function '%s' falls off bottom without returning value [217]
      5   1.1  rillig 
      6  1.12  rillig /* lint1-extra-flags: -X 351 */
      7  1.12  rillig 
      8   1.2  rillig int
      9   1.2  rillig random(int n)
     10   1.2  rillig {
     11   1.2  rillig 	if (n < 0)
     12   1.2  rillig 		return -3;
     13  1.10  rillig }
     14  1.11  rillig /* expect-1: warning: function 'random' falls off bottom without returning value [217] */
     15   1.3  rillig 
     16   1.3  rillig /*
     17   1.3  rillig  * The pattern 'do { } while (0)' is often used in statement macros.
     18   1.3  rillig  * Putting a 'return' at the end of such a macro is legitimate, the embracing
     19   1.3  rillig  * 'do { } while (0)' is probably there to conform to a coding standard or
     20   1.3  rillig  * to otherwise reduce confusion.
     21   1.3  rillig  *
     22   1.3  rillig  * Seen in external/bsd/libevent/dist/event_tagging.c, function
     23   1.3  rillig  * encode_int_internal.
     24   1.3  rillig  *
     25   1.5  rillig  * Before tree.c 1.243 from 2021-03-21, lint wrongly reported that the
     26   1.5  rillig  * 'while 0' was unreachable.  This has been fixed by allowing the 'while 0'
     27   1.5  rillig  * in a do-while-false loop to be unreachable.  The same could be useful for a
     28   1.5  rillig  * do-while-true.
     29   1.6  rillig  *
     30   1.6  rillig  * Before func.c 1.83 from 2021-03-21, lint wrongly reported that the function
     31   1.6  rillig  * would fall off the bottom.
     32   1.3  rillig  */
     33   1.3  rillig int
     34   1.3  rillig do_while_return(int i)
     35   1.3  rillig {
     36   1.3  rillig 	do {
     37   1.3  rillig 		return i;
     38   1.5  rillig 	} while (0);
     39   1.6  rillig }
     40   1.4  rillig 
     41   1.4  rillig /*
     42   1.4  rillig  * C99 5.1.2.2.3 "Program termination" p1 defines that as a special exception,
     43   1.4  rillig  * the function 'main' does not have to return a value, reaching the bottom
     44   1.4  rillig  * is equivalent to returning 0.
     45   1.4  rillig  *
     46   1.4  rillig  * Before func.c 1.72 from 2021-02-21, lint had wrongly warned about this.
     47   1.4  rillig  */
     48   1.4  rillig int
     49   1.4  rillig main(void)
     50   1.4  rillig {
     51   1.4  rillig }
     52   1.7  rillig 
     53   1.7  rillig int
     54   1.7  rillig reachable_continue_leads_to_endless_loop(void)
     55   1.7  rillig {
     56   1.7  rillig 	for (;;) {
     57   1.7  rillig 		if (1)
     58   1.7  rillig 			continue;
     59   1.7  rillig 		break;
     60   1.7  rillig 	}
     61   1.9  rillig }
     62   1.7  rillig 
     63   1.7  rillig int
     64   1.7  rillig unreachable_continue_falls_through(void)
     65   1.7  rillig {
     66   1.7  rillig 	for (;;) {
     67   1.7  rillig 		if (0)
     68  1.15  rillig 			/* expect+1: warning: 'continue' statement not reached [193] */
     69  1.10  rillig 			continue;
     70   1.7  rillig 		break;
     71   1.7  rillig 	}
     72  1.10  rillig }
     73  1.11  rillig /* expect-1: warning: function 'unreachable_continue_falls_through' falls off bottom without returning value [217] */
     74  1.13  rillig 
     75  1.13  rillig 
     76  1.13  rillig _Noreturn void noreturn_c11(void);
     77  1.13  rillig [[noreturn]] void noreturn_c23(void);
     78  1.13  rillig __attribute__((__noreturn__)) void noreturn_gnu_prefix(void);
     79  1.13  rillig void __attribute__((__noreturn__)) noreturn_gnu_infix(void);
     80  1.13  rillig void noreturn_gnu_suffix(void) __attribute__((__noreturn__));
     81  1.13  rillig 
     82  1.13  rillig int
     83  1.13  rillig call_noreturn_c11(void)
     84  1.13  rillig {
     85  1.13  rillig 	noreturn_c11();
     86  1.13  rillig }
     87  1.13  rillig 
     88  1.16  rillig inline int
     89  1.13  rillig call_noreturn_c23(void)
     90  1.13  rillig {
     91  1.13  rillig 	noreturn_c23();
     92  1.13  rillig }
     93  1.13  rillig 
     94  1.13  rillig int
     95  1.13  rillig call_noreturn_gnu_prefix(void)
     96  1.13  rillig {
     97  1.13  rillig 	noreturn_gnu_prefix();
     98  1.13  rillig }
     99  1.13  rillig 
    100  1.13  rillig int
    101  1.13  rillig call_noreturn_gnu_infix(void)
    102  1.13  rillig {
    103  1.13  rillig 	noreturn_gnu_infix();
    104  1.13  rillig }
    105  1.13  rillig 
    106  1.13  rillig int
    107  1.13  rillig call_noreturn_gnu_suffix(void)
    108  1.13  rillig {
    109  1.13  rillig 	noreturn_gnu_suffix();
    110  1.13  rillig }
    111  1.16  rillig 
    112  1.16  rillig 
    113  1.16  rillig double *force_function_attributes_in_diagnostic[] = {
    114  1.16  rillig 	// Force the word 'noreturn' to occur in a diagnostic.
    115  1.17  rillig 	/* expect+1: warning: invalid combination of 'pointer to double' and 'pointer to noreturn function(void) returning void', op 'init' [124] */
    116  1.16  rillig 	noreturn_c23,
    117  1.16  rillig 	// The 'inline' does affect the type of the function.
    118  1.17  rillig 	/* expect+1: warning: invalid combination of 'pointer to double' and 'pointer to function(void) returning int', op 'init' [124] */
    119  1.16  rillig 	call_noreturn_c23,
    120  1.16  rillig };
    121