text: /* This test program is part of GDB, the GNU debugger.
  
     Copyright 2017-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/>.  */
  
  /* Define typedefs of different types, for testing the "whatis" and
     "ptype" commands.  */
  
  /* Helper macro used to consistently define variables/typedefs using
     the same name scheme.  BASE is the shared part of the name of all
     typedefs/variables generated.  Defines a variable of the given
     typedef type, and then a typedef of that typedef and a variable of
     that new typedef type.  The "double typedef" is useful to checking
     that whatis only strips one typedef level.  For example, if BASE is
     "int", we get:
  
    int_typedef v_int_typedef; // "v_" stands for variable of typedef type
    typedef int_typedef int_typedef2; // typedef-of-typedef
    int_typedef2 v_int_typedef2; // var of typedef-of-typedef
  */
  #define DEF(base)				\
    base ## _typedef v_ ## base ## _typedef;	\
  						\
    typedef base ## _typedef base ## _typedef2;	\
    base ## _typedef2 v_ ## base ## _typedef2
  
  /* Void.  */
  
  /* (Can't have variables of void type.)  */
  
  typedef void void_typedef;
  typedef void_typedef void_typedef2;
  
  void_typedef *v_void_typedef_ptr;
  void_typedef2 *v_void_typedef_ptr2;
  
  /* Integers.  */
  
  typedef int int_typedef;
  DEF (int);
  
  /* Floats.  */
  
  typedef float float_typedef;
  DEF (float);
  
  /* Double floats.  */
  
  typedef double double_typedef;
  DEF (double);
  
  /* Long doubles.  */
  
  typedef long double long_double_typedef;
  DEF (long_double);
  
  /* Enums.  */
  
  typedef enum colors {red, green, blue} colors_typedef;
  DEF (colors);
  
  /* Structures.  */
  
  typedef struct t_struct
  {
    int member;
  } t_struct_typedef;
  DEF (t_struct);
  
  /* Unions.  */
  
  typedef union t_union
  {
    int member;
  } t_union_typedef;
  DEF (t_union);
  
  /* Arrays.  */
  
  typedef int int_array_typedef[3];
  DEF (int_array);
  
  /* An array the same size of t_struct_typedef, so we can test casting.  */
  typedef unsigned char uchar_array_t_struct_typedef[sizeof (t_struct_typedef)];
  DEF (uchar_array_t_struct);
  
  /* A struct and a eunion the same size as t_struct, so we can test
     casting.  */
  
  typedef struct t_struct_wrapper
  {
    struct t_struct base;
  } t_struct_wrapper_typedef;
  DEF (t_struct_wrapper);
  
  typedef union t_struct_union_wrapper
  {
    struct t_struct base;
  } t_struct_union_wrapper_typedef;
  DEF (t_struct_union_wrapper);
  
  /* Functions / function pointers.  */
  
  typedef void func_ftype (void);
  func_ftype *v_func_ftype;
  
  typedef func_ftype func_ftype2;
  func_ftype2 *v_func_ftype2;
  
  /* C++ methods / method pointers.  */
  
  #ifdef __cplusplus
  
  namespace ns {
  
  struct Struct { void method (); };
  void Struct::method () {}
  
  typedef Struct Struct_typedef;
  DEF (Struct);
  
  /* Typedefs/vars in a namespace.  */
  typedef void (Struct::*method_ptr_typedef) ();
  DEF (method_ptr);
  
  }
  
  /* Similar, but in the global namespace.  */
  typedef ns::Struct ns_Struct_typedef;
  DEF (ns_Struct);
  
  typedef void (ns::Struct::*ns_method_ptr_typedef) ();
  DEF (ns_method_ptr);
  
  #endif
  
  int
  main (void)
  {
    return 0;
  }
  