1 # Tests for anonymous union support.
2 # Copyright 1998, 1999 Free Software Foundation, Inc.
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.
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.
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.
18 # Please email any bugs, comments, and/or additions to this file to:
19 # bug-gdb@prep.ai.mit.edu
21 # Written by Satish Pai <pai@apollo.hp.com> 1997-08-19
23 # This file is part of the gdb testsuite
30 # test running programs
36 if { [skip_cplus_tests] } { continue }
38 set testfile "anon-union"
39 set srcfile ${testfile}.cc
40 set binfile ${objdir}/${subdir}/${testfile}
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."
46 # Start with a fresh gdb
49 gdb_reinitialize_dir $srcdir/$subdir
53 if ![runto_main] then {
54 perror "couldn't run to breakpoint"
58 send_gdb "set width 0\n"
59 gdb_expect -re "$gdb_prompt $"
61 #send_gdb "ptype foo\n"
63 # -re "\r\n$gdb_prompt $" {
66 # -re ".*$gdb_prompt $" { fail "ptype foo" }
67 # timeout { fail "(timeout) ptype foo" }
70 #send_gdb "ptype bar\n"
72 # -re "\r\n$gdb_prompt $" {
75 # -re ".*$gdb_prompt $" { fail "ptype foo" }
76 # timeout { fail "(timeout) ptype foo" }
79 # NOTE: Add -- ptype foo.x, etc. when things are working
84 -re "40\[ \t\]*foo.paper = 33;\r\n$gdb_prompt $" {
87 -re ".*$gdb_prompt $" { fail "next 1" }
88 timeout { fail "(timeout) next 1" }
91 # Print out the big anon union.
92 send_gdb "print foo\n"
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 $" {
97 -re ".*$gdb_prompt $" { fail "print foo 1" }
98 timeout { fail "(timeout) print foo 1" }
101 # Step over assignment to member
105 -re "41\[ \t\]*foo.pebble = 44;\r\n$gdb_prompt $" {
108 -re ".*$gdb_prompt $" { fail "next 1" }
109 timeout { fail "(timeout) next 1" }
112 # Now print out anon union again
113 send_gdb "print foo\n"
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 $" {
118 -re ".*$gdb_prompt $" { fail "print foo 2" }
119 timeout { fail "(timeout) print foo 2" }
122 # Modify the member just set
123 send_gdb "set var foo.cloth = 35\n"
125 -re "\r\n$gdb_prompt $" {
126 pass "set var foo.cloth"
128 timeout { fail "(timeout) set var foo.cloth" }
131 # Now print out anon union again to see if the right member was set
132 send_gdb "print foo\n"
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 $" {
137 -re ".*$gdb_prompt $" { fail "print foo 3" }
138 timeout { fail "(timeout) print foo 3" }
142 # Step over next assignment to member
146 -re "42\[ \t\]*foo.mux = 55;\r\n$gdb_prompt $" {
149 -re ".*$gdb_prompt $" { fail "next 2" }
150 timeout { fail "(timeout) next 2" }
153 # Now print out anon union again
154 send_gdb "print foo\n"
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 $" {
159 -re ".*$gdb_prompt $" { fail "print foo 4" }
160 timeout { fail "(timeout) print foo 4" }
163 # Modify the member just set
164 send_gdb "set var foo.pebble = 45\n"
166 -re "\r\n$gdb_prompt $" {
167 pass "set var foo.pebble"
169 timeout { fail "(timeout) set var foo.pebble" }
172 # Now print out anon union again to see if the right member was set
173 send_gdb "print foo\n"
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 $" {
178 -re ".*$gdb_prompt $" { fail "print foo 5" }
179 timeout { fail "(timeout) print foo 5" }
182 # Modify another member at a different level
183 send_gdb "set var foo.qux = 46\n"
185 -re "\r\n$gdb_prompt $" {
186 pass "set var foo.qux"
188 timeout { fail "(timeout) set var foo.qux" }
191 # Now print out anon union again to see if the right member was set
192 send_gdb "print foo\n"
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 $" {
197 -re ".*$gdb_prompt $" { fail "print foo 6" }
198 timeout { fail "(timeout) print foo 6" }
201 # Modify the member at another level, but not the first one in the union
202 send_gdb "set var foo.mux = 47\n"
204 -re "\r\n$gdb_prompt $" {
205 pass "set var foo.mux"
207 timeout { fail "(timeout) set var foo.mux" }
210 # Now print out anon union again to see if things worked
211 send_gdb "print foo\n"
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 $" {
216 -re ".*$gdb_prompt $" { fail "print foo 7" }
217 timeout { fail "(timeout) print foo 7" }
220 # Modify a member of a struct in an anon union
221 send_gdb "set var foo.x.rock = 48\n"
223 -re "\r\n$gdb_prompt $" {
224 pass "set var foo.x.rock"
226 timeout { fail "(timeout) set var foo.x.rock" }
229 # Now print out anon union again to see if things worked
230 send_gdb "print foo\n"
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 $" {
235 -re ".*$gdb_prompt $" { fail "print foo 8" }
236 timeout { fail "(timeout) print foo 8" }
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"
243 -re "\r\n$gdb_prompt $" {
244 pass "set var foo.x.rock2"
246 timeout { fail "(timeout) set var foo.x.rock2" }
249 # Now print out anon union again to see if things worked
250 send_gdb "print foo\n"
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 $" {
255 -re ".*$gdb_prompt $" { fail "print foo 9" }
256 timeout { fail "(timeout) print foo 9" }
260 # Step over next four assignments
263 -re "53\[ \t\]*w = 45;\r\n$gdb_prompt $" {
266 -re ".*$gdb_prompt $" { fail "next 3" }
267 timeout { fail "(timeout) next 3" }
270 # Tests for anon unions that are not members of a class or struct
274 -re "\\$\[0-9\]* = 0\r\n$gdb_prompt $" {
277 -re ".*$gdb_prompt $" { fail "print w 1" }
278 timeout { fail "(timeout) print w 1" }
283 -re "\\$\[0-9\]* = 0\r\n$gdb_prompt $" {
286 -re ".*$gdb_prompt $" { fail "print z 1" }
287 timeout { fail "(timeout) print z 1" }
290 # Step over next assignment to w
293 -re "55\[ \t\]*\}\r\n$gdb_prompt $" {
296 -re ".*$gdb_prompt $" { fail "next 4" }
297 timeout { fail "(timeout) next 4" }
300 # See if the change in value is noticed
303 -re "\\$\[0-9\]* = 45\r\n$gdb_prompt $" {
306 -re ".*$gdb_prompt $" { fail "print w 2" }
307 timeout { fail "(timeout) print w 2" }
310 # See if z shows the same value
313 -re "\\$\[0-9\]* = 45\r\n$gdb_prompt $" {
316 -re ".*$gdb_prompt $" { fail "print z 2" }
317 timeout { fail "(timeout) print z 2" }
320 # Set the anon union member
321 send_gdb "set var z = 27\n"
323 -re "\r\n$gdb_prompt $" {
326 timeout { fail "(timeout) set var z" }
329 # See if the change in value is noticed
332 -re "\\$\[0-9\]* = 27\r\n$gdb_prompt $" {
335 -re ".*$gdb_prompt $" { fail "print w 3" }
336 timeout { fail "(timeout) print w 3" }
339 # See if z shows the same value
342 -re "\\$\[0-9\]* = 27\r\n$gdb_prompt $" {
345 -re ".*$gdb_prompt $" { fail "print z 3" }
346 timeout { fail "(timeout) print z 3" }