/* Copyright 2019-2021 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;
}
