xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.mi/mi-var-cmd.exp (revision 782713e6c126f1866c6d9cfdee4ceb49483b5828)
1# Copyright 1999-2020 Free Software Foundation, Inc.
2#
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16# Test essential Machine interface (MI) operations
17#
18# Verify that, using the MI, we can create, update, delete variables.
19#
20
21
22load_lib mi-support.exp
23set MIFLAGS "-i=mi"
24
25gdb_exit
26if [mi_gdb_start] {
27    continue
28}
29
30standard_testfile var-cmd.c
31
32if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
33    untested "failed to compile"
34    return -1
35}
36
37mi_delete_breakpoints
38mi_gdb_reinitialize_dir $srcdir/$subdir
39mi_gdb_load ${binfile}
40
41
42#####                   #####
43#                           #
44#  Variable Creation tests  #
45#                           #
46#####                   #####
47
48# Test:  c_variable-1.1
49# Desc:  Create global variable
50
51mi_create_varobj "global_simple" "global_simple" "create global variable"
52
53# PR mi/15863
54# Attempt to update the varobj before running the inferior.
55mi_gdb_test "-var-update *" \
56	"\\^done,changelist=\\\[\\\]" \
57	"update varobj before running inferior"
58
59# Test: c_variable-1.2
60# Desc: Create non-existent variable
61
62mi_gdb_test "112-var-create bogus_unknown_variable * bogus_unknown_variable" \
63	"112\\^error,msg=\"-var-create: unable to create variable object\"" \
64	"create non-existent variable"
65
66# Test: c_variable-1.3
67# Desc: Create out of scope variable
68
69mi_gdb_test "113-var-create argc * argc" \
70	"113\\^error,msg=\"-var-create: unable to create variable object\"" \
71	"create out of scope variable"
72
73with_test_prefix "first run" {
74  mi_runto do_locals_tests
75}
76
77set line_dlt_first_real [gdb_get_line_number "linteger = 1234;"]
78
79mi_continue_to_line $line_dlt_first_real "step to real start of do_locals_test"
80
81
82# Test: c_variable-1.4
83# Desc: create local variables
84
85mi_create_varobj_checked linteger linteger int "create local variable linteger"
86
87mi_create_varobj_checked lpinteger lpinteger {int \*} "create local variable lpinteger"
88
89mi_create_varobj_checked lcharacter lcharacter\[0\] char "create local variable lcharacter"
90
91mi_create_varobj_checked lpcharacter lpcharacter {char \*} "create local variable lpcharacter"
92
93mi_create_varobj_checked llong llong "long" "create local variable llong"
94
95mi_create_varobj_checked lplong lplong {long \*} "create local variable lplong"
96
97mi_create_varobj_checked lfloat lfloat float "create local variable lfloat"
98
99mi_create_varobj_checked lpfloat lpfloat {float \*} "create local variable lpfloat"
100
101mi_create_varobj_checked ldouble ldouble double "create local variable ldouble"
102
103mi_create_varobj_checked lpdouble lpdouble {double \*} "create local variable lpdouble"
104
105mi_create_varobj_checked lsimple lsimple "struct _simple_struct" "create local variable lsimple"
106
107mi_create_varobj_checked lpsimple lpsimple {struct _simple_struct \*} "create local variable lpsimple"
108
109mi_create_varobj_checked func func {void \(\*\)\((void|)\)} "create local variable func"
110
111# Test: c_variable-1.5
112# Desc: create lsimple.character
113mi_create_varobj_checked lsimple.character lsimple.character "char" \
114	"create lsimple.character"
115
116# Test: c_variable-1.6
117# Desc: create lpsimple->integer
118mi_create_varobj_checked lsimple->integer lsimple->integer "int" \
119	"create lsimple->integer"
120
121# Test: c_variable-1.7
122# Desc: create lsimple.integer
123mi_create_varobj_checked lsimple.integer lsimple.integer "int" \
124	"create lsimple.integer"
125
126
127# Test: c_variable-1.9
128# Desc: create type name
129#    Type names (like int, long, etc..) are all proper expressions to gdb.
130#    make sure variable code does not allow users to create variables, though.
131mi_gdb_test "-var-create int * int" \
132	"&\"Attempt to use a type name as an expression.\\\\n\".*\\^error,msg=\"-var-create: unable to create variable object\"" \
133	"create int"
134
135
136#####             #####
137#                     #
138# Value changed tests #
139#                     #
140#####             #####
141
142# Test: c_variable-2.1
143# Desc: check whether values changed at do_block_tests
144mi_gdb_test "-var-update *" \
145	"\\^done,changelist=\\\[\\\]" \
146	"update all vars"
147
148# Step over "linteger = 1234;"
149set line_dlt_linteger [gdb_get_line_number "lpinteger = &linteger;"]
150mi_step_to "do_locals_tests" "" "var-cmd.c" $line_dlt_linteger "step at do_locals_test"
151
152# Test: c_variable-2.2
153# Desc: check whether only linteger changed values
154mi_gdb_test "-var-update *" \
155	"\\^done,changelist=\\\[\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
156	"update all vars: linteger changed"
157
158# Step over "lpinteger = &linteger;"
159mi_step_to "do_locals_tests" "" "var-cmd.c" [expr $line_dlt_linteger + 1] "step at do_locals_tests (2)"
160
161# Test: c_variable-2.3
162# Desc: check whether only lpinteger changed
163mi_gdb_test "-var-update *" \
164	"\\^done,changelist=\\\[\{name=\"lpinteger\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
165	"update all vars: lpinteger changed"
166
167# Step over "lcharacter = 'a';"
168mi_step_to "do_locals_tests" "" "var-cmd.c" [expr $line_dlt_linteger + 2] "step at do_locals_tests (3)"
169
170# Test: c_variable-2.4
171# Desc: check whether only lcharacter changed
172mi_gdb_test "-var-update *" \
173	"\\^done,changelist=\\\[\{name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
174	"update all vars: lcharacter changed"
175
176# Step over "lpcharacter = &lcharacter;"
177mi_step_to "do_locals_tests" "" "var-cmd.c" [expr $line_dlt_linteger + 3] "step at do_locals_tests (4)"
178
179# Test: c_variable-2.5
180# Desc: check whether only lpcharacter changed
181mi_gdb_test "-var-update *" \
182	"\\^done,changelist=\\\[\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
183	"update all vars: lpcharacter changed"
184
185
186# Step over:
187#  llong = 2121L;
188#  lplong = &llong;
189#  lfloat = 2.1;
190#  lpfloat = &lfloat;
191#  ldouble = 2.718281828459045;
192#  lpdouble = &ldouble;
193#  lsimple.integer = 1234;
194#  lsimple.unsigned_integer = 255;
195#  lsimple.character = 'a';
196
197mi_execute_to "exec-step 9" "end-stepping-range" "do_locals_tests" "" \
198	"var-cmd.c" [expr $line_dlt_linteger + 12] "" "step at do_locals_tests (5)"
199
200# Test: c_variable-2.6
201# Desc: check whether llong, lplong, lfloat, lpfloat, ldouble, lpdouble, lsimple.integer,
202#       lsimple.unsigned_character lsimple.integer lsimple.character changed
203mi_gdb_test "-var-update *" \
204	"\\^done,changelist=\\\[\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lpdouble\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"ldouble\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lpfloat\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lfloat\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lplong\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"llong\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
205	"update all vars: many changed"
206
207# Step over:
208#  lsimple.signed_character = 21;
209#  lsimple.char_ptr = &lcharacter;
210#  lpsimple = &lsimple;
211#  func = nothing;
212
213set line_dlt_4321 [gdb_get_line_number "linteger = 4321;"]
214
215mi_execute_to "exec-step 4" "end-stepping-range" "do_locals_tests" "" \
216	"var-cmd.c" $line_dlt_4321 "" "step at do_locals_tests (6)"
217
218# Test: c_variable-2.7
219# Desc: check whether (lsimple.signed_character, lsimple.char_ptr) lpsimple, func changed
220mi_gdb_test "-var-update *" \
221	"\\^done,changelist=\\\[\{name=\"func\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lpsimple\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
222	"update all vars: func and lpsimple changed"
223
224# Step over
225#  linteger = 4321;
226#  lcharacter = 'b';
227#  llong = 1212L;
228#  lfloat = 1.2;
229#  ldouble = 5.498548281828172;
230#  lsimple.integer = 255;
231#  lsimple.unsigned_integer = 4321;
232#  lsimple.character = 'b';
233
234mi_execute_to "exec-step 8" "end-stepping-range" "do_locals_tests" "" \
235	"var-cmd.c" [expr $line_dlt_4321 + 8] "" "step at do_locals_tests (7)"
236
237# Test: c_variable-2.8
238# Desc: check whether linteger, lcharacter, llong, lfoat, ldouble, lsimple.integer,
239#       lpsimple.integer lsimple.character changed
240# Note: this test also checks that lpsimple->integer and lsimple.integer have
241#       changed (they are the same)
242mi_gdb_test "-var-update *" \
243	"\\^done,changelist=\\\[\{name=\"lsimple.integer\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lsimple->integer\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lsimple.character\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"ldouble\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lfloat\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"llong\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"lcharacter\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\},\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
244	"update all vars: lsimple and others changed"
245
246
247###
248#
249# Test assignment to variables. More tests on assignment are in other files.
250#
251###
252mi_gdb_test "-var-assign global_simple 0" \
253	"\\^error,msg=\"-var-assign: Variable object is not editable\"" \
254	"assign to global_simple"
255
256mi_gdb_test "-var-assign linteger 3333" \
257	"\\^done,value=\"3333\"" \
258	"assign to linteger, 1st"
259
260# Allow lpcharacter to update, optionally.  Because it points to a
261# char variable instead of a zero-terminated string, if linteger is
262# directly after it in memory the printed characters may appear to
263# change.
264set lpchar_update "\{name=\"lpcharacter\",in_scope=\"true\",type_changed=\"false\"\},"
265mi_gdb_test "-var-update *" \
266	"\\^done,changelist=\\\[($lpchar_update)?\{name=\"linteger\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
267	"update all vars: linteger changed after assign"
268
269mi_gdb_test "-var-assign linteger 3333" \
270	"\\^done,value=\"3333\"" \
271	"assign to linteger again, same value"
272
273mi_gdb_test "-var-update *" \
274	"\\^done,changelist=\\\[\\\]" \
275	"update all vars: linteger not changed after same assign"
276
277mi_gdb_test "-var-evaluate-expression linteger" \
278	"\\^done,value=\"3333\"" \
279	"eval linteger"
280
281mi_gdb_test "-var-assign lpinteger \"&linteger + 3\"" \
282	"\\^done,value=\"$hex\"" \
283	"assign to lpinteger, 1st"
284
285mi_gdb_test "-var-update *" \
286	"\\^done,changelist=\\\[\{name=\"lpinteger\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
287	"update all vars: lpinteger changed after assign"
288
289mi_gdb_test "-var-update *" \
290	"\\^done,changelist=\\\[\\\]" \
291	"update all vars: no changes on second update"
292
293mi_gdb_test "-var-evaluate-expression lpinteger" \
294	"\\^done,value=\"$hex\"" \
295	"eval lpinteger"
296
297# reset the values to the original ones so that the rest of the file doesn't suffer.
298
299mi_gdb_test "-var-assign linteger 4321" \
300	"\\^done,value=\"4321\"" \
301	"assign to linteger, 2nd"
302
303mi_gdb_test "-var-assign lpinteger &linteger" \
304	"\\^done,value=\"$hex\"" \
305	"assign to lpinteger, 2nd"
306
307mi_gdb_test "-var-assign lcharacter 'z'" \
308	"\\^done,value=\"122 'z'\"" \
309	"assign to lcharacter"
310
311mi_gdb_test "-var-evaluate-expression lcharacter" \
312	"\\^done,value=\"122 'z'\"" \
313	"eval lcharacter"
314
315mi_gdb_test "-var-assign llong 1313L" \
316	"\\^done,value=\"1313\"" \
317	"assign to llong, 1st"
318mi_gdb_test "-var-evaluate-expression llong" \
319	"\\^done,value=\"1313\"" \
320	"eval llong"
321mi_gdb_test "-var-assign llong 1212L" \
322	"\\^done,value=\"1212\"" \
323	"assign to llong, 2nd"
324
325mi_gdb_test "-var-assign lplong &llong+4" \
326	"\\^done,value=\"$hex\"" \
327	"assign to lplong, 1st"
328mi_gdb_test "-var-evaluate-expression lplong" \
329	"\\^done,value=\"$hex\"" \
330	"eval lplong"
331mi_gdb_test "-var-assign lplong &llong" \
332	"\\^done,value=\"$hex\"" \
333	"assign to lplong, 2nd"
334
335mi_gdb_test "-var-assign lfloat 3.4567" \
336	"\\^done,value=\"3.45.*\"" \
337	"assign to lfloat, 1st"
338mi_gdb_test "-var-evaluate-expression lfloat" \
339	"\\^done,value=\"3.45.*\"" \
340	"eval lfloat"
341mi_gdb_test "-var-assign lfloat 1.2345" \
342	"\\^done,value=\"1.23.*\"" \
343	"assign to lfloat, 2nd"
344
345mi_gdb_test "-var-assign lpfloat &lfloat+4" \
346	"\\^done,value=\"$hex\"" \
347	"assign to lpfloat"
348
349mi_gdb_test "-var-assign ldouble 5.333318284590435" \
350	"\\^done,value=\"5.333318284590435\"" \
351	"assign to ldouble"
352
353mi_gdb_test "-var-assign func do_block_tests" \
354	"\\^done,value=\"$hex <do_block_tests>\"" \
355	"assign to func"
356
357mi_gdb_test "-var-assign lsimple.character 'd'" \
358	"\\^done,value=\"100 'd'\"" \
359	"assign to lsimple.character"
360
361mi_gdb_test "-var-assign  lsimple->integer 222" \
362	"\\^done,value=\"222\"" \
363	"assign to lsimple->integer"
364
365mi_gdb_test "-var-assign lsimple.integer 333" \
366	"\\^done,value=\"333\"" \
367	"assign to lsimple.integer"
368
369mi_gdb_test "-var-update *" \
370	"\\^done,changelist=.*" \
371	"var update"
372
373# Check that assignment of function and array values
374# promotes the assigned value to function pointer/data
375# pointer before comparing with the existing value,
376# and does not incorrectly make the value as changed.
377mi_gdb_test "-var-assign func do_block_tests" \
378	"\\^done,value=\"$hex <do_block_tests>\"" \
379	"assign same value to func"
380
381mi_gdb_test "-var-update *" \
382	"\\^done,changelist=\\\[\\\]" \
383	"assign same value to func (update)"
384
385mi_gdb_test "-var-create array_ptr * array_ptr" \
386	"\\^done,name=\"array_ptr\",numchild=\"1\",value=\"$hex <array>\",type=\"int \\*\",has_more=\"0\"" \
387	"create global variable array_ptr"
388
389mi_gdb_test "-var-assign array_ptr array2" \
390	"\\^done,value=\"$hex <array2>\"" \
391	"assign array to pointer"
392
393mi_gdb_test "-var-update *" \
394	"\\^done,changelist=\\\[\{name=\"array_ptr\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
395	"assign array to pointer (update)"
396
397mi_gdb_test "-var-assign array_ptr array2" \
398	"\\^done,value=\"$hex <array2>\"" \
399	"assign same array to pointer"
400
401mi_gdb_test "-var-update *" \
402	"\\^done,changelist=\\\[\\\]" \
403	"assign same array to pointer (update)"
404
405
406######
407# End of assign tests
408#####
409
410set line_subroutine1_body [gdb_get_line_number "global_simple.integer = i + 3;"]
411
412mi_continue_to subroutine1
413
414# Test: c_variable-2.10
415# Desc: create variable for locals i,l in subroutine1
416mi_create_varobj_checked i i int "create i"
417
418mi_create_varobj_checked l l {long \*} "create l"
419
420# Test: c_variable-2.11
421# Desc: create do_locals_tests local in subroutine1
422mi_gdb_test "-var-create linteger * linteger" \
423	"\\^error,msg=\"-var-create: unable to create variable object\"" \
424	"create linteger"
425
426mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \
427	"var-cmd.c" [expr $line_subroutine1_body + 1] "step at subroutine1"
428
429# Test: c_variable-2.12
430# Desc: change global_simple.integer
431# Note: This also tests whether we are reporting changes in structs properly.
432#       gdb normally would say that global_simple has changed, but we
433#       special case that, since it is not what a human expects to
434#       see.
435
436setup_xfail *-*-*
437mi_gdb_test "-var-update *" \
438	"\\^done,changelist=\{FIXME: WHAT IS CORRECT HERE\}" \
439	"update all vars: changed FIXME"
440clear_xfail *-*-*
441
442mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \
443	"var-cmd.c" [expr $line_subroutine1_body + 2] "step at subroutine1 (2)"
444
445# Test: c_variable-2.13
446# Desc: change subroutine1 local i
447mi_gdb_test "-var-update *" \
448	"\\^done,changelist=\\\[\{name=\"i\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
449	"update all vars: i changed"
450
451mi_step_to "subroutine1" "\{name=\"i\",value=\".*\"\},\{name=\"l\",value=\".*\"\}" \
452	"var-cmd.c" [expr $line_subroutine1_body + 3] "step at subroutine1 (3)"
453
454# Test: c_variable-2.14
455# Desc: change do_locals_tests local llong
456mi_gdb_test "-var-update *" \
457	"\\^done,changelist=\\\[\{name=\"llong\",in_scope=\"true\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
458	"update all vars: llong changed"
459
460set line_dlt_call_subroutine1 [gdb_get_line_number "subroutine1 (linteger, &llong);"]
461mi_next_to "do_locals_tests" ""	"var-cmd.c" \
462  [expr $line_dlt_call_subroutine1 + 1] "next out of subroutine1"
463
464# Test: c_variable-2.15
465# Desc: check for out of scope subroutine1 locals
466mi_gdb_test "-var-update *" \
467	"\\^done,changelist=\\\[\{name=\"l\",in_scope=\"false\"\,type_changed=\"false\",has_more=\"0\"},\{name=\"i\",in_scope=\"false\",type_changed=\"false\",has_more=\"0\"\}\\\]" \
468	"update all vars: all now out of scope"
469
470# Done with locals/globals tests. Erase all variables
471#delete_all_variables
472mi_gdb_test "-var-delete global_simple" \
473	"\\^done,ndeleted=\"1\"" \
474	"delete var"
475
476mi_gdb_test "-var-delete linteger" \
477	"\\^done,ndeleted=\"1\"" \
478	"delete var linteger"
479
480mi_gdb_test "-var-delete lpinteger" \
481	"\\^done,ndeleted=\"1\"" \
482	"delete var lpinteger"
483
484mi_gdb_test "-var-delete lcharacter" \
485	"\\^done,ndeleted=\"1\"" \
486	"delete var lcharacter"
487
488mi_gdb_test "-var-delete lpcharacter" \
489	"\\^done,ndeleted=\"1\"" \
490	"delete var lpcharacter"
491
492mi_gdb_test "-var-delete llong" \
493	"\\^done,ndeleted=\"1\"" \
494	"delete var llong"
495
496mi_gdb_test "-var-delete lplong" \
497	"\\^done,ndeleted=\"1\"" \
498	"delete var lplong"
499
500mi_gdb_test "-var-delete lfloat" \
501	"\\^done,ndeleted=\"1\"" \
502	"delete var lfloat"
503
504mi_gdb_test "-var-delete lpfloat" \
505	"\\^done,ndeleted=\"1\"" \
506	"delete var lpfloat"
507
508mi_gdb_test "-var-delete ldouble" \
509	"\\^done,ndeleted=\"1\"" \
510	"delete var ldouble"
511
512mi_gdb_test "-var-delete lpdouble" \
513	"\\^done,ndeleted=\"1\"" \
514	"delete var lpdouble"
515
516mi_gdb_test "-var-delete lsimple" \
517	"\\^done,ndeleted=\"1\"" \
518	"delete var lsimple"
519
520mi_gdb_test "-var-delete lpsimple" \
521	"\\^done,ndeleted=\"1\"" \
522	"delete var lpsimple"
523
524mi_gdb_test "-var-delete func" \
525	"\\^done,ndeleted=\"1\"" \
526	"delete var func"
527
528mi_gdb_test "-var-delete lsimple.character" \
529	"\\^done,ndeleted=\"1\"" \
530	"delete var lsimple.character"
531
532mi_gdb_test "-var-delete  lsimple->integer" \
533	"\\^done,ndeleted=\"1\"" \
534	"delete var  lsimple->integer"
535
536mi_gdb_test "-var-delete lsimple.integer" \
537	"\\^done,ndeleted=\"1\"" \
538	"delete var lsimple.integer"
539
540mi_gdb_test "-var-delete i" \
541	"\\^done,ndeleted=\"1\"" \
542	"delete var i"
543
544mi_gdb_test "-var-delete l" \
545	"\\^done,ndeleted=\"1\"" \
546	"delete var l"
547
548# Test whether we can follow the name of a variable through multiple
549# stack frames.
550mi_continue_to do_special_tests
551
552mi_gdb_test "-var-create selected_a @ a" \
553  {\^done,name="selected_a",numchild="0",value=\".*\",type="int".*} \
554  "create selected_a"
555
556mi_continue_to incr_a
557
558mi_gdb_test "-var-update selected_a" \
559	"\\^done,changelist=\\\[\{name=\"selected_a\",in_scope=\"true\",type_changed=\"true\",new_type=\"char\",new_num_children=\"0\",has_more=\"0\"\}\\\]" \
560	"update selected_a in incr_a"
561
562mi_next "step a line in incr_a"
563mi_next "return from incr_a to do_special_tests"
564
565mi_gdb_test "-var-update selected_a" \
566	"\\^done,changelist=\\\[\{name=\"selected_a\",in_scope=\"true\",type_changed=\"true\",new_type=\"int\",new_num_children=\"0\",has_more=\"0\"\}\\\]" \
567	"update selected_a in do_special_tests"
568
569if [is_remote host] {
570    set filename ${testfile}
571} else {
572    set filename ${binfile}
573}
574
575mi_gdb_test "-file-exec-and-symbols ${filename}" "\\^done" \
576    "floating varobj invalidation"
577
578mi_delete_varobj selected_a "delete selected_a"
579mi_delete_varobj array_ptr "delete array_ptr"
580
581proc set_frozen {varobjs flag} {
582    foreach v $varobjs {
583        mi_gdb_test "-var-set-frozen $v $flag" \
584            "\\^done" \
585            "-var-set-frozen $v $flag"
586    }
587}
588
589mi_prepare_inline_tests $srcfile
590mi_run_inline_test frozen
591
592mi_run_inline_test bitfield
593
594# Since the inline test framework does not really work with
595# function calls, first to inline tests and then do the reminder
596# manually.
597mi_run_inline_test floating
598set do_at_tests_callee_breakpoint [gdb_get_line_number "breakpoint inside callee"]
599mi_gdb_test "-break-insert var-cmd.c:$do_at_tests_callee_breakpoint" ".*" \
600    "inside breakpoint inside callee"
601mi_execute_to "exec-continue" "breakpoint-hit" do_at_tests_callee "" ".*" ".*" \
602    { "" "disp=\"keep\"" } \
603    "continue to where i is initialized"
604
605mi_varobj_update F {F} "update F inside callee"
606mi_check_varobj_value F 7 "check F inside callee"
607
608# Test whether bad varobjs crash GDB.
609
610# A varobj we fail to read during -var-update should be considered
611# out of scope.
612mi_gdb_test "-var-create null_ptr * **0" \
613    {\^done,name="null_ptr",numchild="0",value=".*",type="int",has_more="0"} \
614    "create null_ptr"
615
616# Allow this to succeed, if address zero is readable, although it
617# will not test what it was meant to.  Most important is that GDB
618# does not crash.
619mi_gdb_test "-var-update null_ptr" \
620    {\^done,changelist=\[.*\]} \
621    "update null_ptr"
622
623mi_gdb_test "-var-delete null_ptr" \
624    "\\^done,ndeleted=\"1\"" \
625    "delete null_ptr"
626
627# When we fail to read a varobj created from a named variable,
628# we evaluate its type instead.  Make sure that doesn't blow
629# up by trying to read it again.  We can use _end when not running
630# the program to simulate an unreadable variable, if this platform
631# provides _end, but cope if it's missing.
632
633mi_gdb_test "kill" \
634    {&"kill\\n".*\^done} \
635    "kill program before endvar"
636
637mi_gdb_test "-var-create endvar * _end" \
638    {(\^done,name="endvar",numchild="0",value=".*",type=".*"|\^error,msg=".*")} \
639    "create endvar"
640
641# Allow this to succeed whether the value is readable, unreadable, or
642# missing.  Most important is that GDB does not crash.
643mi_gdb_test "-var-update endvar" \
644    {(\^done,changelist=\[.*\]|\^error,msg=".*not found")} \
645    "update endvar"
646
647mi_gdb_test "-var-delete endvar" \
648    {(\^done,ndeleted="1"|\^error,msg=".*not found")} \
649    "delete endvar"
650
651mi_delete_breakpoints
652
653with_test_prefix "second run" {
654  mi_runto do_locals_tests
655}
656
657mi_create_varobj "L" "lsimple" "in-and-out-of-scope: create varobj"
658mi_check_varobj_value "L" "{...}" "in-and-out-of-scope: check initial value"
659
660mi_runto main
661
662mi_gdb_test "-var-update L" \
663    {\^done,changelist=\[{name="L",in_scope="false",type_changed="false",has_more="0"}\]} \
664    "in-and-out-of-scope: out of scope now"
665
666mi_gdb_test "-var-update L" \
667    {\^done,changelist=\[]} \
668    "in-and-out-of-scope: out of scope now, not changed"
669
670mi_continue_to do_locals_tests
671
672mi_gdb_test "-var-update L" \
673    {\^done,changelist=\[{name="L",in_scope="true",type_changed="false",has_more="0"}\]} \
674    "in-and-out-of-scope: in scope now"
675
676mi_gdb_test "-var-update L" \
677    {\^done,changelist=\[\]} \
678    "in-and-out-of-scope: in scope now, not changed"
679
680mi_gdb_exit
681return 0
682