/* { dg-do compile { target { musttail && { c || c++11 } } } } */
/* { dg-options "-O2 -Wmaybe-musttail-local-addr" } */

int foo (int, void *);
int bar (int, int *);
struct S { int a, b, c; };
struct T { int d; struct S e; };

int
baz (int x, void *y)
{
  [[gnu::musttail]] return bar (2, &x);		/* { dg-warning "address of parameter 'x' passed to 'musttail' call argument" } */
}

int
qux (int x, void *y)
{
  __label__ lab;
  lab:;
  if (*(int *) y == 1)
    [[gnu::musttail]] return foo (1, &&lab);	/* { dg-warning "address of label passed to 'musttail' call argument" } */
  if (x == 1)
    [[gnu::musttail]] return foo (3, 0);
  else if (x == 2)
    {
      {
        int a = 42;
        bar (4, &a);
      }
      [[gnu::musttail]] return bar (5, 0);
    }
  else if (x == 3)
    {
      int a = 42;
      bar (4, &a);
      [[gnu::musttail]] return bar (6, 0);	/* { dg-warning "address of automatic variable 'a' can escape to 'musttail' call" } */
    }
  else if (x == 4)
    {
      int a = 42;
      [[gnu::musttail]] return bar (7, &a);	/* { dg-warning "address of automatic variable 'a' passed to 'musttail' call argument" } */
    }
  else if (x == 5)
    {
      struct T b;
      [[gnu::musttail]] return bar (8, &b.e.b);	/* { dg-warning "address of automatic variable 'b' passed to 'musttail' call argument" } */
    }
  else if (x == 6)
    {
      struct T b;
      bar (9, &b.e.a);
      [[gnu::musttail]] return bar (10, 0);	/* { dg-warning "address of automatic variable 'b' can escape to 'musttail' call" } */
    }
  else if (x == 7)
    {
      {
        struct T b;
        bar (9, &b.e.a);
      }
      [[gnu::musttail]] return bar (11, 0);
    }
  else if (x == 8)
    {
      {
        int a = 42;
        bar (4, &a);
      }
      [[gnu::musttail]] return foo (12, 0);
    }
  else if (x == 9)
    {
      int a = 42;
      bar (4, &a);
      [[gnu::musttail]] return foo (13, 0);	/* { dg-warning "address of automatic variable 'a' can escape to 'musttail' call" } */
    }
  else if (x == 10)
    {
      int a = 42;
      [[gnu::musttail]] return foo (14, &a);	/* { dg-warning "address of automatic variable 'a' passed to 'musttail' call argument" } */
    }
  else if (x == 11)
    {
      struct T b;
      [[gnu::musttail]] return foo (15, &b.e.b); /* { dg-warning "address of automatic variable 'b' passed to 'musttail' call argument" } */
    }
  else if (x == 12)
    {
      struct T b;
      bar (9, &b.e.a);
      [[gnu::musttail]] return foo (16, 0);	/* { dg-warning "address of automatic variable 'b' can escape to 'musttail' call" } */
    }
  else if (x == 13)
    {
      {
        struct T b;
        bar (9, &b.e.a);
      }
      [[gnu::musttail]] return foo (17, 0);
    }
  return 0;
}

int
corge (int x, void *y)
{
  if (*(int *) y == 1)
    bar (18, &x);
  [[gnu::musttail]] return bar (2, 0);		/* { dg-warning "address of parameter 'x' can escape to 'musttail' call" } */
}
