/* This testcase is part of GDB, the GNU debugger.

   Copyright 2013-2022 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include <stdlib.h>

void funca(void);
int count = 0;

typedef struct
{
  char *nothing;
  int f;
  short s;
} foobar;

void end_func (int foo, char *bar, foobar *fb, foobar bf)
{
  const char *str = "The End";
  const char *st2 = "Is Near";
  int b = 12;
  short c = 5;

  {
    int d = 15;
    int e = 14;
    const char *foo = "Inside block";
    {
      int f = 42;
      int g = 19;
      const char *bar = "Inside block x2";
      {
	short h = 9;
	h = h +1;  /* Inner test breakpoint  */
      }
    }
  }

  return; /* Backtrace end breakpoint */
}

void funcb(int j)
{
  struct foo
  {
    int a;
    int b;
  };

  struct foo bar;

  bar.a = 42;
  bar.b = 84;

  funca();
  return;
}

void funca(void)
{
  foobar fb;
  foobar *bf = NULL;

  if (count < 10)
    {
      count++;
      funcb(count);
    }

  fb.nothing = "Foo Bar";
  fb.f = 42;
  fb.s = 19;

  bf = (foobar *) alloca (sizeof (foobar));
  bf->nothing = (char *) alloca (128);
  bf->nothing = "Bar Foo";
  bf->f = 24;
  bf->s = 91;

  end_func(21, "Param", bf, fb);
  return;
}


void func1(void)
{
  funca();
  return;
}

int func2(int f)
{
  int c;
  const char *elided = "Elided frame";
  foobar fb;
  foobar *bf = NULL;

  fb.nothing = "Elided Foo Bar";
  fb.f = 84;
  fb.s = 38;

  bf = (foobar *) alloca (sizeof (foobar));
  bf->nothing = (char *) alloca (128);
  bf->nothing = "Elided Bar Foo";
  bf->f = 48;
  bf->s = 182;

  func1();
  return 1;
}

void func3(int i)
{
  func2(i);

  return;
}

int func4(int j)
{
  func3(j);

  return 2;
}

int func5(int f, int d)
{
  int i = 0;
  char *random = "random";
  i=i+f;

  func4(i);
  return i;
}

int
main()
{
  int z = 32;
  int y = 44;
  const char *foo1 = "Test";
  func5(3,5);
  return 0;
}
