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

   Copyright 2017-2020 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 <stdint.h>

/* A struct with many types of fields, in order to test 'ptype
   /o'.  */

struct abc
{
  /* Virtual destructor.  */
  virtual ~abc ()
  {}

  /* 8-byte address.  Because of the virtual destructor above, this
     field's offset will be 8.  */
  void *field1;

  /* No hole here.  */

  /* 4-byte int bitfield of 1-bit.  */
  unsigned int field2 : 1;

  /* 31-bit hole here.  */

  /* 4-byte int.  */
  signed int field3;

  /* No hole here.  */

  /* 1-byte char.  */
  signed char field4;

  /* 7-byte hole here.  */

  /* 8-byte int.  */
  uint64_t field5;

  /* We just print the offset and size of a union, ignoring its
     fields.  */
  union
  {
    /* 8-byte address.  */
    void *field6;

    /* 4-byte int.  */
    signed int field7;
  } field8;

  /* Empty constructor.  */
  abc ()
  {}

  /* Typedef defined in-struct.  */
  typedef short my_int_type;

  my_int_type field9;
};

/* This struct will be nested inside 'struct xyz'.  */

struct tuv
{
  signed int a1;

  signed char *a2;

  signed int a3;
};

/* This struct will be nested inside 'struct pqr'.  */

struct xyz
{
  signed int f1;

  signed char f2;

  void *f3;

  struct tuv f4;
};

/* A struct with a nested struct.  */

struct pqr
{
  signed int ff1;

  struct xyz ff2;

  signed char ff3;
};

/* A union with two nested structs.  */

union qwe
{
  struct tuv fff1;

  struct xyz fff2;
};

/* A struct with an union.  */

struct poi
{
  signed int f1;

  union qwe f2;

  uint16_t f3;

  struct pqr f4;
};

/* A struct with bitfields.  */

struct tyu
{
  signed int a1 : 1;

  signed int a2 : 3;

  signed int a3 : 23;

  signed char a4 : 2;

  int64_t a5;

  signed int a6 : 5;

  int64_t a7 : 3;
};

/* A struct with structs and unions.  */

struct asd
{
  struct jkl
  {
      signed char *f1;
      union
      {
	void *ff1;
      } f2;
      union
      {
	signed char *ff2;
      } f3;
      int f4 : 5;
      unsigned int f5 : 1;
      short f6;
  } f7;
  unsigned long f8;
  signed char *f9;
  int f10 : 4;
  unsigned int f11 : 1;
  unsigned int f12 : 1;
  unsigned int f13 : 1;
  unsigned int f14 : 1;
  void *f15;
  void *f16;
};

/* See PR c++/23373.  */

struct static_member
{
  static static_member Empty;
  int abc;
};

int
main (int argc, char *argv[])
{
  struct abc foo;
  struct pqr bar;
  union qwe c;
  struct poi d;
  struct tyu e;
  struct asd f;
  uint8_t i;
  static_member stmember;

  return 0;
}
