1 1.6 rillig /* $NetBSD: msg_302.c,v 1.6 2023/04/15 12:47:32 rillig Exp $ */ 2 1.1 rillig # 3 "msg_302.c" 3 1.1 rillig 4 1.4 rillig // Test for message: '%s' returns pointer to automatic object [302] 5 1.1 rillig 6 1.3 rillig void * 7 1.3 rillig return_arg(int arg) 8 1.3 rillig { 9 1.4 rillig /* expect+1: warning: 'return_arg' returns pointer to automatic object [302] */ 10 1.3 rillig return &arg; 11 1.3 rillig } 12 1.3 rillig 13 1.3 rillig void * 14 1.3 rillig return_local(void) 15 1.3 rillig { 16 1.3 rillig int local = 3; 17 1.4 rillig /* expect+1: warning: 'return_local' returns pointer to automatic object [302] */ 18 1.3 rillig return &local; 19 1.3 rillig } 20 1.3 rillig 21 1.3 rillig void * 22 1.5 rillig return_local_array(int x) 23 1.3 rillig { 24 1.5 rillig int local[5], *indirect = local; 25 1.3 rillig 26 1.5 rillig switch (x) { 27 1.5 rillig case 0: 28 1.5 rillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 29 1.5 rillig return local; 30 1.5 rillig case 1: 31 1.5 rillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 32 1.5 rillig return &local[3]; 33 1.5 rillig case 2: 34 1.5 rillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 35 1.5 rillig return 5 + local; 36 1.5 rillig case 3: 37 1.5 rillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 38 1.5 rillig return local + 5; 39 1.5 rillig case 4: 40 1.5 rillig /* XXX: lint only checks '+' but not '-'. */ 41 1.5 rillig return local - -3; 42 1.5 rillig case 5: 43 1.5 rillig /* XXX: lint doesn't track this indirection, but Clang-tidy does. */ 44 1.5 rillig return indirect; 45 1.6 rillig case 6: 46 1.6 rillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 47 1.6 rillig return (local); 48 1.6 rillig case 7: 49 1.6 rillig /* C99 6.5.2.5p6 */ 50 1.6 rillig /* Neither GCC 10 nor Clang 15 warn about this case. */ 51 1.6 rillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 52 1.6 rillig return (char[]){"local string"}; 53 1.5 rillig default: 54 1.5 rillig return "OK"; 55 1.5 rillig } 56 1.3 rillig } 57 1.3 rillig 58 1.3 rillig void * 59 1.3 rillig return_static(void) 60 1.3 rillig { 61 1.3 rillig static int long_lived = 3; 62 1.3 rillig return &long_lived; 63 1.3 rillig } 64