]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/testsuite/gdb.c++/anon-union.exp
import gdb-1999-09-08 snapshot
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.c++ / anon-union.exp
1 # Tests for anonymous union support.
2 # Copyright (C) 1998, 1999 Free Software Foundation, Inc.
3
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
18 # Please email any bugs, comments, and/or additions to this file to:
19 # bug-gdb@prep.ai.mit.edu
20
21 # Written by Satish Pai <pai@apollo.hp.com> 1997-08-19
22
23 # This file is part of the gdb testsuite
24
25 if $tracelevel then {
26 strace $tracelevel
27 }
28
29 #
30 # test running programs
31 #
32
33 set prms_id 0
34 set bug_id 0
35
36 if { [skip_cplus_tests] } { continue }
37
38 set testfile "anon-union"
39 set srcfile ${testfile}.cc
40 set binfile ${objdir}/${subdir}/${testfile}
41
42 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
43 gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
44 }
45
46 # Start with a fresh gdb
47 gdb_exit
48 gdb_start
49 gdb_reinitialize_dir $srcdir/$subdir
50 gdb_load ${binfile}
51
52
53 if ![runto_main] then {
54 perror "couldn't run to breakpoint"
55 continue
56 }
57
58 send_gdb "set width 0\n"
59 gdb_expect -re "$gdb_prompt $"
60
61 #send_gdb "ptype foo\n"
62 #gdb_expect {
63 # -re "\r\n$gdb_prompt $" {
64 # pass "ptype foo"
65 # }
66 # -re ".*$gdb_prompt $" { fail "ptype foo" }
67 # timeout { fail "(timeout) ptype foo" }
68 #}
69
70 #send_gdb "ptype bar\n"
71 #gdb_expect {
72 # -re "\r\n$gdb_prompt $" {
73 # pass "ptype foo"
74 # }
75 # -re ".*$gdb_prompt $" { fail "ptype foo" }
76 # timeout { fail "(timeout) ptype foo" }
77 #}
78
79 # NOTE: Add -- ptype foo.x, etc. when things are working
80
81 #Initialize foo
82 send_gdb "next\n"
83 gdb_expect {
84 -re "40\[ \t\]*foo.paper = 33;\r\n$gdb_prompt $" {
85 pass "next 1"
86 }
87 -re ".*$gdb_prompt $" { fail "next 1" }
88 timeout { fail "(timeout) next 1" }
89 }
90
91 # Print out the big anon union.
92 send_gdb "print foo\n"
93 gdb_expect {
94 -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 0, x = \{rock = 0, rock2 = 0\}, \{qux = 0, mux = 0\}, boulder = 0\}, \{paper = 0, cloth = 0\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" {
95 pass "print foo 1"
96 }
97 -re ".*$gdb_prompt $" { fail "print foo 1" }
98 timeout { fail "(timeout) print foo 1" }
99 }
100
101 # Step over assignment to member
102
103 send_gdb "next\n"
104 gdb_expect {
105 -re "41\[ \t\]*foo.pebble = 44;\r\n$gdb_prompt $" {
106 pass "next 1"
107 }
108 -re ".*$gdb_prompt $" { fail "next 1" }
109 timeout { fail "(timeout) next 1" }
110 }
111
112 # Now print out anon union again
113 send_gdb "print foo\n"
114 gdb_expect {
115 -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 0, x = \{rock = 0, rock2 = 0\}, \{qux = 0, mux = 0\}, boulder = 0\}, \{paper = 33, cloth = 33\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" {
116 pass "print foo 2"
117 }
118 -re ".*$gdb_prompt $" { fail "print foo 2" }
119 timeout { fail "(timeout) print foo 2" }
120 }
121
122 # Modify the member just set
123 send_gdb "set var foo.cloth = 35\n"
124 gdb_expect {
125 -re "\r\n$gdb_prompt $" {
126 pass "set var foo.cloth"
127 }
128 timeout { fail "(timeout) set var foo.cloth" }
129 }
130
131 # Now print out anon union again to see if the right member was set
132 send_gdb "print foo\n"
133 gdb_expect {
134 -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 0, x = \{rock = 0, rock2 = 0\}, \{qux = 0, mux = 0\}, boulder = 0\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" {
135 pass "print foo 3"
136 }
137 -re ".*$gdb_prompt $" { fail "print foo 3" }
138 timeout { fail "(timeout) print foo 3" }
139 }
140
141
142 # Step over next assignment to member
143
144 send_gdb "next\n"
145 gdb_expect {
146 -re "42\[ \t\]*foo.mux = 55;\r\n$gdb_prompt $" {
147 pass "next 2"
148 }
149 -re ".*$gdb_prompt $" { fail "next 2" }
150 timeout { fail "(timeout) next 2" }
151 }
152
153 # Now print out anon union again
154 send_gdb "print foo\n"
155 gdb_expect {
156 -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 44, x = \{rock = 44, rock2 = 0\}, \{qux = 44, mux = 44\}, boulder = 44\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" {
157 pass "print foo 4"
158 }
159 -re ".*$gdb_prompt $" { fail "print foo 4" }
160 timeout { fail "(timeout) print foo 4" }
161 }
162
163 # Modify the member just set
164 send_gdb "set var foo.pebble = 45\n"
165 gdb_expect {
166 -re "\r\n$gdb_prompt $" {
167 pass "set var foo.pebble"
168 }
169 timeout { fail "(timeout) set var foo.pebble" }
170 }
171
172 # Now print out anon union again to see if the right member was set
173 send_gdb "print foo\n"
174 gdb_expect {
175 -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 45, x = \{rock = 45, rock2 = 0\}, \{qux = 45, mux = 45\}, boulder = 45\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" {
176 pass "print foo 5"
177 }
178 -re ".*$gdb_prompt $" { fail "print foo 5" }
179 timeout { fail "(timeout) print foo 5" }
180 }
181
182 # Modify another member at a different level
183 send_gdb "set var foo.qux = 46\n"
184 gdb_expect {
185 -re "\r\n$gdb_prompt $" {
186 pass "set var foo.qux"
187 }
188 timeout { fail "(timeout) set var foo.qux" }
189 }
190
191 # Now print out anon union again to see if the right member was set
192 send_gdb "print foo\n"
193 gdb_expect {
194 -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 46, x = \{rock = 46, rock2 = 0\}, \{qux = 46, mux = 46\}, boulder = 46\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" {
195 pass "print foo 6"
196 }
197 -re ".*$gdb_prompt $" { fail "print foo 6" }
198 timeout { fail "(timeout) print foo 6" }
199 }
200
201 # Modify the member at another level, but not the first one in the union
202 send_gdb "set var foo.mux = 47\n"
203 gdb_expect {
204 -re "\r\n$gdb_prompt $" {
205 pass "set var foo.mux"
206 }
207 timeout { fail "(timeout) set var foo.mux" }
208 }
209
210 # Now print out anon union again to see if things worked
211 send_gdb "print foo\n"
212 gdb_expect {
213 -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 47, x = \{rock = 47, rock2 = 0\}, \{qux = 47, mux = 47\}, boulder = 47\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" {
214 pass "print foo 7"
215 }
216 -re ".*$gdb_prompt $" { fail "print foo 7" }
217 timeout { fail "(timeout) print foo 7" }
218 }
219
220 # Modify a member of a struct in an anon union
221 send_gdb "set var foo.x.rock = 48\n"
222 gdb_expect {
223 -re "\r\n$gdb_prompt $" {
224 pass "set var foo.x.rock"
225 }
226 timeout { fail "(timeout) set var foo.x.rock" }
227 }
228
229 # Now print out anon union again to see if things worked
230 send_gdb "print foo\n"
231 gdb_expect {
232 -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 48, x = \{rock = 48, rock2 = 0\}, \{qux = 48, mux = 48\}, boulder = 48\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" {
233 pass "print foo 8"
234 }
235 -re ".*$gdb_prompt $" { fail "print foo 8" }
236 timeout { fail "(timeout) print foo 8" }
237 }
238
239 # Modify a member of a struct in an anon union, but something
240 # that doesn't alias to some other union member
241 send_gdb "set var foo.x.rock2 = 49\n"
242 gdb_expect {
243 -re "\r\n$gdb_prompt $" {
244 pass "set var foo.x.rock2"
245 }
246 timeout { fail "(timeout) set var foo.x.rock2" }
247 }
248
249 # Now print out anon union again to see if things worked
250 send_gdb "print foo\n"
251 gdb_expect {
252 -re "\\$\[0-9\]* = \{num1 = \{zero = 0, one = 0\}, \{pebble = 48, x = \{rock = 48, rock2 = 49\}, \{qux = 48, mux = 48\}, boulder = 48\}, \{paper = 35, cloth = 35\}, num2 = \{two = 0, three = 0\}\}\r\n$gdb_prompt $" {
253 pass "print foo 9"
254 }
255 -re ".*$gdb_prompt $" { fail "print foo 9" }
256 timeout { fail "(timeout) print foo 9" }
257 }
258
259
260 # Step over next four assignments
261 send_gdb "next 4\n"
262 gdb_expect {
263 -re "53\[ \t\]*w = 45;\r\n$gdb_prompt $" {
264 pass "next 3"
265 }
266 -re ".*$gdb_prompt $" { fail "next 3" }
267 timeout { fail "(timeout) next 3" }
268 }
269
270 # Tests for anon unions that are not members of a class or struct
271
272 send_gdb "print w\n"
273 gdb_expect {
274 -re "\\$\[0-9\]* = 0\r\n$gdb_prompt $" {
275 pass "print w 1"
276 }
277 -re ".*$gdb_prompt $" { fail "print w 1" }
278 timeout { fail "(timeout) print w 1" }
279 }
280
281 send_gdb "print z\n"
282 gdb_expect {
283 -re "\\$\[0-9\]* = 0\r\n$gdb_prompt $" {
284 pass "print z 1"
285 }
286 -re ".*$gdb_prompt $" { fail "print z 1" }
287 timeout { fail "(timeout) print z 1" }
288 }
289
290 # Step over next assignment to w
291 send_gdb "next\n"
292 gdb_expect {
293 -re "55\[ \t\]*\}\r\n$gdb_prompt $" {
294 pass "next 4"
295 }
296 -re ".*$gdb_prompt $" { fail "next 4" }
297 timeout { fail "(timeout) next 4" }
298 }
299
300 # See if the change in value is noticed
301 send_gdb "print w\n"
302 gdb_expect {
303 -re "\\$\[0-9\]* = 45\r\n$gdb_prompt $" {
304 pass "print w 2"
305 }
306 -re ".*$gdb_prompt $" { fail "print w 2" }
307 timeout { fail "(timeout) print w 2" }
308 }
309
310 # See if z shows the same value
311 send_gdb "print z\n"
312 gdb_expect {
313 -re "\\$\[0-9\]* = 45\r\n$gdb_prompt $" {
314 pass "print z 2"
315 }
316 -re ".*$gdb_prompt $" { fail "print z 2" }
317 timeout { fail "(timeout) print z 2" }
318 }
319
320 # Set the anon union member
321 send_gdb "set var z = 27\n"
322 gdb_expect {
323 -re "\r\n$gdb_prompt $" {
324 pass "set var z"
325 }
326 timeout { fail "(timeout) set var z" }
327 }
328
329 # See if the change in value is noticed
330 send_gdb "print w\n"
331 gdb_expect {
332 -re "\\$\[0-9\]* = 27\r\n$gdb_prompt $" {
333 pass "print w 3"
334 }
335 -re ".*$gdb_prompt $" { fail "print w 3" }
336 timeout { fail "(timeout) print w 3" }
337 }
338
339 # See if z shows the same value
340 send_gdb "print z\n"
341 gdb_expect {
342 -re "\\$\[0-9\]* = 27\r\n$gdb_prompt $" {
343 pass "print z 3"
344 }
345 -re ".*$gdb_prompt $" { fail "print z 3" }
346 timeout { fail "(timeout) print z 3" }
347 }