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