1 /* PR c/90737 - inconsistent address of a local converted to intptr_t
2    between callee and caller
3    { dg-do compile }
4    { dg-options "-O1 -Wall -Wreturn-local-addr -fdump-tree-optimized" } */
5 
6 typedef __INTPTR_TYPE__ intptr_t;
7 
8 const intptr_t&
return_addr_label_as_intref(void)9 return_addr_label_as_intref (void)
10 {
11  label:
12   if ((const intptr_t*)&&label == 0)
13     __builtin_exit (1);
14 
15   return *(const intptr_t*)&&label;   // { dg-warning "\\\[-Wreturn-local-addr]" } */
16 }
17 
18 const intptr_t&
return_addr_local_as_intref(void)19 return_addr_local_as_intref (void)
20 {
21   int a[1];
22   if ((const intptr_t*)a == 0)
23     __builtin_exit (1);
24 
25   return (const intptr_t&)a;   // { dg-warning "\\\[-Wreturn-local-addr]" } */
26 }
27 
28 /* Verify that the return value has been replaced with zero:
29   { dg-final { scan-tree-dump-times "return 0;" 2 "optimized" } } */
30