anon-union.exp revision 1.9
1# Tests for anonymous union support. 2# Copyright 1998-2020 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 21# 22# test running programs 23# 24 25 26if { [skip_cplus_tests] } { continue } 27 28standard_testfile .cc 29 30if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} { 31 return -1 32} 33 34if ![runto_main] then { 35 perror "couldn't run to breakpoint" 36 continue 37} 38 39gdb_test_no_output "set width 0" 40 41#send_gdb "ptype foo\n" 42#gdb_expect { 43# -re "\r\n$gdb_prompt $" { 44# pass "ptype foo" 45# } 46# -re ".*$gdb_prompt $" { fail "ptype foo" } 47# timeout { fail "(timeout) ptype foo" } 48#} 49 50#send_gdb "ptype bar\n" 51#gdb_expect { 52# -re "\r\n$gdb_prompt $" { 53# pass "ptype foo" 54# } 55# -re ".*$gdb_prompt $" { fail "ptype foo" } 56# timeout { fail "(timeout) ptype foo" } 57#} 58 59# NOTE: Add -- ptype foo.x, etc. when things are working 60 61#Initialize foo 62gdb_test "next" "40\[ \t\]*foo.paper = 33;" "next 1" 63 64# Print out the big anon union. 65gdb_test "print foo" \ 66 "\\$\[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\}\}" \ 67 "print foo 1" 68 69# Step over assignment to member 70 71gdb_test "next" "41\[ \t\]*foo.pebble = 44;" "next 2" 72 73# Now print out anon union again 74gdb_test "print foo" \ 75 "\\$\[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\}\}" \ 76 "print foo 2" 77 78# Modify the member just set 79gdb_test_no_output "set var foo.cloth = 35" "set var foo.cloth" 80 81# Now print out anon union again to see if the right member was set 82gdb_test "print foo" \ 83 "\\$\[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\}\}" \ 84 "print foo 3" 85 86# Step over next assignment to member 87 88gdb_test "next" "42\[ \t\]*foo.mux = 55;" "next 3" 89 90# Now print out anon union again 91gdb_test "print foo" \ 92 "\\$\[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\}\}" \ 93 "print foo 4" 94 95# Modify the member just set 96gdb_test_no_output "set var foo.pebble = 45" "set var foo.pebble" 97 98# Now print out anon union again to see if the right member was set 99gdb_test "print foo" \ 100 "\\$\[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\}\}" \ 101 "print foo 5" 102 103# Modify another member at a different level 104gdb_test_no_output "set var foo.qux = 46" "set var foo.qux" 105 106# Now print out anon union again to see if the right member was set 107gdb_test "print foo" \ 108 "\\$\[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\}\}" \ 109 "print foo 6" 110 111# Modify the member at another level, but not the first one in the union 112gdb_test_no_output "set var foo.mux = 47" "set var foo.mux" 113 114# Now print out anon union again to see if things worked 115gdb_test "print foo" \ 116 "\\$\[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\}\}" \ 117 "print foo 7" 118 119# Modify a member of a struct in an anon union 120gdb_test_no_output "set var foo.x.rock = 48" "set var foo.x.rock" 121 122# Now print out anon union again to see if things worked 123gdb_test "print foo" \ 124 "\\$\[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\}\}" \ 125 "print foo 8" 126 127# Modify a member of a struct in an anon union, but something 128# that doesn't alias to some other union member 129gdb_test_no_output "set var foo.x.rock2 = 49" "set var foo.x.rock2" 130 131# Now print out anon union again to see if things worked 132gdb_test "print foo" \ 133 "\\$\[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\}\}" \ 134 "print foo 9" 135 136# Step over next four assignments 137gdb_test "next 4" "53\[ \t\]*w = 45;" 138 139# Tests for anon unions that are not members of a class or struct 140 141gdb_test "print w" "\\$\[0-9\]* = 0" "print w 1" 142 143gdb_test "print z" "\\$\[0-9\]* = 0" "print z 1" 144 145# Step over next assignment to w 146gdb_test "next" "55\[ \t\]*int j = 0;" "next 5" 147 148# See if the change in value is noticed 149gdb_test "print w" "\\$\[0-9\]* = 45" "print w 2" 150 151# See if z shows the same value 152gdb_test "print z" "\\$\[0-9\]* = 45" "print z 2" 153 154# Set the anon union member 155gdb_test_no_output "set var z = 27" "set var z" 156 157# See if the change in value is noticed 158gdb_test "print w" "\\$\[0-9\]* = 27" "print w 3" 159 160# See if z shows the same value 161gdb_test "print z" "\\$\[0-9\]* = 27" "print z 3" 162