| /* This testcase is part of GDB, the GNU debugger. |
| |
| Copyright 2014-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/>. */ |
| |
| #include <stddef.h> |
| #define SIZE 5 |
| |
| struct foo |
| { |
| int a; |
| }; |
| |
| typedef struct bar |
| { |
| int x; |
| struct foo y; |
| } BAR; |
| |
| void |
| vla_factory (int n) |
| { |
| struct vla_struct |
| { |
| int something; |
| int vla_field[n]; |
| }; |
| /* Define a typedef for a VLA structure. */ |
| typedef struct vla_struct vla_struct_typedef; |
| vla_struct_typedef vla_struct_object; |
| |
| struct inner_vla_struct |
| { |
| int something; |
| int vla_field[n]; |
| int after; |
| } inner_vla_struct_object; |
| |
| /* Define a structure which uses a typedef for the VLA field |
| to make sure that GDB creates the proper type for this field, |
| preventing a possible assertion failure (see gdb/21356). */ |
| struct vla_struct_typedef_struct_member |
| { |
| int something; |
| vla_struct_typedef vla_object; |
| } vla_struct_typedef_struct_member_object; |
| |
| union vla_union |
| { |
| int vla_field[n]; |
| } vla_union_object; |
| |
| /* Like vla_struct_typedef_struct_member but a union type. */ |
| union vla_struct_typedef_union_member |
| { |
| int something; |
| vla_struct_typedef vla_object; |
| } vla_struct_typedef_union_member_object; |
| int i; |
| |
| vla_struct_object.something = n; |
| inner_vla_struct_object.something = n; |
| inner_vla_struct_object.after = n; |
| vla_struct_typedef_struct_member_object.something = n * 2; |
| vla_struct_typedef_struct_member_object.vla_object.something = n * 3; |
| vla_struct_typedef_union_member_object.vla_object.something = n + 1; |
| |
| for (i = 0; i < n; i++) |
| { |
| vla_struct_object.vla_field[i] = i*2; |
| vla_union_object.vla_field[i] = i*2; |
| inner_vla_struct_object.vla_field[i] = i*2; |
| vla_struct_typedef_struct_member_object.vla_object.vla_field[i] |
| = i * 3; |
| vla_struct_typedef_union_member_object.vla_object.vla_field[i] |
| = i * 3 - 1; |
| } |
| |
| size_t vla_struct_object_size |
| = sizeof(vla_struct_object); /* vlas_filled */ |
| size_t vla_union_object_size = sizeof(vla_union_object); |
| size_t inner_vla_struct_object_size = sizeof(inner_vla_struct_object); |
| |
| return; /* break_end_of_vla_factory */ |
| } |
| |
| int |
| main (void) |
| { |
| vla_factory(SIZE); |
| return 0; |
| } |