Commit | Line | Data |
---|---|---|
d4f3574e | 1 | # Tests for anonymous union support. |
4c38e0a4 | 2 | # Copyright 1998, 1999, 2003, 2004, 2007, 2008, 2009, 2010 |
0fb0cc75 | 3 | # Free Software Foundation, Inc. |
c906108c SS |
4 | |
5 | # This program is free software; you can redistribute it and/or modify | |
6 | # it under the terms of the GNU General Public License as published by | |
e22f8b7c | 7 | # the Free Software Foundation; either version 3 of the License, or |
c906108c | 8 | # (at your option) any later version. |
e22f8b7c | 9 | # |
c906108c SS |
10 | # This program is distributed in the hope that it will be useful, |
11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | # GNU General Public License for more details. | |
e22f8b7c | 14 | # |
c906108c | 15 | # You should have received a copy of the GNU General Public License |
e22f8b7c | 16 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
c906108c | 17 | |
c906108c SS |
18 | # Written by Satish Pai <pai@apollo.hp.com> 1997-08-19 |
19 | ||
20 | # This file is part of the gdb testsuite | |
21 | ||
22 | if $tracelevel then { | |
23 | strace $tracelevel | |
24 | } | |
25 | ||
26 | # | |
27 | # test running programs | |
28 | # | |
29 | ||
c906108c | 30 | |
d4f3574e SS |
31 | if { [skip_cplus_tests] } { continue } |
32 | ||
c906108c SS |
33 | set testfile "anon-union" |
34 | set srcfile ${testfile}.cc | |
35 | set binfile ${objdir}/${subdir}/${testfile} | |
d4f3574e | 36 | |
c906108c | 37 | if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { |
29518e1e MC |
38 | perror "Testcase compile failed" 0 |
39 | continue | |
c906108c SS |
40 | } |
41 | ||
42 | # Start with a fresh gdb | |
43 | gdb_exit | |
44 | gdb_start | |
45 | gdb_reinitialize_dir $srcdir/$subdir | |
46 | gdb_load ${binfile} | |
47 | ||
48 | ||
49 | if ![runto_main] then { | |
50 | perror "couldn't run to breakpoint" | |
51 | continue | |
52 | } | |
53 | ||
f8d3bf8f | 54 | gdb_test_no_output "set width 0" |
c906108c SS |
55 | |
56 | #send_gdb "ptype foo\n" | |
57 | #gdb_expect { | |
58 | # -re "\r\n$gdb_prompt $" { | |
59 | # pass "ptype foo" | |
60 | # } | |
61 | # -re ".*$gdb_prompt $" { fail "ptype foo" } | |
62 | # timeout { fail "(timeout) ptype foo" } | |
63 | #} | |
64 | ||
65 | #send_gdb "ptype bar\n" | |
66 | #gdb_expect { | |
67 | # -re "\r\n$gdb_prompt $" { | |
68 | # pass "ptype foo" | |
69 | # } | |
70 | # -re ".*$gdb_prompt $" { fail "ptype foo" } | |
71 | # timeout { fail "(timeout) ptype foo" } | |
72 | #} | |
73 | ||
74 | # NOTE: Add -- ptype foo.x, etc. when things are working | |
75 | ||
a0b3c4fd | 76 | #Initialize foo |
f8d3bf8f | 77 | gdb_test "next" "40\[ \t\]*foo.paper = 33;" "next 1" |
a0b3c4fd | 78 | |
c906108c | 79 | # Print out the big anon union. |
f8d3bf8f MS |
80 | gdb_test "print foo" \ |
81 | "\\$\[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\}\}" \ | |
82 | "print foo 1" | |
c906108c SS |
83 | |
84 | # Step over assignment to member | |
85 | ||
f8d3bf8f | 86 | gdb_test "next" "41\[ \t\]*foo.pebble = 44;" "next 2" |
c906108c SS |
87 | |
88 | # Now print out anon union again | |
f8d3bf8f MS |
89 | gdb_test "print foo" \ |
90 | "\\$\[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\}\}" \ | |
91 | "print foo 2" | |
c906108c SS |
92 | |
93 | # Modify the member just set | |
f8d3bf8f | 94 | gdb_test_no_output "set var foo.cloth = 35" "set var foo.cloth" |
c906108c SS |
95 | |
96 | # Now print out anon union again to see if the right member was set | |
f8d3bf8f MS |
97 | gdb_test "print foo" \ |
98 | "\\$\[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\}\}" \ | |
99 | "print foo 3" | |
c906108c SS |
100 | |
101 | # Step over next assignment to member | |
102 | ||
f8d3bf8f | 103 | gdb_test "next" "42\[ \t\]*foo.mux = 55;" "next 3" |
c906108c SS |
104 | |
105 | # Now print out anon union again | |
f8d3bf8f MS |
106 | gdb_test "print foo" \ |
107 | "\\$\[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\}\}" \ | |
108 | "print foo 4" | |
c906108c SS |
109 | |
110 | # Modify the member just set | |
f8d3bf8f | 111 | gdb_test_no_output "set var foo.pebble = 45" "set var foo.pebble" |
c906108c SS |
112 | |
113 | # Now print out anon union again to see if the right member was set | |
f8d3bf8f MS |
114 | gdb_test "print foo" \ |
115 | "\\$\[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\}\}" \ | |
116 | "print foo 5" | |
c906108c SS |
117 | |
118 | # Modify another member at a different level | |
f8d3bf8f | 119 | gdb_test_no_output "set var foo.qux = 46" "set var foo.qux" |
c906108c SS |
120 | |
121 | # Now print out anon union again to see if the right member was set | |
f8d3bf8f MS |
122 | gdb_test "print foo" \ |
123 | "\\$\[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\}\}" \ | |
124 | "print foo 6" | |
c906108c SS |
125 | |
126 | # Modify the member at another level, but not the first one in the union | |
f8d3bf8f | 127 | gdb_test_no_output "set var foo.mux = 47" "set var foo.mux" |
c906108c SS |
128 | |
129 | # Now print out anon union again to see if things worked | |
f8d3bf8f MS |
130 | gdb_test "print foo" \ |
131 | "\\$\[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\}\}" \ | |
132 | "print foo 7" | |
c906108c SS |
133 | |
134 | # Modify a member of a struct in an anon union | |
f8d3bf8f | 135 | gdb_test_no_output "set var foo.x.rock = 48" "set var foo.x.rock" |
c906108c SS |
136 | |
137 | # Now print out anon union again to see if things worked | |
f8d3bf8f MS |
138 | gdb_test "print foo" \ |
139 | "\\$\[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\}\}" \ | |
140 | "print foo 8" | |
c906108c SS |
141 | |
142 | # Modify a member of a struct in an anon union, but something | |
143 | # that doesn't alias to some other union member | |
f8d3bf8f | 144 | gdb_test_no_output "set var foo.x.rock2 = 49" "set var foo.x.rock2" |
c906108c SS |
145 | |
146 | # Now print out anon union again to see if things worked | |
f8d3bf8f MS |
147 | gdb_test "print foo" \ |
148 | "\\$\[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\}\}" \ | |
149 | "print foo 9" | |
c906108c | 150 | |
a0b3c4fd | 151 | # Step over next four assignments |
f8d3bf8f | 152 | gdb_test "next 4" "53\[ \t\]*w = 45;" "next 4" |
c906108c SS |
153 | |
154 | # Tests for anon unions that are not members of a class or struct | |
155 | ||
f8d3bf8f | 156 | gdb_test "print w" "\\$\[0-9\]* = 0" "print w 1" |
a0b3c4fd | 157 | |
f8d3bf8f | 158 | gdb_test "print z" "\\$\[0-9\]* = 0" "print z 1" |
c906108c SS |
159 | |
160 | # Step over next assignment to w | |
f8d3bf8f | 161 | gdb_test "next" "55\[ \t\]*int j = 0;" "next 5" |
c906108c SS |
162 | |
163 | # See if the change in value is noticed | |
f8d3bf8f | 164 | gdb_test "print w" "\\$\[0-9\]* = 45" "print w 2" |
c906108c SS |
165 | |
166 | # See if z shows the same value | |
31e43e98 | 167 | gdb_test "print z" "\\$\[0-9\]* = 45" "print z 2" |
c906108c SS |
168 | |
169 | # Set the anon union member | |
f8d3bf8f | 170 | gdb_test_no_output "set var z = 27" "set var z" |
c906108c SS |
171 | |
172 | # See if the change in value is noticed | |
f8d3bf8f | 173 | gdb_test "print w" "\\$\[0-9\]* = 27" "print w 3" |
c906108c SS |
174 | |
175 | # See if z shows the same value | |
f8d3bf8f | 176 | gdb_test "print z" "\\$\[0-9\]* = 27" "print z 3" |