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

   Copyright 2019-2026 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/>.  */

struct s1
{
  int x;
  int y;
} s1;

struct s2
{
  int x;
  int y;
  struct
  {
    int z;
    int a;
  };
} s2;

struct s3
{
  int x;
  int y;
  struct
  {
    int z;
    int a;
    struct
    {
      int b;
      int c;
    };
  };
} s3;

struct s4
{
  int x;
  int y;
  struct
  {
    int x;
    int y;
    struct
    {
      int x;
      int y;
    } l2;
  } l1;
} s4;

struct s5
{
  union
  {
    int raw[3];
    struct
    {
      int x;
      int y;
      int z;
    };
  };
} s5;

typedef struct
{
  union
  {
    int raw[3];
    struct
    {
      int x;
      int y;
      int z;
    };
  };
} s6_t;

s6_t s6;

struct s7
{
  struct
  {
    int x;
    int y;
  };
  struct
  {
    int z;
    int a;
  };
  struct
  {
    int b;
    int c;
  };
} s7;

struct s8
{
  int x;
  int y;
  struct
  {
    int z;
    int a;
    struct
    {
      int b;
      int c;
    };
  } d1;
} s8;

struct s9
{
  int x;
  int y;
  struct
  {
    int k;
    int j;
    struct
    {
      int z;
      int a;
      struct
      {
	int b;
	int c;
      };
    } d1;
  };
  struct
  {
    int z;
    int a;
    struct
    {
      int b;
      int c;
    };
  } d2;
} s9;

struct s10
{
  int x[10];
  int y;
  struct
  {
    int k[10];
    int j;
    struct
    {
      int z;
      int a;
      struct
      {
	int b[10];
	int c;
      };
    } d1;
  };
  struct
  {
    int z;
    int a;
    struct
    {
      int b[10];
      int c;
    };
  } d2;
} s10;

struct s11
{
  int x;
  char s[10];
  struct
  {
    int z;
    int a;
  };
} s11;

/* The following are C++ inheritance testing.  */
#ifdef __cplusplus

/* This is non-virtual inheritance.  */
struct C1 { int c1 = 1; } c1;
struct C2 { int c2 = 2; } c2;
struct C3 : C2 { int c3 = 3; } c3;
struct C4 { int c4 = 4; } c4;
struct C5 : C4 { int c5 = 5; } c5;
struct C6 : C5 { int c6 = 6; } c6;
struct C7 : C1, C3, C6 { int c7 = 7; } c7;

/* This is virtual inheritance.  */
struct V1 { int v1 = 1; } v1;
struct V2 : virtual V1 { int v2 = 2; } v2;
struct V3 : virtual V1 { int v3 = 3; } v3;
struct V4 : virtual V2 { int v4 = 4; } v4;
struct V5 : virtual V2 { int v5 = 1; } v5;
struct V6 : virtual V2, virtual V3 { int v6 = 1; } v6;
struct V7 : virtual V4, virtual V5, virtual V6 { int v7 = 1; } v7;

#endif /* __cplusplus */

void Do_nothing (struct s1 sone)
{
  /*  This Function does nothing.  */
}

int
main ()
{
  /*  In targets like AIX, linker optimises out unused global
      variables.  The do_nothing () function stops the linker
      from doing so.  */
  Do_nothing (s1);
  return 0;
}
