# Copyright 2011-2021 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

if { [skip_cplus_tests] } { continue }

load_lib mi-support.exp
set MIFLAGS "-i=mi"

gdb_exit
if [mi_gdb_start] {
    continue
}

standard_testfile .cc

if [get_compiler_info "c++"] {
    return -1
}

if {[gdb_compile $srcdir/$subdir/$srcfile $binfile executable {debug c++}] != ""} {
  untested "failed to compile"
  return -1
}

# Test that children of derived classes are given the proper
# path by -var-info-path-expression

mi_gdb_load ${binfile}
mi_runto C::testLocation

mi_create_varobj "var1" "this" "create var for THIS"

mi_list_varobj_children "var1" {
    {var1.A A 1 A}
    {var1.public public 1}
} "list children of THIS"

# We don't care what the result of -var-info-path-expression
# as long as it can be used in the -data-evaluate-expression
# that follows
mi_gdb_test "-var-info-path-expression var1.A" \
    "\\^done,path_expr=\".*\"" \
    "-var-info-path-expression var1.A"

# Extract the result of the -var-info-path-expression command
# to use it in -data-evaluate-expression
set cmd_output $expect_out(2,string)
set path [lindex [split $cmd_output "\""] 1]
verbose "var-info-path-expression returned $cmd_output" 2
verbose "Using $path for data-evaluate-expression" 2


mi_gdb_test "-data-evaluate-expression \"$path\"" \
    "\\^done,value=\"\{a = 5\}\"" \
    "-data-evaluate-expression $path"

mi_gdb_exit
return 0
