# Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002
# 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.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Fred Fish. (fnf@cygnus.com)

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

# The format of a g++ virtual base pointer.
set vbptr "(_vb\[$.\]|__vb_)\[0-9\]?"

if $tracelevel then {
	strace $tracelevel
}

if { [skip_cplus_tests] } { continue }

# Note - create separate "inherit" executable from misc.cc

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


# Create and source the file that provides information about the compiler
# used to compile the test case.

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

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."
}

#
# Single inheritance, print individual members.
#

proc test_print_si_members {} {
    # Print all members of g_A using fully qualified form.

    gdb_test "print g_A.A::a" ".* = 1" "print g_A.A::a"

    gdb_test "print g_A.A::x" ".* = 2" "print g_A.A::x"

    # Print members of g_A using nonambiguous compact form.

    gdb_test "print g_A.a" ".* = 1" "print g_A.a"

    gdb_test "print g_A.x" ".* = 2" "print g_A.x"

    # Print all members of g_B using fully qualified form.

    gdb_test "print g_B.A::a" ".* = 3" "print g_B.A::a"

    gdb_test "print g_B.A::x" ".* = 4" "print g_B.A::x"

    gdb_test "print g_B.B::b" ".* = 5" "print g_B.B::b"

    gdb_test "print g_B.B::x" ".* = 6" "print g_B.B::x"

    # Print members of g_B using nonambiguous compact form.

    setup_xfail_format "DWARF 1"
    gdb_test "print g_B.a" ".* = 3" "print g_B.a"

    gdb_test "print g_B.b" ".* = 5" "print g_B.b"

    gdb_test "print g_B.x" ".* = 6" "print g_B.x"

    # Print all members of g_C using fully qualified form.

    gdb_test "print g_C.A::a" ".* = 7" "print g_C.A::a"

    gdb_test "print g_C.A::x" ".* = 8" "print g_C.A::x"

    gdb_test "print g_C.C::c" ".* = 9" "print g_C.C::c"

    gdb_test "print g_C.C::x" ".* = 10" "print g_C.C::x"

    # Print members of g_C using nonambiguous compact form.

    setup_xfail_format "DWARF 1"
    gdb_test "print g_C.a" ".* = 7" "print g_C.a"

    gdb_test "print g_C.c" ".* = 9" "print g_C.c"

    gdb_test "print g_C.x" ".* = 10" "print g_C.x"
}

#
# Single inheritance, print type definitions.
#

proc test_ptype_si {} {
    global gdb_prompt
    global ws
    global nl
    global hp_aCC_compiler

    # Print class A as a type.

    send_gdb "ptype A\n"
    gdb_expect {
	-re "type = class A \{$nl.*\[ \]*int a;$nl\[ \]*int x;$nl.*\[ \]*\}$nl$gdb_prompt $" {
	    pass "ptype A (FIXME)"
	}
	-re "type = struct A \{$nl\[ \]*int a;$nl\[ \]*int x;$nl\[ \]*\}$nl$gdb_prompt $" {
	    setup_xfail "*-*-*"
	    fail "ptype A (FIXME)"
	}
	-re ".*$gdb_prompt $" { fail "ptype A" }
	timeout { fail "ptype A (timeout)" ; return }
    }

    # Print class A as an explicit class.

    send_gdb "ptype class A\n"
    gdb_expect {
	-re "type = class A \{$nl.*\[ \]*int a;$nl\[ \]*int x;$nl.*\[ \]*\}$nl$gdb_prompt $" {
	    pass "ptype class A (FIXME)"
	}
	-re "type = struct A \{$nl\[ \]*int a;$nl\[ \]*int x;$nl\[ \]*\}$nl$gdb_prompt $" {
            if {!$hp_aCC_compiler} {setup_xfail "*-*-*"}
	    fail "ptype class A (FIXME)"
	}
	-re ".*$gdb_prompt $" { fail "ptype class A" }
	timeout { fail "ptype class A (timeout)" ; return }
    }

    # Print type of an object of type A.

    send_gdb "ptype g_A\n"
    gdb_expect {
	-re "type = class A \{$nl.*\[ \]*int a;$nl\[ \]*int x;$nl.*\[ \]*\}$nl$gdb_prompt $" {
	    pass "ptype g_A (FIXME)"
	}
	-re "type = struct A \{$nl\[ \]*int a;$nl\[ \]*int x;$nl\[ \]*\}$nl$gdb_prompt $" {
            if {!$hp_aCC_compiler} {setup_xfail "*-*-*"}
	    fail "ptype g_A (FIXME)"
	}
	-re ".*$gdb_prompt $" { fail "ptype g_A" }
	timeout { fail "ptype g_A (timeout)" ; return }
    }

    # Print class B as a type.

    setup_xfail_format "DWARF 1"
    gdb_test "ptype B" "type = class B : public A \{$nl\[ \]*public:$nl\[ \]*int b;$nl\[ \]*int x;$nl.*\}" "ptype B"

    # Print class B as an explicit class.

    setup_xfail_format "DWARF 1"
    gdb_test "ptype class B" "type = class B : public A \{$nl\[ \]*public:$nl\[ \]*int b;$nl\[ \]*int x;$nl.*\}" "ptype class B"

    # Print type of an object of type B.

    setup_xfail_format "DWARF 1"
    gdb_test "ptype g_B" "type = class B : public A \{$nl\[ \]*public:$nl\[ \]*int b;$nl\[ \]*int x;$nl.*\}" "ptype g_B"

    # Print class C as a type.

    setup_xfail_format "DWARF 1"
    gdb_test "ptype C" "type = class C : public A \{$nl\[ \]*public:$nl\[ \]*int c;$nl\[ \]*int x;$nl.*\}" "ptype C"

    # Print class C as an explicit class.

    setup_xfail_format "DWARF 1"
    gdb_test "ptype class C" "type = class C : public A \{$nl\[ \]*public:$nl\[ \]*int c;$nl\[ \]*int x;$nl.*\}" "ptype class C"

    # Print type of an object of type g_C.

    setup_xfail_format "DWARF 1"
    gdb_test "ptype g_C" "type = class C : public A \{$nl\[ \]*public:$nl\[ \]*int c;$nl\[ \]*int x;$nl.*\}" "ptype g_C"

    # gcc cygnus-2.3.3 (Q1) has this bug, but it was fixed as of
    # cygnus-2.3.3-930417.  PR 2819.
    send_gdb "ptype tagless_struct\n"
    gdb_expect {
	-re "type = class \{${ws}public:${ws}int one;${ws}int two;${ws}tagless_struct & operator=\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(\\);${ws}\}$nl$gdb_prompt $" {
	    pass "ptype tagless struct"
	}
	-re "type = class \{${ws}public:${ws}int one;${ws}int two;;${ws}\}$nl$gdb_prompt $" {
	    pass "ptype tagless struct"
	}
	-re "type = (struct|class).*\{.*int one;.*int two;.*\}$nl$gdb_prompt $" {
	    pass "ptype tagless struct (obsolete gcc or gdb)"
	}
	-re ".*$gdb_prompt $" {
	    fail "ptype tagless struct"
	}
	timeout {
	    fail "ptype tagless struct (timeout)"
	}
    }

    send_gdb "ptype v_tagless\n"
    gdb_expect {
	-re "type = class \{${ws}public:${ws}int one;${ws}int two;${ws}tagless_struct & operator=\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(tagless_struct (const ?)?&\\);${ws}tagless_struct\\(\\);${ws}\}$nl$gdb_prompt $" {
	    pass "ptype variable of type tagless struct"
	}
	-re "type = class \{${ws}public:${ws}int one;${ws}int two;;${ws}\}$nl$gdb_prompt $" {
	    pass "ptype tagless struct"
	}
	-re "type = (struct|class).*\{.*int one;.*int two;.*\}$nl$gdb_prompt $" {
	    pass "ptype variable of type tagless struct (obsolete gcc or gdb)"
	}
	-re ".*$gdb_prompt $" {
	    fail "ptype variable of type tagless struct"
	}
	timeout {
	    fail "ptype variable of type tagless struct (timeout)"
	}
    }
}

#
# Single inheritance, print complete classes.
#

proc test_print_si_classes {} {
    # Print all members of g_A.

    gdb_test "print g_A" ".* = \{a = 1, x = 2\}" "print g_A"

    # Print all members of g_B.

    setup_xfail_format "DWARF 1"
    gdb_test "print g_B" ".* = \{\<(class |)A\> = \{a = 3, x = 4\}, b = 5, x = 6\}" "print g_B"

    # Print all members of g_C.

    setup_xfail_format "DWARF 1"
    gdb_test "print g_C" ".* = \{\<(class |)A\> = \{a = 7, x = 8\}, c = 9, x = 10\}" "print g_C"
}

#
# Single inheritance, print anonymous unions.
# GDB versions prior to 4.14 entered an infinite loop when printing
# the type of a class containing an anonymous union, and they were also
# incapable of printing the member of an anonymous union.
# We test the printing of the member first, and perform the other tests
# only if the test succeeds, to avoid the infinite loop.
#

proc test_print_anon_union {} {
    global gdb_prompt
    global ws
    global nl

    setup_xfail_format "DWARF 1"
    gdb_test "print g_anon_union.a" ".* = 2" "print anonymous union member"
    setup_xfail_format "DWARF 1"
    send_gdb "print g_anon_union\n"
    gdb_expect {
	-re ".* = \{one = 1, ( = |)\{a = 2, b = 2\}\}$nl$gdb_prompt $" {
	    pass "print variable of type anonymous union"
	}
	-re ".* = .*\{one = 1, ( = |)\{a = 2, b = .*\}\}$nl$gdb_prompt $" {
	    pass "print variable of type anonymous union (obsolete gcc or gdb)"
	}
	-re ".*$nl$gdb_prompt $" {
	    fail "print variable of type anonymous union"
	}
	timeout {
	    fail "print variableof type anonymous union (timeout)"
	}
    }
    setup_xfail_format "DWARF 1"
    send_gdb "ptype g_anon_union\n"
    gdb_expect {
	-re "type = class class_with_anon_union \{${ws}public:${ws}int one;${ws}union \{${ws}public:${ws}int a;${ws}long int b;${ws}union \{\.\.\.\} & operator=\\(union \{\.\.\.\} &\\);${ws}\\\$_0 \\(union \{\.\.\.\} &\\);${ws}\\\$_0 \\(\\);${ws}\};${ws}class_with_anon_union & operator=\\(class_with_anon_union const &\\);${ws}class_with_anon_union\\(class_with_anon_union const &\\);${ws}class_with_anon_union\\(void\\);${ws}\}$nl$gdb_prompt $" {
	    pass "print type of anonymous union"
	}
	-re "type = class class_with_anon_union \{${ws}public:${ws}int one;${ws}union \{${ws}int a;${ws}long int b;${ws}\};${ws}class_with_anon_union & operator=\\(class_with_anon_union const ?&\\);${ws}class_with_anon_union\\(class_with_anon_union const ?&\\);${ws}class_with_anon_union\\((void|)\\);${ws}\}$nl$gdb_prompt $" {
	    pass "print type of anonymous union"
	}
	-re "type = class class_with_anon_union \{${ws}public:${ws}int one;${ws}union \{${ws}int a;${ws}long int b;${ws}\};${ws}\}$nl$gdb_prompt $" {
	    pass "print type of anonymous union"
	}
	-re "type = (struct|class).*\{.*int one;.*union \{.*int a;.*(long|long int|int) b;.*\};.*\}$nl$gdb_prompt $" {
	    pass "print type of anonymous union (obsolete gcc or gdb)"
	}
	-re ".*$nl$gdb_prompt $" {
	    fail "print type of anonymous union"
	}
	timeout {
	    fail "print type of anonymous union (timeout)"
	}
    }
}

#
# Multiple inheritance, print individual members.
#

proc test_print_mi_members {} {
    global gdb_prompt
    global nl
    global hp_aCC_compiler

    # Print all members of g_A.

    gdb_test "print g_A.A::a" ".* = 1" "print g_A.A::a"
    
    gdb_test "print g_A.A::x" ".* = 2" "print g_A.A::x"

    # Print all members of g_B.

    gdb_test "print g_B.A::a" ".* = 3" "print g_B.A::a"

    gdb_test "print g_B.A::x" ".* = 4" "print g_B.A::x"

    gdb_test "print g_B.B::b" ".* = 5" "print g_B.B::b"

    gdb_test "print g_B.B::x" ".* = 6" "print g_B.B::x"

    # Print all members of g_C.

    gdb_test "print g_C.A::a" ".* = 7" "print g_C.A::a"

    gdb_test "print g_C.A::x" ".* = 8" "print g_C.A::x"

    gdb_test "print g_C.C::c" ".* = 9" "print g_C.C::c"

    gdb_test "print g_C.C::x" ".* = 10" "print g_C.C::x"

    # Print all members of g_D.

    # The following is ambiguous, and gdb should detect this.
    # For now, accept gdb's behavior as an expected failure if it
    # simply prints either member correctly.

    if {!$hp_aCC_compiler} {setup_xfail "*-*-*"}
    send_gdb "print g_D.A::a\n"
    gdb_expect {	
	-re "warning: A ambiguous; using D::C::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 15$nl$gdb_prompt $" {
	    pass "print g_D.A::a"
	}
	-re "warning: A ambiguous; using D::B::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 11$nl$gdb_prompt $" {
	    pass "print g_D.A::a (using B)"
	}
	-re ".* = 15$nl$gdb_prompt $" {
	    fail "print g_D.A::a (FIXME)"
	}
	-re ".* = 11$nl$gdb_prompt $" {
	    fail "print g_D.A::a (FIXME)"
	}
	-re ".*$gdb_prompt $" { fail "print g_D.A::a" }
	timeout { fail "print g_D.A::a (timeout)" ; return }
    }

    # The following is ambiguous, and gdb should detect this.
    # For now, accept gdb's behavior as an expected failure if it
    # simply prints either member correctly.

    if {!$hp_aCC_compiler} {setup_xfail "*-*-*"}
    send_gdb "print g_D.A::x\n"
    gdb_expect {
	-re "warning: A ambiguous; using D::C::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 16$nl$gdb_prompt $" {
	    pass "print g_D.A::x"
	}
	-re "warning: A ambiguous; using D::B::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 12$nl$gdb_prompt $" {
	    pass "print g_D.A::x (using B)"
	}
	-re ".* = 16$nl$gdb_prompt $" {
	    fail "print g_D.A::x (FIXME)"
	}
	-re ".* = 12$nl$gdb_prompt $" {
	    fail "print g_D.A::x (FIXME)"
	}
	-re ".*$gdb_prompt $" { fail "print g_D.A::x" }
	timeout { fail "print g_D.A::x (timeout)" ; return }
    }

    gdb_test "print g_D.B::b" ".* = 13" "print g_D.B::b"

    gdb_test "print g_D.B::x" ".* = 14" "print g_D.B::x"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_D.C::c" ".* = 17" "print g_D.C::c"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_D.C::x" ".* = 18" "print g_D.C::x"

    gdb_test "print g_D.D::d" ".* = 19" "print g_D.D::d"

    gdb_test "print g_D.D::x" ".* = 20" "print g_D.D::x"

    # Print all members of g_E.

    # The following is ambiguous, and gdb should detect this.
    # For now, accept gdb's behavior as an expected failure if it
    # simply prints either member correctly.

    setup_xfail "*-*-*"
    send_gdb "print g_E.A::a\n"
    gdb_expect {
	-re ".* = 21$nl$gdb_prompt $" {
	    fail "print g_E.A::a (FIXME)"
	}
	-re ".* = 25$nl$gdb_prompt $" {
	    fail "print g_E.A::a (FIXME)"
	}
	-re ".*$gdb_prompt $" { fail "print g_E.A::a" }
	timeout { fail "print g_E.A::a (timeout)" ; return }
    }

    # The following is ambiguous, and gdb should detect this.
    # For now, accept gdb's behavior as an expected failure if it
    # simply prints either member correctly.

    if {!$hp_aCC_compiler} {setup_xfail "*-*-*"}
    send_gdb "print g_E.A::x\n"
    gdb_expect {
	-re "warning: A ambiguous; using E::D::C::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 26$nl$gdb_prompt $" {
	    pass "print g_E.A::x"
	}
	-re "warning: A ambiguous; using E::D::B::A. Use a cast to disambiguate.$nl\\$\[0-9\]* = 22$nl$gdb_prompt $" {
	    pass "print g_E.A::x (using B)"
	}
	-re ".* = 26$nl$gdb_prompt $" {
	    fail "print g_E.A::x (FIXME)"
	}
	-re ".* = 22$nl$gdb_prompt $" {
	    fail "print g_E.A::x (FIXME)"
	}
	-re ".*$gdb_prompt $" { fail "print g_E.A::x" }
	timeout { fail "print g_E.A::x (timeout)" ; return }
    }

    gdb_test "print g_E.B::b" ".* = 23" "print g_E.B::b"

    gdb_test "print g_E.B::x" ".* = 24" "print g_E.B::x"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_E.C::c" ".* = 27" "print g_E.C::c"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_E.C::x" ".* = 28" "print g_E.C::x"

    gdb_test "print g_E.D::d" ".* = 29" "print g_E.D::d"

    gdb_test "print g_E.D::x" ".* = 30" "print g_E.D::x"

    gdb_test "print g_E.E::e" ".* = 31" "print g_E.E::e"

    gdb_test "print g_E.E::x" ".* = 32" "print g_E.E::x"
}

#
# Multiple inheritance, print type definitions.
#

proc test_ptype_mi {} {
    global nl

    setup_xfail_format "DWARF 1"
    gdb_test "ptype D" "type = class D : public B, public C \{$nl\[ \]*public:$nl\[ \]*int d;$nl\[ \]*int x;$nl.*\}" "ptype D"

    setup_xfail_format "DWARF 1"
    gdb_test "ptype class D" "type = class D : public B, public C \{$nl\[ \]*public:$nl\[ \]*int d;$nl\[ \]*int x;$nl.*\}" "ptype class D"

    setup_xfail_format "DWARF 1"
    gdb_test "ptype g_D" "type = class D : public B, public C \{$nl\[ \]*public:$nl\[ \]*int d;$nl\[ \]*int x;$nl.*\}" "ptype g_D"

    setup_xfail_format "DWARF 1"
    gdb_test "ptype E" "type = class E : public D \{$nl\[ \]*public:$nl\[ \]*int e;$nl\[ \]*int x;$nl.*\}" "ptype E"

    setup_xfail_format "DWARF 1"
    gdb_test "ptype class E" "type = class E : public D \{$nl\[ \]*public:$nl\[ \]*int e;$nl\[ \]*int x;$nl.*\}" "ptype class E"

    setup_xfail_format "DWARF 1"
    gdb_test "ptype g_E" "type = class E : public D \{$nl\[ \]*public:$nl\[ \]*int e;$nl\[ \]*int x;$nl.*\}" "ptype g_E"
}

#
# Multiple inheritance, print complete classes.
#

proc test_print_mi_classes {} {
    # Print all members of g_D.

    setup_xfail_format "DWARF 1"
    gdb_test "print g_D" ".* = \{\<(class |)B\> = \{\<(class |)A\> = \{a = 11, x = 12\}, b = 13, x = 14\}, \<(class |)C\> = \{\<(class |)A\> = \{a = 15, x = 16\}, c = 17, x = 18\}, d = 19, x = 20\}" "print g_D"

    # Print all members of g_E.

    setup_xfail_format "DWARF 1"
    gdb_test "print g_E" ".* = \{\<(class |)D\> = \{\<(class |)B\> = \{\<(class |)A\> = \{a = 21, x = 22\}, b = 23, x = 24\}, \<(class |)C\> = \{\<(class |)A\> = \{a = 25, x = 26\}, c = 27, x = 28\}, d = 29, x = 30\}, e = 31, x = 32\}" "print g_E"
}

#
# Single virtual inheritance, print individual members.
#

proc test_print_svi_members {} {
    global gdb_prompt
    global decimal
    global nl

    # Print all members of g_vA.

    gdb_test "print g_vA.vA::va" ".* = 1" "print g_vA.vA::va"

    gdb_test "print g_vA.vA::vx" ".* = 2" "print g_vA.vA::vx"

    # Print members of g_vA using compact form.

    gdb_test "print g_vA.va" ".* = 1" "print g_vA.va"

    gdb_test "print g_vA.vx" ".* = 2" "print g_vA.vx"

    # Print all members of g_vB.

    setup_xfail_format "DWARF 1"
    send_gdb "print g_vB.vA::va\n"
    gdb_expect {
	-re ".* = 3$nl$gdb_prompt $" { pass "print g_vB.vA::va" }
	-re ".*virtual baseclass botch.*$gdb_prompt $" {
	    # Does not happen with gcc cygnus-2.4.5-930828
	    fail "print g_vB.vA::va (known bug with gcc cygnus-2.4.5-930417)"
	    # Many of the rest of these tests have the same problem.
	    return 0
	}
	-re ".*$gdb_prompt $" { fail "print g_vB.vA::va" }
	timeout { fail "print g_vB.vA::va (timeout)" ; return }
    }

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vB.vA::vx" ".* = 4" "print g_vB.vA::vx"

    gdb_test "print g_vB.vB::vb" ".* = 5" "print g_vB.vB::vb"

    gdb_test "print g_vB.vB::vx" ".* = 6" "print g_vB.vB::vx"

    # Print members of g_vB using compact form.

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vB.va" ".* = 3" "print g_vB.va"

    gdb_test "print g_vB.vb" ".* = 5" "print g_vB.vb"

    gdb_test "print g_vB.vx" ".* = 6" "print g_vB.vx"

    # Print all members of g_vC.

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vC.vA::va" ".* = 7" "print g_vC.vA::va"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vC.vA::vx" ".* = 8" "print g_vC.vA::vx"

    gdb_test "print g_vC.vC::vc" ".* = 9" "print g_vC.vC::vc"

    gdb_test "print g_vC.vC::vx" ".* = 10" "print g_vC.vC::vx"

    # Print members of g_vC using compact form.

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vC.va" ".* = 7" "print g_vC.va"

    gdb_test "print g_vC.vc" ".* = 9" "print g_vC.vc"

    gdb_test "print g_vC.vx" ".* = 10" "print g_vC.vx"
}

#
# Single virtual inheritance, print type definitions.
#

proc test_ptype_vi {} {
    global gdb_prompt
    global ws
    global nl
    global vbptr

    # This class does not use any C++-specific features, so it's fine for
    # it to print as "struct".
    send_gdb "ptype vA\n"
    gdb_expect {
	-re "type = class vA \{$nl\[ \]*public:$nl\[ \]*int va;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
	    pass "ptype vA"
	}
	-re "type = struct vA \{$nl\[ \]*int va;$nl\[ \]*int vx;$nl\}$nl$gdb_prompt $" {
	    pass "ptype vA"
	}
	-re ".*$gdb_prompt $" { fail "ptype vA" }
	timeout { fail "ptype vA (timeout)" ; return }
    }

    # This class does not use any C++-specific features, so it's fine for
    # it to print as "struct".
    send_gdb "ptype class vA\n"
    gdb_expect {
	-re "type = class vA \{$nl\[ \]*public:$nl\[ \]*int va;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
	    pass "ptype class vA"
	}
	-re "type = struct vA \{$nl\[ \]*int va;$nl\[ \]*int vx;$nl\}$nl$gdb_prompt $" {
	    pass "ptype class vA"
	}
	-re ".*$gdb_prompt $" { fail "ptype class vA" }
	timeout { fail "ptype class vA (timeout)" ; return }
    }

    # This class does not use any C++-specific features, so it's fine for
    # it to print as "struct".
    send_gdb "ptype g_vA\n"
    gdb_expect {
	-re "type = class vA \{$nl\[ \]*public:$nl\[ \]*int va;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
	    pass "ptype g_vA"
	}
	-re "type = struct vA \{$nl\[ \]*int va;$nl\[ \]*int vx;$nl\}$nl$gdb_prompt $" {
	    pass "ptype g_vA"
	}
	-re ".*$gdb_prompt $" { fail "ptype g_vA" }
	timeout { fail "ptype g_vA (timeout)" ; return }
    }

    setup_xfail_format "DWARF 1"
    send_gdb "ptype vB\n"
    gdb_expect {
	-re "ptype vB${nl}type = class vB : public virtual vA \{$nl  private:${ws}vA \\*${vbptr}vA;$nl  public:${ws}int vb;${ws}int vx;$nl.*\}$nl$gdb_prompt $" {
	    pass "ptype vB"
	}
	-re "ptype vB${nl}type = class vB : public virtual vA \{$nl  public:${ws}int vb;${ws}int vx;$nl.*\}$nl$gdb_prompt $" {
	    pass "ptype vB (aCC)"
	}
	-re ".*$gdb_prompt $" { fail "ptype vB" }
	timeout { fail "ptype vB (timeout)" }
    }

    setup_xfail_format "DWARF 1"
    send_gdb "ptype class vB\n"
    gdb_expect {
	-re "type = class vB : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
	    pass "ptype class vB"
	}
	-re "type = class vB : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
	    pass "ptype class vB (aCC)"
	}
	-re ".*$gdb_prompt $" { fail "ptype class vB" }
	timeout { fail "ptype class vB (timeout)" }
    }

    setup_xfail_format "DWARF 1"
    send_gdb "ptype g_vB\n"
    gdb_expect {
	-re "type = class vB : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
	    pass "ptype g_vB"
	}
	-re "type = class vB : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vb;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
	    pass "ptype g_vB (aCC)"
	}
	-re ".*$gdb_prompt $" { fail "ptype g_vB" }
	timeout { fail "ptype g_vB (timeout)" }
    }

    setup_xfail_format "DWARF 1"
    send_gdb "ptype vC\n"
    gdb_expect {
	-re "type = class vC : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
            pass "ptype vC"
	}
	-re "type = class vC : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
            pass "ptype vC (aCC)"
	}
	-re ".*$gdb_prompt $" { fail "ptype vC" }
	timeout { fail "ptype vC (timeout)" }
    }

    setup_xfail_format "DWARF 1"
    send_gdb "ptype class vC\n"
    gdb_expect {
	-re "type = class vC : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
            pass "ptype class vC"
	}
	-re "type = class vC : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
            pass "ptype class vC (aCC)"
	}
	-re ".*$gdb_prompt $" { fail "ptype class vC" }
	timeout { fail "ptype class vC (timeout)" }
    }

    setup_xfail_format "DWARF 1"
    send_gdb "ptype g_vC\n"
    gdb_expect {
	-re "type = class vC : public virtual vA \{$nl\[ \]*private:$nl\[ \]*vA \\*${vbptr}vA;$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
            pass "ptype g_vC"
	}
	-re "type = class vC : public virtual vA \{$nl\[ \]*public:$nl\[ \]*int vc;$nl\[ \]*int vx;$nl.*\}$nl$gdb_prompt $" {
            pass "ptype g_vC (aCC)"
	}
	-re ".*$gdb_prompt $" { fail "ptype g_vC" }
	timeout { fail "ptype g_vC (timeout)" }
    }
}

#
# Single virtual inheritance, print complete classes.
#

proc test_print_svi_classes {} {
    global gdb_prompt
    global hex
    global decimal
    global nl
    global vbptr

    # Print all members of g_vA.

    gdb_test "print g_vA" ".* = \{va = 1, vx = 2\}" "print g_vA"

    # Print all members of g_vB.

    setup_xfail_format "DWARF 1"
    send_gdb "print g_vB\n"
    gdb_expect {
	-re ".* = \{\<class vA\> = \{va = 3, vx = 4\}, vb = 5, vx = 6, Virtual table at $hex\}$nl$gdb_prompt $" {
           pass "print g_vB (aCC)"
	}
	-re ".* = \{\<class vA\> = \{va = 3, vx = 4\}, vb = 5, vx = 6, __vfp = $hex\}$nl$gdb_prompt $" {
	    pass "print g_vB (aCC)"
	}
	-re ".* = \{\<vA\> = \{va = 3, vx = 4\}, ${vbptr}vA = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" {
	    pass "print g_vB"
	}
	-re ".* = \{\<vA\> = \{va = 3, vx = 4\}, _vptr.vB = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" {
	    pass "print g_vB (FIXME v3 vtbl ptr)"
	}
	-re ".*invalid address 0x0.*$gdb_prompt $" {
	    # Does not happen with gcc cygnus-2.4.5-930828
	    fail "print g_vB (known bug with gcc cygnus-2.4.5-930417)"
	    # Many of the rest of these tests have the same problem.
	    return 0
	}
	-re ".*$gdb_prompt $" { fail "print g_vB" }
	timeout { fail "print g_vB (timeout)" ; return }
    }

    # Print all members of g_vC.

    setup_xfail_format "DWARF 1"
    send_gdb "print g_vC\n"
    gdb_expect {
	-re ".* = \{\<class vA\> = \{va = 7, vx = 8\}, vc = 9, vx = 10, Virtual table at $hex\}$nl$gdb_prompt $" {
	    pass "print g_vC (aCC)"
	}
	-re ".* = \{\<class vA\> = \{va = 7, vx = 8\}, vc = 9, vx = 10, __vfp = $hex\}$nl$gdb_prompt $" {
	    pass "print g_vC (aCC)"
	}
	-re ".* = \{\<vA\> = \{va = 7, vx = 8\}, ${vbptr}vA = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" {
	    pass "print g_vC"
	}
	-re ".* = \{\<vA\> = \{va = 7, vx = 8\}, _vptr.vC = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" {
	    pass "print g_vC (FIXME v3 vtbl ptr)"
	}
	-re ".*$gdb_prompt $" { fail "print g_vC" }
	timeout { fail "print g_vC (timeout)" }
    }
}

#
# Multiple virtual inheritance, print individual members.
#

proc test_print_mvi_members {} {
    global gdb_prompt
    global decimal
    global nl

    # Print all members of g_vD.

    setup_xfail_format "DWARF 1"
    send_gdb "print g_vD.vA::va\n"
    gdb_expect {
	-re ".* = 19$nl$gdb_prompt $" { pass "print g_vD.vA::va" }
	-re ".*virtual baseclass botch.*$gdb_prompt $" {
	    # Does not happen with gcc cygnus-2.4.5-930828
	    fail "print g_vD.vA::va (known bug with gcc cygnus-2.4.5-930417)"
	    # Many of the rest of these tests have the same problem.
	    return 0
	}
	-re ".*$gdb_prompt $" { fail "print g_vD.vA::va" }
	timeout { fail "print g_vD.vA::va (timeout)" ; return }
    }

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vD.vA::vx" ".* = 20" "print g_vD.vA::vx"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vD.vB::vb" ".* = 21" "print g_vD.vB::vb"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vD.vB::vx" ".* = 22" "print g_vD.vB::vx"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vD.vC::vc" ".* = 23" "print g_vD.vC::vc"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vD.vC::vx" ".* = 24" "print g_vD.vC::vx"

    gdb_test "print g_vD.vD::vd" ".* = 25" "print g_vD.vD::vd"

    gdb_test "print g_vD.vD::vx" ".* = 26" "print g_vD.vD::vx"

    # Print all members of g_vE.

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vE.vA::va" ".* = 0" "print g_vE.vA::va"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vE.vA::vx" ".* = 0" "print g_vE.vA::vx"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vE.vB::vb" ".* = 0" "print g_vE.vB::vb"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vE.vB::vx" ".* = 0" "print g_vE.vB::vx"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vE.vC::vc" ".* = 0" "print g_vE.vC::vc"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vE.vC::vx" ".* = 0" "print g_vE.vC::vx"

    setup_xfail_format "DWARF 1"
    gdb_test "print g_vE.vD::vd" ".* = 0" "print g_vE.vD::vd"

    gdb_test "print g_vE.vD::vx" ".* = 0" "print g_vE.vD::vx"

    gdb_test "print g_vE.vE::ve" ".* = 27" "print g_vE.vE::ve"

    gdb_test "print g_vE.vE::vx" ".* = 28" "print g_vE.vE::vx"
}

#
# Multiple virtual inheritance, print type definitions.
#

proc test_ptype_mvi {} {
    global gdb_prompt
    global ws
    global nl
    global vbptr

    setup_xfail_format "DWARF 1"
    send_gdb "ptype vD\n"
    gdb_expect {
	-re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*${vbptr}vC;${ws}vB \\*${vbptr}vB;${ws}public:${ws}int vd;${ws}int vx;$nl.*\}.*$gdb_prompt $" {
	    pass "ptype vD"
	}
        -re ".*class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;.*\}.*$gdb_prompt $" {
	    pass "ptype vD"
	}
	-re ".*$gdb_prompt $" { fail "ptype vD" }
	timeout { fail "(timeout) ptype vD" }
    }

    setup_xfail_format "DWARF 1"
    send_gdb "ptype class vD\n"
    gdb_expect {
	-re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*${vbptr}vC;${ws}vB \\*${vbptr}vB;${ws}public:${ws}int vd;${ws}int vx;$nl.*\}.*$gdb_prompt $" {
	    pass "ptype class vD"
	}
	-re ".*class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;.*\}.*$gdb_prompt $" {
	    pass "ptype class vD"
	}
	-re ".*$gdb_prompt $" { fail "ptype class vD" }
	timeout { fail "(timeout) ptype class vD" }
    }

    setup_xfail_format "DWARF 1"
    send_gdb "ptype g_vD\n"
    gdb_expect {
	-re "type = class vD : public virtual vB, public virtual vC \{${ws}private:${ws}vC \\*${vbptr}vC;${ws}vB \\*${vbptr}vB;${ws}public:${ws}int vd;${ws}int vx;$nl.*\}.*$gdb_prompt $" {
	    pass "ptype g_vD"
	}
	-re ".*class vD : public virtual vB, public virtual vC \{${ws}public:${ws}int vd;${ws}int vx;\r\n.*\}.*$gdb_prompt $" {
	    pass "ptype g_vD"
	}
	-re ".*$gdb_prompt $" { fail "ptype g_vD" }
	timeout { fail "(timeout) ptype g_vD" }
    }

    setup_xfail_format "DWARF 1"
    send_gdb "ptype vE\n"
    gdb_expect {
	-re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*${vbptr}vD;${ws}public:${ws}int ve;${ws}int vx;$nl.*\}.*$gdb_prompt $" {
	    pass "ptype vE"
	}
	-re ".*class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;\r\n.*\}.*$gdb_prompt $" {
	    pass "ptype vE"
	}
	-re ".*$gdb_prompt $" { fail "ptype vE" }
	timeout { fail "(timeout) ptype vE" }
    }

    setup_xfail_format "DWARF 1"
    send_gdb "ptype class vE\n"
    gdb_expect {
	-re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*${vbptr}vD;${ws}public:${ws}int ve;${ws}int vx;$nl.*\}.*$gdb_prompt $" {
	    pass "ptype class vE"
	}
	-re "type = class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;\r\n.*\}.*$gdb_prompt $" {
	    pass "ptype class vE"
	}
	-re ".*$gdb_prompt $" { fail "ptype class vE" }
	timeout { fail "(timeout) ptype class vE" }
    }

    setup_xfail_format "DWARF 1"
    send_gdb "ptype g_vE\n"
    gdb_expect {
	-re "type = class vE : public virtual vD \{${ws}private:${ws}vD \\*${vbptr}vD;${ws}public:${ws}int ve;${ws}int vx;$nl.*\}.*$gdb_prompt $" {
	    pass "ptype g_vE"
	}
	-re "type = class vE : public virtual vD \{${ws}public:${ws}int ve;${ws}int vx;\r\n.*\}.*$gdb_prompt $" {
	    pass "ptype g_vE"
	}
	-re ".*$gdb_prompt $" { fail "ptype g_vE" }
	timeout { fail "(timeout) ptype g_vE" }
    }
}

#
# Multiple virtual inheritance, print complete classes.
#

proc test_print_mvi_classes {} {
    global gdb_prompt
    global hex
    global decimal
    global nl
    global vbptr

    # Print all members of g_vD.

    setup_xfail_format "DWARF 1"
    send_gdb "print g_vD\n"
    gdb_expect {
	-re ".* = \{\<class vB\> = \{\<class vA\> = \{va = 19, vx = 20\}, vb = 21, vx = 22, Virtual table at $hex\}, \<class vC\> = \{vc = 23, vx = 24, Virtual table at $hex\}, vd = 25, vx = 26, Virtual table at $hex\}$nl$gdb_prompt $" {
	    pass "print g_vD (aCC)"
	}
	-re ".* = \{\<class vB\> = \{\<class vA\> = \{va = 19, vx = 20\}, vb = 21, vx = 22, __vfp = $hex\}, \<class vC\> = \{vc = 23, vx = 24, __vfp = $hex\}, vd = 25, vx = 26, __vfp = $hex\}$nl$gdb_prompt $" {
	    pass "print g_vD (aCC)"
	}
	-re ".* = \{\<vB\> = \{\<vA\> = \{va = 19, vx = 20\}, ${vbptr}vA = $hex, vb = 21, vx = 22\}, \<vC\> = \{${vbptr}vA = $hex, vc = 23, vx = 24\}, ${vbptr}vC = $hex, ${vbptr}vB = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" {
	    pass "print g_vD"
	}
	-re ".* = \{\<vB\> = \{\<vA\> = \{va = 19, vx = 20\}, _vptr.vB = $hex, vb = 21, vx = 22\}, \<vC\> = \{_vptr.vC = $hex, vc = 23, vx = 24\}, _vptr.vD = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" {
	    pass "print g_vD (FIXME v3 vtbl ptr)"
	}
	-re ".*invalid address 0x0.*$gdb_prompt $" {
	    # Does not happen with gcc cygnus-2.4.5-930828
	    fail "print g_vD (known bug with gcc cygnus-2.4.5-930417)"
	    # Many of the rest of these tests have the same problem.
	    return 0
	}
	-re ".*$gdb_prompt $" { fail "print g_vD" }
	timeout { fail "print g_vD (timeout)" ; return }
    }

    # Print all members of g_vE.

    setup_xfail_format "DWARF 1"
    send_gdb "print g_vE\n"
    gdb_expect {
	-re ".* = \{\<class vD\> = \{\<class vB\> = \{\<class vA\> = \{va = 0, vx = 0\}, vb = 0, vx = 0, Virtual table at $hex\}, \<class vC\> = \{vc = 0, vx = 0, Virtual table at $hex\}, vd = 0, vx = 0, Virtual table at $hex\}, ve = 27, vx = 28, Virtual table at $hex\}$nl$gdb_prompt $" {
	    pass "print g_vE (aCC)"
	}
	-re ".* = \{\<class vD\> = \{\<class vB\> = \{\<class vA\> = \{va = 0, vx = 0\}, vb = 0, vx = 0, __vfp = $hex\}, \<class vC\> = \{vc = 0, vx = 0, __vfp = $hex\}, vd = 0, vx = 0, __vfp = $hex\}, ve = 27, vx = 28, __vfp = $hex\}$nl$gdb_prompt $" {
	    pass "print g_vE (aCC)"
	}
	-re ".* = \{\<vD\> = \{\<vB\> = \{\<vA\> = \{va = 0, vx = 0\}, ${vbptr}vA = $hex, vb = 0, vx = 0\}, \<vC\> = \{${vbptr}vA = $hex, vc = 0, vx = 0\}, ${vbptr}vC = $hex, ${vbptr}vB = $hex, vd = 0, vx = 0\}, ${vbptr}vD = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" {
	    pass "print g_vE"
	}
	-re ".* = \{\<vD\> = \{\<vB\> = \{\<vA\> = \{va = 0, vx = 0\}, _vptr.vB = $hex *(\<VTT for vD\>)?, vb = 0, vx = 0\}, \<vC\> = \{_vptr.vC = $hex *(\<VTT for vD\>)?, vc = 0, vx = 0\}, _vptr.vD = $hex, vd = 0, vx = 0\}, _vptr.vE = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" {
	    pass "print g_vE (FIXME v3 vtbl ptr)"
	}
	-re ".*$gdb_prompt $" { fail "print g_vE" }
	timeout { fail "print g_vE (timeout)" }
    }
}

proc do_tests {} {
    global prms_id
    global bug_id
    global subdir
    global objdir
    global srcdir
    global binfile

    set prms_id 0
    set bug_id 0

    # Start with a fresh gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $binfile

    gdb_test "set language c++" ""
    gdb_test "set width 0" ""

    # Get the debug format for the compiled test case.

    if { ![ runto_main] } {
	gdb_suppress_tests;
    } else {
	get_debug_format
    }

    test_ptype_si
    test_ptype_mi
    test_ptype_vi
    test_ptype_mvi

    gdb_stop_suppressing_tests;
    
    if { ![ runto 'inheritance2' ] } {
	gdb_suppress_tests;
    }

    test_print_si_members
    test_print_si_classes
    test_print_mi_members
    test_print_mi_classes
    test_print_anon_union

    gdb_stop_suppressing_tests;

    if { ![ runto 'inheritance4' ] } {
	gdb_suppress_tests;
    }

    test_print_svi_members
    test_print_svi_classes
    test_print_mvi_members
    test_print_mvi_classes
}

do_tests
