# Copyright 2002-2003, 2007-2012 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/>.

#
# test gdb/792
#

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 gdb792.exp
  return -1
}

# Test that children of classes are properly reported

# Run to main
mi_run_to_main

mi_create_varobj "var1" "a" "create var for class A"

mi_list_varobj_children "var1" {
    {var1.public public 2}
    {var1.private private 2} 
    {var1.protected protected 2}
} "list children of class A"

mi_list_varobj_children "var1.public" {
    {var1.public.x x 0 int}
    {var1.public.buffer buffer 10 {char \[10\]}}
} "list children of A.public"

mi_list_varobj_children "var1.private" {
    {var1.private.u u 0 int}
    {var1.private.z z 0 float}
} "list children of A.private"

mi_list_varobj_children "var1.protected" {
    {var1.protected.y y 0 int}
    {var1.protected.b b 2 B}
} "list children of A.protected"

mi_list_varobj_children "var1.protected.b" {
    {var1.protected.b.public public 2}
    {var1.protected.b.private private 1}
} "list children of A.protected.b"

mi_list_varobj_children "var1.protected.b.public" {
    {var1.protected.b.public.bx bx 0 int}
    {var1.protected.b.public.by by 0 int}
} "list children of A.protected.b.public"

mi_list_varobj_children "var1.protected.b.private" {
    {var1.protected.b.private.k k 0 int}
} "list children of A.protected.b.private"

mi_create_varobj "var2" "c" "create var for class C which has baseclass A"

mi_list_varobj_children "var2" {
    {var2.A A 3 A}
    {var2.public public 1}
    {var2.private private 1}
} "list children of class C"

mi_gdb_exit
return 0
