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