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