# Copyright 1998-2004, 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/>.

# 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\]+"

# Start program.


if { [skip_cplus_tests] } { continue }

load_lib "cp-support.exp"

standard_testfile .cc

if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
    return -1
}

# 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()"
