# Copyright 1992-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/>.

# This file was written by Fred Fish. (fnf@cygnus.com)
# And rewritten by Michael Chastain. (mec.gnu@mindspring.com)

set ws  "\[\r\n\t \]+"
set nl  "\[\r\n\]+"
set vhn "\\$\[0-9\]+"

if { [skip_cplus_tests] } { continue }

load_lib "cp-support.exp"

standard_testfile misc.cc

if {[prepare_for_testing "failed to prepare" $testfile $srcfile  {debug c++}]} {
    return -1
}

# Single inheritance, print type definitions.

proc test_ptype_si { } {
    global gdb_prompt
    global ws
    global nl

    # A simple class.

    cp_test_ptype_class \
	"A" "ptype A (FIXME)" "class" "A" \
	{
	    { field public "int a;" }
	    { field public "int x;" }
	}
    cp_test_ptype_class "class A" "ptype class A (FIXME)" "class" "A" ibid
    cp_test_ptype_class "g_A" "ptype g_A (FIXME)" "class" "A" ibid

    # A derived class.

    cp_test_ptype_class \
	"B" "" "class" "B" \
	{
	    { base         "public A" }
	    { field public "int b;" }
	    { field public "int x;" }
	}
    cp_test_ptype_class "class B" "" "class" "B" ibid
    cp_test_ptype_class "g_B" "" "class" "B" ibid

    # Another derived class.

    cp_test_ptype_class \
	"C" "" "class" "C" \
	{
	    { base         "public A" }
	    { field public "int c;" }
	    { field public "int x;" }
	}
    cp_test_ptype_class "class C" "" "class" "C" ibid
    cp_test_ptype_class "g_C" "" "class" "C" ibid

    # A structure with no tag.
    # TODO: move this mess into a separate file, and re-specify
    # which results are PASS, KFAIL, XFAIL, and FAIL.

    set re_tag		"tagless_struct"
    set XX_tag		"\\._1"
    set re_class	"(class $re_tag \{${ws}public:|class \{${ws}public:|struct $re_tag \{|struct \{)"
    set XX_class	"(class $XX_tag \{${ws}public:|struct $XX_tag \{)"
    set re_fields	"int one;${ws}int two;"
    set re_synth_gcc_23	"$re_tag & operator=\\($re_tag const ?&\\);${ws}$re_tag\\($re_tag const ?&\\);${ws}$re_tag\\((void|)\\);"
    set XX_synth_gcc_23	"($re_tag|$XX_tag) & operator=\\($XX_tag const ?&\\);${ws}$XX_tag\\($XX_tag const ?&\\);${ws}$XX_tag\\((void|)\\);"

    set name "ptype tagless struct"
    gdb_test_multiple "ptype tagless_struct" $name {
	-re "type = $XX_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
	    # gcc 2.95.3 -gdwarf-2
	    pass "$name"
	}
	-re "type = $re_class${ws}$re_fields${ws}$XX_synth_gcc_23$nl\}$nl$gdb_prompt $" {
	    # gcc 2.95.3 -gstabs+
	    pass "$name"
	}
	-re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
	    # gcc 3.3.4 -gdwarf-2
	    # gcc 3.4.1 -gdwarf-2
	    # gcc HEAD 2004-07-31 -gdwarf-2
	    # gcc HEAD 2004-07-31 -gstabs+
	    pass "$name"
	}
	-re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
	    # gcc 3.3.4 -gstabs+
	    # gcc 3.4.1 -gstabs+
	    pass "$name"
	}
	-re "No symbol \"tagless_struct\" in current context.$nl$gdb_prompt $" {
	    # Several GCC 4.x versions provide neither a DW_TAG_typedef DIE
	    # nor use the typedef name as struct tag name.
	    xfail "$name"
	}
    }

    set name "ptype variable of type tagless struct"
    gdb_test_multiple "ptype v_tagless" $name {
	-re "type = $XX_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
	    # gcc 2.95.3 -gdwarf-2
	    pass "$name"
	}
	-re "type = $re_class${ws}$re_fields${ws}$XX_synth_gcc_23$nl\}$nl$gdb_prompt $" {
	    # gcc 2.95.3 -gstabs+
	    pass "$name"
	}
	-re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
	    # gcc 3.3.4 -gdwarf-2
	    # gcc 3.4.1 -gdwarf-2
	    # gcc HEAD 2004-07-31 -gdwarf-2
	    # gcc HEAD 2004-07-31 -gstabs+
	    pass "$name"
	}
	-re "type = $re_class${ws}$re_fields${ws}$re_synth_gcc_23$nl\}$nl$gdb_prompt $" {
	    # gcc 3.3.4 -gstabs+
	    # gcc 3.4.1 -gstabs+
	    pass "$name"
	}
    }
}

# Multiple inheritance, print type definitions.

proc test_ptype_mi { } {

    # A class with two bases.

    cp_test_ptype_class \
	"D" "" "class" "D" \
	{
	    { base         "public B" }
	    { base         "public C" }
	    { field public "int d;" }
	    { field public "int x;" }
	}
    cp_test_ptype_class "class D" "" "class" "D" ibid
    cp_test_ptype_class "g_D" "" "class" "D" ibid

    # A class derived from the previous class.

    cp_test_ptype_class \
	"E" "" "class" "E" \
	{
	    { base         "public D" }
	    { field public "int e;" }
	    { field public "int x;" }
	}
    cp_test_ptype_class "class E" "" "class" "E" ibid
    cp_test_ptype_class "g_E" "" "class" "E" ibid
}

# Single virtual inheritance, print type definitions.

proc test_ptype_vi { } {

    # class vA

    cp_test_ptype_class \
	"vA" "" "class" "vA" \
	{
	    { field public "int va;" }
	    { field public "int vx;" }
	}
    cp_test_ptype_class "class vA" "" "class" "vA" ibid
    cp_test_ptype_class "g_vA" "" "class" "vA" ibid

    # class vB

    cp_test_ptype_class \
	"vB" "" "class" "vB" \
	{
	    { base         "public virtual vA" }
	    { vbase        "vA" }
	    { field public "int vb;" }
	    { field public "int vx;" }
	}
    cp_test_ptype_class "class vB" "" "class" "vB" ibid
    cp_test_ptype_class "g_vB" "" "class" "vB" ibid

    # class vC

    cp_test_ptype_class \
	"vC" "" "class" "vC" \
	{
	    { base         "public virtual vA" }
	    { vbase        "vA" }
	    { field public "int vc;" }
	    { field public "int vx;" }
	}
    cp_test_ptype_class "class vC" "" "class" "vC" ibid
    cp_test_ptype_class "g_vC" "" "class" "vC" ibid

}

# Multiple virtual inheritance, print type definitions.

proc test_ptype_mvi { } {

    # class vD

    cp_test_ptype_class \
	"vD" "" "class" "vD" \
	{
	    { base         "public virtual vB" }
	    { base         "public virtual vC" }
	    { vbase        "vC" }
	    { vbase        "vB" }
	    { field public "int vd;" }
	    { field public "int vx;" }
	}
    cp_test_ptype_class "class vD" "" "class" "vD" ibid
    cp_test_ptype_class "g_vD" "" "class" "vD" ibid

    # class vE

    cp_test_ptype_class \
	"vE" "" "class" "vE" \
	{
	    { base         "public virtual vD" }
	    { vbase        "vD" }
	    { field public "int ve;" }
	    { field public "int vx;" }
	}
    cp_test_ptype_class "class vE" "" "class" "vE" ibid
    cp_test_ptype_class "g_vE" "" "class" "vE" ibid

}

# Single inheritance, print individual members.

proc test_print_si_members { } {
    global vhn

    # Print all members of g_A using fully qualified form.
    gdb_test "print g_A.A::a" "$vhn = 1"
    gdb_test "print g_A.A::x" "$vhn = 2"

    # Print members of g_A using nonambiguous compact form.
    gdb_test "print g_A.a" "$vhn = 1"
    gdb_test "print g_A.x" "$vhn = 2"

    # Print all members of g_B using fully qualified form.
    gdb_test "print g_B.A::a" "$vhn = 3"
    gdb_test "print g_B.A::x" "$vhn = 4"
    gdb_test "print g_B.B::b" "$vhn = 5"
    gdb_test "print g_B.B::x" "$vhn = 6"

    # Print members of g_B using nonambiguous compact form.
    gdb_test "print g_B.a" "$vhn = 3"
    gdb_test "print g_B.b" "$vhn = 5"
    gdb_test "print g_B.x" "$vhn = 6"

    # Print all members of g_C using fully qualified form.
    gdb_test "print g_C.A::a" "$vhn = 7"
    gdb_test "print g_C.A::x" "$vhn = 8"
    gdb_test "print g_C.C::c" "$vhn = 9"
    gdb_test "print g_C.C::x" "$vhn = 10"

    # Print members of g_C using nonambiguous compact form.
    gdb_test "print g_C.a" "$vhn = 7"
    gdb_test "print g_C.c" "$vhn = 9"
    gdb_test "print g_C.x" "$vhn = 10"
}

# Single inheritance, print complete classes.

proc test_print_si_classes { } {
    global vhn

    # Print all members of g_A, g_B, g_C.
    gdb_test "print g_A" "$vhn = \{a = 1, x = 2\}"
    gdb_test "print g_B" "$vhn = \{<(class A|A)> = \{a = 3, x = 4\}, b = 5, x = 6\}"
    gdb_test "print g_C" "$vhn = \{<(class A|A)> = \{a = 7, x = 8\}, c = 9, x = 10\}"
}

# Multiple inheritance, print individual members.

proc test_print_mi_members {} {
    global gdb_prompt
    global nl
    global vhn

    # Print all members of g_A.
    gdb_test "print g_A.A::a" "$vhn = 1"
    gdb_test "print g_A.A::x" "$vhn = 2"

    # Print all members of g_B.
    gdb_test "print g_B.A::a" "$vhn = 3"
    gdb_test "print g_B.A::x" "$vhn = 4"
    gdb_test "print g_B.B::b" "$vhn = 5"
    gdb_test "print g_B.B::x" "$vhn = 6"

    # Print all members of g_C.
    gdb_test "print g_C.A::a" "$vhn = 7"
    gdb_test "print g_C.A::x" "$vhn = 8"
    gdb_test "print g_C.C::c" "$vhn = 9"
    gdb_test "print g_C.C::x" "$vhn = 10"

    # Print all members of g_D.
    #
    # g_D.A::a and g_D.A::x are ambiguous member accesses.
    gdb_test "print g_D.A::a" "base class 'A' is ambiguous in type 'D'"
    gdb_test "print g_D.C::a" "$vhn = 15"
    gdb_test "print g_D.B::a" "$vhn = 11"
    gdb_test "print g_D.A::x" "base class 'A' is ambiguous in type 'D'"
    gdb_test "print g_D.B::b" "$vhn = 13"
    gdb_test "print g_D.B::x" "$vhn = 14"
    gdb_test "print g_D.C::c" "$vhn = 17"
    gdb_test "print g_D.C::x" "$vhn = 18"
    gdb_test "print g_D.D::d" "$vhn = 19"
    gdb_test "print g_D.D::x" "$vhn = 20"

    # Print all members of g_E.
    # g_E.A::a and g_E.A::x are ambiguous.

    gdb_test "print g_E.A::a" "base class 'A' is ambiguous in type 'E'"
    gdb_test "print g_E.A::x" "base class 'A' is ambiguous in type 'E'"
    gdb_test "print g_E.B::b" "$vhn = 23"
    gdb_test "print g_E.B::x" "$vhn = 24"
    gdb_test "print g_E.C::c" "$vhn = 27"
    gdb_test "print g_E.C::x" "$vhn = 28"
    gdb_test "print g_E.D::d" "$vhn = 29"
    gdb_test "print g_E.D::x" "$vhn = 30"
    gdb_test "print g_E.E::e" "$vhn = 31"
    gdb_test "print g_E.E::x" "$vhn = 32"
}

# Multiple inheritance, print individual member types.

proc test_print_mi_member_types {} {
    global gdb_prompt
    global nl
    global vhn

    # Print the types of some members of g_D without qualifying them.
    gdb_test "ptype g_D.b" "type = int"
    gdb_test "ptype g_D.c" "type = int"
    gdb_test "ptype g_D.d" "type = int"

    # Print the types of qualified members; none of these tests pass today.

    # Print all members of g_A.
    gdb_test "ptype g_A.A::a" "type = int"
    gdb_test "ptype g_A.A::x" "type = int"

    # Print all members of g_B.
    gdb_test "ptype g_B.A::a" "type = int"
    gdb_test "ptype g_B.A::x" "type = int"
    gdb_test "ptype g_B.B::b" "type = int"
    gdb_test "ptype g_B.B::x" "type = int"

    # Print all members of g_C.
    gdb_test "ptype g_C.A::a" "type = int"
    gdb_test "ptype g_C.A::x" "type = int"
    gdb_test "ptype g_C.C::c" "type = int"
    gdb_test "ptype g_C.C::x" "type = int"

    # Print all members of g_D.
    #
    # g_D.A::a and g_D.A::x are ambiguous member accesses.

    gdb_test "ptype g_D.A::a" "base class 'A' is ambiguous in type 'D'"
    gdb_test "ptype g_D.A::x" "base class 'A' is ambiguous in type 'D'"
    gdb_test "ptype g_D.B::b" "type = int"
    gdb_test "ptype g_D.B::x" "type = int"
    gdb_test "ptype g_D.C::c" "type = int"
    gdb_test "ptype g_D.C::x" "type = int"
    gdb_test "ptype g_D.D::d" "type = int"
    gdb_test "ptype g_D.D::x" "type = int"

    # Print all members of g_E.
    # g_E.A::a and g_E.A::x are ambiguous.

    gdb_test "ptype g_E.A::a" "base class 'A' is ambiguous in type 'E'"
    gdb_test "ptype g_E.A::x" "base class 'A' is ambiguous in type 'E'"
    gdb_test "ptype g_E.B::b" "type = int"
    gdb_test "ptype g_E.B::x" "type = int"
    gdb_test "ptype g_E.C::c" "type = int"
    gdb_test "ptype g_E.C::x" "type = int"
    gdb_test "ptype g_E.D::d" "type = int"
    gdb_test "ptype g_E.D::x" "type = int"
    gdb_test "ptype g_E.E::e" "type = int"
    gdb_test "ptype g_E.E::x" "type = int"
}

# Multiple inheritance, print complete classes.

proc test_print_mi_classes { } {
    global vhn

    # Print all members of g_D.
    gdb_test "print g_D" "$vhn = \{\<(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 all members of g_E.
    gdb_test "print g_E" "$vhn = \{\<(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\}"
}

# 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
    global vhn

    gdb_test "print g_anon_union.a" "$vhn = 2" "print anonymous union member"

    set name "print variable of type anonymous union"
    gdb_test_multiple "print g_anon_union" $name {
	-re "$vhn = \{one = 1, \{a = 2, b = \[0-9\]+\}\}$nl$gdb_prompt $" {
	    pass $name
	}
    }

    set name "print type of anonymous union"
    set re_tag "class_with_anon_union"
    set re_class "(class $re_tag \{${ws}public:|struct $re_tag \{)"
    set re_fields "int one;${ws}union \{${ws}int a;${ws}long( int)? b;${ws}\};"
    gdb_test_multiple "ptype g_anon_union" $name {
	-re "type = $re_class${ws}$re_fields$nl\}$nl$gdb_prompt $" {
	    pass $name
	}
    }
}


# Single virtual inheritance, print individual members.

proc test_print_svi_members { } {
    global vhn

    # Print all members of g_vA.
    gdb_test "print g_vA.vA::va" "$vhn = 1"
    gdb_test "print g_vA.vA::vx" "$vhn = 2"

    # Print members of g_vA using compact form.
    gdb_test "print g_vA.va" "$vhn = 1"
    gdb_test "print g_vA.vx" "$vhn = 2"

    # Print all members of g_vB.
    gdb_test "print g_vB.vA::va" "$vhn = 3"
    gdb_test "print g_vB.vA::vx" "$vhn = 4"
    gdb_test "print g_vB.vB::vb" "$vhn = 5"
    gdb_test "print g_vB.vB::vx" "$vhn = 6"

    # Print members of g_vB using compact form.
    gdb_test "print g_vB.va" "$vhn = 3"
    gdb_test "print g_vB.vb" "$vhn = 5"
    gdb_test "print g_vB.vx" "$vhn = 6"

    # Print all members of g_vC.
    gdb_test "print g_vC.vA::va" "$vhn = 7"
    gdb_test "print g_vC.vA::vx" "$vhn = 8"
    gdb_test "print g_vC.vC::vc" "$vhn = 9"
    gdb_test "print g_vC.vC::vx" "$vhn = 10"

    # Print members of g_vC using compact form.
    gdb_test "print g_vC.va" "$vhn = 7"
    gdb_test "print g_vC.vc" "$vhn = 9"
    gdb_test "print g_vC.vx" "$vhn = 10"
}

# Single virtual inheritance, print complete classes.

proc test_print_svi_classes { } {
    global gdb_prompt
    global hex
    global nl
    global vhn

    # Print all members of g_vA.
    gdb_test "print g_vA" "$vhn = \{va = 1, vx = 2\}"

    # Print all members of g_vB.
    set re_vbptr_2	"(_vb.2vA|_vb.vA)"
    set re_vbptr_3	"_vptr.vB"

    set name "print g_vB"
    gdb_test_multiple "print g_vB" $name {
	-re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_2 = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" {
	    # gcc 2.95.3 -gdwarf-2
	    # gcc 2.95.3 -gstabs+
	    pass $name
	}
	-re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_3 = $hex, vb = 5, vx = 6\}$nl$gdb_prompt $" {
	    # gcc 3.3.4 -gdwarf-2
	    # gcc 3.4.1 -gdwarf-2
	    # gcc 3.4.1 -gstabs+
	    # gcc HEAD 2004-07-31 -gdwarf-2
	    pass "$name (FIXME v3 vtbl ptr)"
	}
	-re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_3 = $hex <VTT for vB>, vb = 5, vx = 6\}$nl$gdb_prompt $" {
	    # gcc 3.3.4 -gstabs+
	    pass $name
	}
	-re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_3 = $hex <typeinfo for vB>, vb = 5, vx = 6\}$nl$gdb_prompt $" {
	    # gcc HEAD 2004-07-31 -gstabs+
	    pass $name
	}
	-re "$vhn = \{<vA> = \{va = 3, vx = 4\}, $re_vbptr_3 = ${hex}( <\[^>]*>)?, vb = 5, vx = 6\}$nl$gdb_prompt $" {
	    # gcc HEAD 2015?+
	    # the vptr is set to the address *after* the vtable,
	    # so the # symbol shown is unpredictable.
	    pass "$name (symbols ignored)"
	}
    }

    # Print all members of g_vC.
    set re_vbptr_2	"(_vb.2vA|_vb.vA)"
    set re_vbptr_3	"_vptr.vC"

    set name "print g_vC"
    gdb_test_multiple "print g_vC" $name {
	-re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_2 = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" {
	    # gcc 2.95.3 -gdwarf-2
	    # gcc 2.95.3 -gstabs+
	    pass $name
	}
	-re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_3 = $hex, vc = 9, vx = 10\}$nl$gdb_prompt $" {
	    # gcc 3.3.4 -gdwarf-2
	    # gcc 3.4.1 -gdwarf-2
	    # gcc 3.4.1 -gstabs+
	    # gcc HEAD 2004-07-31 -gdwarf-2
	    pass "$name (FIXME v3 vtbl ptr)"
	}
	-re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_3 = $hex <VTT for vC>, vc = 9, vx = 10\}$nl$gdb_prompt $" {
	    # gcc 3.3.4 -gstabs+
	    pass $name
	}
	-re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_3 = $hex <typeinfo for vC>, vc = 9, vx = 10\}$nl$gdb_prompt $" {
	    # gcc HEAD 2004-07-31 -gstabs+
	    pass $name
	}
	-re "$vhn = \{<vA> = \{va = 7, vx = 8\}, $re_vbptr_3 = ${hex}( <\[^>]*>)?, vc = 9, vx = 10\}$nl$gdb_prompt $" {
	    # gcc HEAD 2015?+
	    # the vptr is set to the address *after* the vtable,
	    # so the symbol shown is unpredictable.
	    pass "$name (symbols ignored)"
	}
    }
}

# Multiple virtual inheritance, print individual members.

proc test_print_mvi_members { } {
    global vhn

    # Print all members of g_vD.
    gdb_test "print g_vD.vA::va" "$vhn = 19"
    gdb_test "print g_vD.vA::vx" "$vhn = 20"
    gdb_test "print g_vD.vB::vb" "$vhn = 21"
    gdb_test "print g_vD.vB::vx" "$vhn = 22"
    gdb_test "print g_vD.vC::vc" "$vhn = 23"
    gdb_test "print g_vD.vC::vx" "$vhn = 24"
    gdb_test "print g_vD.vD::vd" "$vhn = 25"
    gdb_test "print g_vD.vD::vx" "$vhn = 26"

    # Print all members of g_vE.
    gdb_test "print g_vE.vA::va" "$vhn = 0"
    gdb_test "print g_vE.vA::vx" "$vhn = 0"
    gdb_test "print g_vE.vB::vb" "$vhn = 0"
    gdb_test "print g_vE.vB::vx" "$vhn = 0"
    gdb_test "print g_vE.vC::vc" "$vhn = 0"
    gdb_test "print g_vE.vC::vx" "$vhn = 0"
    gdb_test "print g_vE.vD::vd" "$vhn = 0"
    gdb_test "print g_vE.vD::vx" "$vhn = 0"
    gdb_test "print g_vE.vE::ve" "$vhn = 27"
    gdb_test "print g_vE.vE::vx" "$vhn = 28"
}

# Multiple virtual inheritance, print complete classes.

proc test_print_mvi_classes { } {
    global gdb_prompt
    global hex
    global ws
    global nl
    global vhn

    # Virtual base pointers for everybody.

    set re_vbptr_2_vA	"(_vb.2vA|_vb.vA)"
    set re_vbptr_2_vB	"(_vb.2vB|_vb.vB)"
    set re_vbptr_2_vC	"(_vb.2vC|_vb.vC)"
    set re_vbptr_2_vD	"(_vb.2vD|_vb.vD)"
    set re_vbptr_3_vA	"_vptr.vA"
    set re_vbptr_3_vB	"_vptr.vB"
    set re_vbptr_3_vC	"_vptr.vC"
    set re_vbptr_3_vD	"_vptr.vD"
    set re_vbptr_3_vE	"_vptr.vE"

    # Print all members of g_vD.

    set name "print g_vD"
    gdb_test_multiple "print g_vD" $name {
	-re "$vhn = \{<vB> = \{<vA> = \{va = 19, vx = 20\}, $re_vbptr_2_vA = $hex, vb = 21, vx = 22\}, <vC> = \{$re_vbptr_2_vA = $hex, vc = 23, vx = 24\}, $re_vbptr_2_vC = $hex, $re_vbptr_2_vB = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" {
	    # gcc 2.95.3 -gdwarf-2
	    # gcc 2.95.3 -gstabs+
	    pass $name
	}
	-re "$vhn = \{<vB> = \{<vA> = \{va = 19, vx = 20\}, $re_vbptr_3_vB = ${hex}( <vtable for vD.*>)?, vb = 21, vx = 22\}, <vC> = \{$re_vbptr_3_vC = ${hex}( <vtable for vC.*>)?, vc = 23, vx = 24\}, $re_vbptr_3_vD = ${hex}( <vtable for vD.*>)?, vd = 25, vx = 26\}$nl$gdb_prompt $" {
	    # gcc 3.3.2 -gdwarf-2
	    # gcc HEAD 2004-01-21 -gdwarf-2
	    # gcc HEAD 2004-01-21 -gstabs+
	    pass "$name (FIXME v3 vtbl ptr)"
	}
	-re "$vhn = \{<vB> = \{<vA> = \{va = 19, vx = 20\}, $re_vbptr_3_vB = $hex, vb = 21, vx = 22\}, <vC> = \{$re_vbptr_3_vC = $hex <VTT for vD>, vc = 23, vx = 24\}, $re_vbptr_3_vD = $hex, vd = 25, vx = 26\}$nl$gdb_prompt $" {
	    # gcc 3.3.2 -gstabs+
	    pass "$name"
	}
	-re "$vhn = \{<vB> = \{<vA> = \{va = 19, vx = 20\}, $re_vbptr_3_vB = ${hex}( <\[^>]*>)?, vb = 21, vx = 22\}, <vC> = \{$re_vbptr_3_vC = ${hex}( <\[^>]*>)?, vc = 23, vx = 24\}, $re_vbptr_3_vD = ${hex}( <\[^>]*>)?, vd = 25, vx = 26\}$nl$gdb_prompt $" {
	    # gcc HEAD 2015?+
	    # the vptr is set to the address *after* the vtable,
	    # so the symbol shown is unpredictable.
	    pass "$name (symbols ignored)"
	}
    }

    # Print all members of g_vE.

    set name "print g_vE"
    gdb_test_multiple "print g_vE" $name {
	-re "$vhn = \{<vD> = \{<vB> = \{<vA> = \{va = 0, vx = 0\}, $re_vbptr_2_vA = $hex, vb = 0, vx = 0\}, <vC> = \{$re_vbptr_2_vA = $hex, vc = 0, vx = 0\}, $re_vbptr_2_vC = $hex, $re_vbptr_2_vB = $hex, vd = 0, vx = 0\}, $re_vbptr_2_vD = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" {
	    # gcc 2.95.3 -gdwarf-2
	    # gcc 2.95.3 -gstabs+
	    pass $name
	}
	-re "$vhn = \{<vD> = \{<vB> = \{<vA> = \{va = 0, vx = 0\}, $re_vbptr_3_vB = ${hex}( <vtable for vE.*>)?, vb = 0, vx = 0\}, <vC> = \{$re_vbptr_3_vC = ${hex}( <vtable for vE.*>)?, vc = 0, vx = 0\}, $re_vbptr_3_vD = ${hex}( <vtable for vE.*>)?, vd = 0, vx = 0\}, $re_vbptr_3_vE = ${hex}( <vtable for vE.*>)?, ve = 27, vx = 28\}$nl$gdb_prompt $" {
	    # gcc 3.3.4 -gdwarf-2
	    # gcc 3.3.4 -gstabs+
	    # gcc 3.4.1 -gdwarf-2
	    # gcc 3.4.1 -gstabs+
	    # gcc HEAD 2004-07-31 -gdwarf-2
	    pass "$name (FIXME v3 vtbl ptr)"
	}
	-re "$vhn = \{<vD> = \{<vB> = \{<vA> = \{va = 0, vx = 0\}, $re_vbptr_3_vB = $hex, vb = 0, vx = 0\}, <vC> = \{$re_vbptr_3_vC = $hex <VTT for vD>, vc = 0, vx = 0\}, $re_vbptr_3_vD = $hex, vd = 0, vx = 0\}, $re_vbptr_3_vE = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" {
	    # gcc 3.2.7-rh -gstabs+
	    pass $name
	}
	-re "$vhn = \{<vD> = \{<vB> = \{<vA> = \{va = 0, vx = 0\}, $re_vbptr_3_vB = $hex, vb = 0, vx = 0\}, <vC> = \{$re_vbptr_3_vC = $hex <typeinfo for vE>, vc = 0, vx = 0\}, $re_vbptr_3_vD = $hex, vd = 0, vx = 0\}, $re_vbptr_3_vE = $hex, ve = 27, vx = 28\}$nl$gdb_prompt $" {
	    # gcc HEAD 2004-07-31 -gstabs+
	    pass $name
	}
	-re "$vhn = \{<vD> = \{<vB> = \{<vA> = \{va = 0, vx = 0\}, $re_vbptr_3_vB = ${hex}( <\[^>]*>)?, vb = 0, vx = 0\}, <vC> = \{$re_vbptr_3_vC = ${hex}( <\[^>]*>)?, vc = 0, vx = 0\}, $re_vbptr_3_vD = ${hex}( <\[^>]*>)?, vd = 0, vx = 0\}, $re_vbptr_3_vE = ${hex}( <\[^>]*>)?, ve = 27, vx = 28\}$nl$gdb_prompt $" {
	    # gcc HEAD 2015?+
	    # the vptr is set to the address *after* the vtable,
	    # so the symbol shown is unpredictable.
	    pass "$name (symbols ignored)"
	}
    }
}

proc do_tests { } {
    gdb_test_no_output "set width 0"

    if { ![runto_main] } then {
	perror "couldn't run to main"
	return
    }

    gdb_test_no_output "set language c++"
    test_ptype_si
    test_ptype_mi
    test_ptype_vi
    test_ptype_mvi

    if { ![runto 'inheritance2'] } then {
	perror "couldn't run to inheritance2"
	return
    }

    with_test_prefix "single inheritance" {
	test_print_si_members
    }

    test_print_si_classes

    with_test_prefix "multiple inheritance" {
	test_print_mi_members
    }

    test_print_mi_member_types
    test_print_mi_classes
    test_print_anon_union

    if { ![runto 'inheritance4'] } {
	perror "couldn't run to inheritance4"
	return
    }

    test_print_svi_members
    test_print_svi_classes
    test_print_mvi_members
    test_print_mvi_classes
}

do_tests
