/* PR middle-end/15345, c/16450 */
/* Test whether unused nested functions aren't emitted into the assembly.  */
/* { dg-do compile } */
/* { dg-options "-g0" } */
/* { dg-require-effective-target trampolines } */

int
fn1 (int x)
{
  int i = x;
  inline __attribute__((always_inline)) int
  should_not_appear1 (void)
  {
    return i;
  }
  return should_not_appear1 ();
}

int
fn2 (int x)
{
  int i = x;
  inline __attribute__((always_inline)) int
  should_not_appear2 (void)
  {
    return i;
  }
  return x;
}

extern void check (void *p);

int
fn3 (int x)
{
  int i = x;
  inline int
  should_appear1 (void)
  {
    char *p = __builtin_alloca (i);
    check (p);
    return i;
  }
  return should_appear1 ();
}

int
fn4 (int x)
{
  int i = x;
  inline int
  should_not_appear3 (void)
  {
    char *p = __builtin_alloca (i);
    check (p);
    return i;
  }
  return 0 ? should_not_appear3 () : 1;
}

int
fn5 (int x)
{
  int i = x;
  inline int
  should_appear2 (void)
  {
    return i;
  }
  check (should_appear2);
  return i;
}

/* { dg-final { scan-assembler-not "should_not_appear" } } */
