| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 
 | # Copyright 1998-2016 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 derivation.cc derivation2.cc
if {[prepare_for_testing $testfile.exp $testfile \
	[list $srcfile $srcfile2] {debug c++}]} {
    return -1
}
# Check inheritance of typedefs.
with_test_prefix "before run" {
    foreach klass {"A" "D" "E" "F" "A2" "D2"} {
	gdb_test "ptype ${klass}::value_type" "type = int"
	gdb_test "whatis ${klass}::value_type" "type = int"
	gdb_test "p (${klass}::value_type) 0" " = 0"
    }
    foreach klass {"Z" "ZZ"} {
	gdb_test "ptype ${klass}::value_type" "type = float"
	gdb_test "whatis ${klass}::value_type" "type = float"
	gdb_test "p (${klass}::value_type) 0" " = 0"
    }
}
# 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
}
# Check inheritance of typedefs again, but this time with an active block.
with_test_prefix "at marker1" {
    foreach klass {"A" "D" "A2" "D2"} {
	gdb_test "ptype ${klass}::value_type" "type = int"
	gdb_test "whatis ${klass}::value_type" "type = int"
	gdb_test "p (${klass}::value_type) 0" " = 0"
    }
}
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 \
    "a_instance" "" "class" "A" \
    {
	{ field  public "A::value_type a;" }
	{ field  public "A::value_type aa;" }
	{ method public "A();" }
	{ method public "A::value_type afoo();" }
	{ method public "A::value_type foo();" }
	{ typedef public "typedef int value_type;" }
    }
# 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 \
    "d_instance" "" "class" "D" \
    {
	{ base          "private A" }
	{ base          "public B" }
	{ base          "protected C" }
	{ field  public "A::value_type d;" }
	{ field  public "A::value_type dd;" }
	{ method public "D();" }
	{ method public "A::value_type dfoo();" }
	{ method public "A::value_type 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 \
    "e_instance" "" "class" "E" \
    {
	{ base          "public A" }
	{ base          "private B" }
	{ base          "protected C" }
	{ field  public "A::value_type e;" }
	{ field  public "A::value_type ee;" }
	{ method public "E();" }
	{ method public "A::value_type efoo();" }
	{ method public "A::value_type 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 \
    "f_instance" "" "class" "F" \
    {
	{ base          "private A" }
	{ base          "public B" }
	{ base          "private C" }
	{ field  public "A::value_type f;" }
	{ field  public "A::value_type ff;" }
	{ method public "F();" }
	{ method public "A::value_type ffoo();" }
	{ method public "A::value_type foo();" }
    }
# class G
cp_test_ptype_class \
    "g_instance" "" "class" "G" \
    {
	{ base          "private A" }
	{ base          "public B" }
	{ base          "protected C" }
	{ field public "int g;" }
	{ field public "int gg;" }
	{ field public "int a;" }
	{ field public "int b;" }
	{ field public "int c;" }
	{ method public "int gfoo();" }
	{ 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()"
# Check typedefs of fields
foreach Klass {"C" "G"} {
    set klass [string tolower $Klass]
    set instance "${klass}_instance"
    set var "${instance}.$klass"
    gdb_test "whatis $var" "int"
    gdb_test "ptype $var" "int"
}
foreach Klass {"A" "B" "D" "E" "F"} {
    set klass [string tolower $Klass]
    set instance "${klass}_instance"
    set var "${instance}.$klass"
    gdb_test "whatis $var" "A::value_type"
    gdb_test "ptype $var" "int"
    if {![string equal $Klass "B"]} {
	gdb_test "p (${Klass}::value_type) 0" " = 0"
    }
}
foreach Klass {"Z" "ZZ"} {
    set klass [string tolower $Klass]
    set instance "${klass}_instance"
    set var "${instance}.$klass"
    gdb_test "whatis $var" "Z::value_type"
    gdb_test "ptype $var" "float"
    gdb_test "p (${Klass}::value_type) 0" " = 0"
}
# This is a regression test for a bug that caused a crash when trying
# to print the vtbl pointer.  We don't care about the output so much
# here (it is tested elsewhere), just that gdb doesn't crash.  We test
# "ptype" first because, before the gdb fix, that was the only code
# path calling get_vptr_fieldno.
gdb_test "ptype vderived" "type = .*"
gdb_test "print vderived" " = {.* inter = 0.*x = 0}"
# Test whether inheritance of typedefs is properly
# reported when stopped.
gdb_test "ptype N::value_type" "type = double"
gdb_test "ptype N::Derived::value_type" "type = int"
# Now run to N::Derived::doit and get the type of "value_type"
if {![runto "N::Derived::doit"]} {
    perror "couldn't run to N::Derived::doit"
    continue
}
gdb_test "ptype value_type" "type = int"
 |