1*e6298b92Srillig /* $NetBSD: msg_302.c,v 1.8 2023/07/07 19:45:22 rillig Exp $ */ 2a0a15c14Srillig # 3 "msg_302.c" 3a0a15c14Srillig 440a9b8fdSrillig // Test for message: '%s' returns pointer to automatic object [302] 5a0a15c14Srillig 6*e6298b92Srillig /* lint1-extra-flags: -X 351 */ 7*e6298b92Srillig 8ec42194bSrillig void * return_arg(int arg)9ec42194bSrilligreturn_arg(int arg) 10ec42194bSrillig { 1140a9b8fdSrillig /* expect+1: warning: 'return_arg' returns pointer to automatic object [302] */ 12ec42194bSrillig return &arg; 13ec42194bSrillig } 14ec42194bSrillig 15ec42194bSrillig void * return_local(void)16ec42194bSrilligreturn_local(void) 17ec42194bSrillig { 18ec42194bSrillig int local = 3; 1940a9b8fdSrillig /* expect+1: warning: 'return_local' returns pointer to automatic object [302] */ 20ec42194bSrillig return &local; 21ec42194bSrillig } 22ec42194bSrillig 23ec42194bSrillig void * return_local_array(int x)24e7d3b23cSrilligreturn_local_array(int x) 25ec42194bSrillig { 26e7d3b23cSrillig int local[5], *indirect = local; 27ec42194bSrillig 28e7d3b23cSrillig switch (x) { 29e7d3b23cSrillig case 0: 30e7d3b23cSrillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 31e7d3b23cSrillig return local; 32e7d3b23cSrillig case 1: 33e7d3b23cSrillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 34e7d3b23cSrillig return &local[3]; 35e7d3b23cSrillig case 2: 36e7d3b23cSrillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 37e7d3b23cSrillig return 5 + local; 38e7d3b23cSrillig case 3: 3940a9b8fdSrillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 40ec42194bSrillig return local + 5; 41e7d3b23cSrillig case 4: 42e7d3b23cSrillig /* XXX: lint only checks '+' but not '-'. */ 43e7d3b23cSrillig return local - -3; 44e7d3b23cSrillig case 5: 45e7d3b23cSrillig /* XXX: lint doesn't track this indirection, but Clang-tidy does. */ 46e7d3b23cSrillig return indirect; 47db7f32c2Srillig case 6: 48db7f32c2Srillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 49db7f32c2Srillig return (local); 50db7f32c2Srillig case 7: 51db7f32c2Srillig /* C99 6.5.2.5p6 */ 52db7f32c2Srillig /* expect+1: warning: 'return_local_array' returns pointer to automatic object [302] */ 53db7f32c2Srillig return (char[]){"local string"}; 54e7d3b23cSrillig default: 55e7d3b23cSrillig return "OK"; 56e7d3b23cSrillig } 57ec42194bSrillig } 58ec42194bSrillig 59ec42194bSrillig void * return_static(void)60ec42194bSrilligreturn_static(void) 61ec42194bSrillig { 62ec42194bSrillig static int long_lived = 3; 63ec42194bSrillig return &long_lived; 64ec42194bSrillig } 65