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