# Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
# 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# This file was written by Elena Zannoni (ezannoni@cygnus.com)
# And rewritten by Michael Chastain <mec.gnu@mindspring.com>

# This file is part of the gdb testsuite

# tests for inheritance, with several derivations types combinations
# (private, public, protected) 
# classes have simple members and member functions.

set ws "\[\r\n\t \]+"
set nl "\[\r\n\]+"

if $tracelevel then {
    strace $tracelevel
}

# Start program.

set prms_id 0
set bug_id 0

if { [skip_cplus_tests] } { continue }

load_lib "cp-support.exp"

set testfile "derivation"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

# Set it up at a breakpoint so we can play with the variable values.

if ![runto 'marker1'] then {
    perror "couldn't run to marker1"
    continue
}

gdb_test "up" ".*main.*" "up from marker1"

# Print class types and values.

# class A

gdb_test "print a_instance" "\\$\[0-9\]+ = \{a = 1, aa = 2\}" "print value of a_instance"

cp_test_ptype_class \
    "ptype a_instance" "" "class" "A" \
    {
	{ field  public "int a;" }
	{ field  public "int aa;" }
	{ method public "A();" }
	{ method public "int afoo();" }
	{ method public "int foo();" }
    }

# class D

gdb_test_multiple "print d_instance" "print value of d_instance" {
    -re "\\$\[0-9\]+ = \{<(class A|A)> = \{a = 1, aa = 2\}, <(class B|B)> = \{b = 3, bb = 4\}, <(class C|C)> = \{c = 5, cc = 6\}, d = 7, dd = 8\}$nl$gdb_prompt $" {
	pass "print value of d_instance"
    }
}

cp_test_ptype_class \
    "ptype d_instance" "" "class" "D" \
    {
	{ base          "private A" }
	{ base          "public B" }
	{ base          "protected C" }
	{ field  public "int d;" }
	{ field  public "int dd;" }
	{ method public "D();" }
	{ method public "int dfoo();" }
	{ method public "int foo();" }
    } \
    "" \
    {
	{ "protected C" "private C" { setup_xfail "*-*-*" "gcc/13539" } }
    }

# class E

gdb_test_multiple "print e_instance" "print value of e_instance" {
    -re "\\$\[0-9\]+ = \{<(class A|A)> = \{a = 1, aa = 2\}, <(class B|B)> = \{b = 3, bb = 4\}, <(class C|C)> = \{c = 5, cc = 6\}, e = 9, ee = 10\}$nl$gdb_prompt $" {
	pass "print value of e_instance"
    }
}

cp_test_ptype_class \
    "ptype e_instance" "" "class" "E" \
    {
	{ base          "public A" }
	{ base          "private B" }
	{ base          "protected C" }
	{ field  public "int e;" }
	{ field  public "int ee;" }
	{ method public "E();" }
	{ method public "int efoo();" }
	{ method public "int foo();" }
    } \
    "" \
    {
	{ "protected C" "private C" { setup_xfail "*-*-*" "gcc/13539" } }
    }

# class F

gdb_test_multiple "print f_instance" "print value of f_instance" {
    -re "\\$\[0-9\]+ = \{<(class A|A)> = \{a = 1, aa = 2\}, <(class B|B)> = \{b = 3, bb = 4\}, <(class C|C)> = \{c = 5, cc = 6\}, f = 11, ff = 12\}$nl$gdb_prompt $" {
	pass "print value of f_instance"
    }
}

cp_test_ptype_class \
    "ptype f_instance" "" "class" "F" \
    {
	{ base          "private A" }
	{ base          "public B" }
	{ base          "private C" }
	{ field  public "int f;" }
	{ field  public "int ff;" }
	{ method public "F();" }
	{ method public "int ffoo();" }
	{ method public "int foo();" }
    }

# Print individual fields.

gdb_test "print d_instance.a"  "\\$\[0-9\]+ = 1" "print value of d_instance.a"
gdb_test "print d_instance.aa" "\\$\[0-9\]+ = 2" "print value of d_instance.aa"
gdb_test "print d_instance.b"  "\\$\[0-9\]+ = 3" "print value of d_instance.b"
gdb_test "print d_instance.bb" "\\$\[0-9\]+ = 4" "print value of d_instance.bb"
gdb_test "print d_instance.c"  "\\$\[0-9\]+ = 5" "print value of d_instance.c"
gdb_test "print d_instance.cc" "\\$\[0-9\]+ = 6" "print value of d_instance.cc"
gdb_test "print d_instance.d"  "\\$\[0-9\]+ = 7" "print value of d_instance.d"
gdb_test "print d_instance.dd" "\\$\[0-9\]+ = 8" "print value of d_instance.dd"

# Print some fields which are defined in the top of class G
# and in its base classes.  This is not be ambiguous.

gdb_test "print g_instance.a"  "\\$\[0-9\]+ = 15" "print value of g_instance.a"
gdb_test "print g_instance.b"  "\\$\[0-9\]+ = 16" "print value of g_instance.b"
gdb_test "print g_instance.c"  "\\$\[0-9\]+ = 17" "print value of g_instance.c"

# Print a function call.

gdb_test "print g_instance.afoo()" "\\$\[0-9\]+ = 1" "print value of g_instance.afoo()"

# If GDB fails to restore the selected frame properly after the
# inferior function call above (see GDB PR 1155 for an explanation of
# why this might happen), all the subsequent tests will fail.  We
# should detect report that failure, but let the marker call finish so
# that the rest of the tests can run undisturbed.

gdb_test_multiple "frame" "re-selected 'main' frame after inferior call" {
    -re "#0  marker1.*$gdb_prompt $" {
        setup_kfail "gdb/1155" s390-*-linux-gnu
        fail "re-selected 'main' frame after inferior call"
        gdb_test "finish" ".*main.*at .*derivation.cc:.*// marker1-returns-here.*" \
            "finish call to marker1"
    }
    -re "#1  ($hex in )?main.*$gdb_prompt $" {
        pass "re-selected 'main' frame after inferior call"
    }
}

gdb_test "print g_instance.bfoo()" "\\$\[0-9\]+ = 2" "print value of g_instance.bfoo()"
gdb_test "print g_instance.cfoo()" "\\$\[0-9\]+ = 3" "print value of g_instance.cfoo()"
