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

typedef int my_int_t;
typedef float my_float_t;
typedef my_int_t nested_int_t;
typedef my_float_t nested_float_t;

struct baz_t
{
  float f;
  double d;
};

typedef struct baz_t baz_t;
typedef struct baz_t baz;
typedef baz_t nested_baz_t;
typedef baz nested_baz;
typedef struct baz_t *baz_ptr;

enum enum_t
{
 AA, BB, CC
};

typedef enum enum_t my_enum_t;
typedef my_enum_t nested_enum_t;

typedef struct
{
  double d;
  float f;
} anon_struct_t;

typedef anon_struct_t nested_anon_struct_t;

typedef enum
{
 DD, EE, FF
} anon_enum_t;

typedef anon_enum_t nested_anon_enum_t;

union union_t
{
  int i;
  float f;
};

typedef union union_t nested_union_t;

typedef union
{
  int i;
  double d;
} anon_union_t;

typedef anon_union_t nested_anon_union_t;

volatile int var_a;
volatile float var_b;
volatile my_int_t var_c;
volatile my_float_t var_d;
volatile nested_int_t var_e;
volatile nested_float_t var_f;
volatile struct baz_t var_g;
volatile baz_t var_h;
volatile baz var_i;
volatile nested_baz_t var_j;
volatile nested_baz var_k;
volatile baz_ptr var_l;
volatile enum enum_t var_m;
volatile my_enum_t var_n;
volatile nested_enum_t var_o;
volatile anon_struct_t var_p;
volatile nested_anon_struct_t var_q;
volatile anon_enum_t var_r;
volatile nested_anon_enum_t var_s;
volatile union union_t var_t;
volatile nested_union_t var_u;
volatile anon_union_t var_v;
volatile nested_anon_union_t var_w;

#ifdef __cplusplus

class CL
{
  int a;
};

typedef CL my_cl;
typedef CL *my_ptr;

volatile CL var_cpp_a;
volatile my_cl var_cpp_b;
volatile my_ptr var_cpp_c;

#endif /* __cplusplus */

int
main ()
{
  asm ("" ::: "memory");
  return 0;
}
