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