]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/testsuite/gdb.base/vla-struct-fields.c
Update copyright year range in header of all files managed by GDB
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.base / vla-struct-fields.c
CommitLineData
3f00c730
GB
1/* This testcase is part of GDB, the GNU debugger.
2
213516ef 3 Copyright 2014-2023 Free Software Foundation, Inc.
3f00c730
GB
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17
18#include <stddef.h>
19#define SIZE 5
20
21struct foo
22{
23 int a;
24};
25
26typedef struct bar
27{
28 int x;
29 struct foo y;
30} BAR;
31
32void
33vla_factory (int n)
34{
35 struct vla_struct
36 {
37 int something;
38 int vla_field[n];
39 };
40 /* Define a typedef for a VLA structure. */
41 typedef struct vla_struct vla_struct_typedef;
42 vla_struct_typedef vla_struct_object;
43
44 struct inner_vla_struct
45 {
46 int something;
47 int vla_field[n];
48 int after;
49 } inner_vla_struct_object;
50
51 /* Define a structure which uses a typedef for the VLA field
52 to make sure that GDB creates the proper type for this field,
53 preventing a possible assertion failure (see gdb/21356). */
54 struct vla_struct_typedef_struct_member
55 {
56 int something;
57 vla_struct_typedef vla_object;
58 } vla_struct_typedef_struct_member_object;
59
60 union vla_union
61 {
62 int vla_field[n];
63 } vla_union_object;
64
65 /* Like vla_struct_typedef_struct_member but a union type. */
66 union vla_struct_typedef_union_member
67 {
68 int something;
69 vla_struct_typedef vla_object;
70 } vla_struct_typedef_union_member_object;
71 int i;
72
73 vla_struct_object.something = n;
74 inner_vla_struct_object.something = n;
75 inner_vla_struct_object.after = n;
76 vla_struct_typedef_struct_member_object.something = n * 2;
77 vla_struct_typedef_struct_member_object.vla_object.something = n * 3;
78 vla_struct_typedef_union_member_object.vla_object.something = n + 1;
79
80 for (i = 0; i < n; i++)
81 {
82 vla_struct_object.vla_field[i] = i*2;
83 vla_union_object.vla_field[i] = i*2;
84 inner_vla_struct_object.vla_field[i] = i*2;
85 vla_struct_typedef_struct_member_object.vla_object.vla_field[i]
86 = i * 3;
87 vla_struct_typedef_union_member_object.vla_object.vla_field[i]
88 = i * 3 - 1;
89 }
90
91 size_t vla_struct_object_size
92 = sizeof(vla_struct_object); /* vlas_filled */
93 size_t vla_union_object_size = sizeof(vla_union_object);
94 size_t inner_vla_struct_object_size = sizeof(inner_vla_struct_object);
95
96 return; /* break_end_of_vla_factory */
97}
98
99int
100main (void)
101{
102 vla_factory(SIZE);
103 return 0;
104}