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

# Tests for member data
# 2002-05-13  Benjamin Kosnik  <bkoz@redhat.com>

# This file is part of the gdb testsuite

if { [skip_cplus_tests] } { continue }

#
# test running programs
#

standard_testfile .cc

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

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

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

# First, run to after we've constructed all the gnu_obj_N's:

gdb_breakpoint [gdb_get_line_number "first-constructs-done"]
gdb_continue_to_breakpoint "end of first constructors"

# One.

# simple object, const bool
gdb_test "print test1.test" "\\$\[0-9\]* = true" "simple object, const bool"

# simple object, const int
gdb_test "print test1.key1" "\\$\[0-9\]* = 5" "simple object, const int"

# simple object, long
gdb_test "print test1.key2" "\\$\[0-9\]* = 4589" "simple object, long"

# simple object, enum
gdb_test "print test1.value" "\\$\[0-9\]* = egyptian" "simple object, enum"

# Two.

# derived template object, base const bool
gdb_test "print test2.test" "\\$\[0-9\]* = true" "derived template object, base const bool"

# derived template object, base const int
gdb_test "print test2.key1" "\\$\[0-9\]* = 5" "derived template object, base const int"

# derived template object, base long
gdb_test "print test2.key2" "\\$\[0-9\]* = 7" "derived template object, base long"

# derived template object, base enum
gdb_test "print test2.value" "\\$\[0-9\]* = oriental" "derived template object, base enum"

# derived template object, enum
gdb_test "print test2.value_derived" "\\$\[0-9\]* = roman" "derived template object, derived enum"

# Three.

# template object, derived template data member's base const bool
gdb_test "print test3.data.test" "\\$\[0-9\]* = true" "template object, const bool"

# template object, derived template data member's base const int
gdb_test "print test3.data.key1" "\\$\[0-9\]* = 5" "template object, const int"

# template object, derived template data member's base long
gdb_test "print test3.data.key2" "\\$\[0-9\]* = 7" "template object, long"

# template object, derived template data member's base enum
gdb_test "print test3.data.value" "\\$\[0-9\]* = oriental" "template object, base enum"

# template object, derived template data member's enum
gdb_test "print test3.data.value_derived" "\\$\[0-9]\* = etruscan" "template object, derived enum"

# Now some tests for shadowing (see PR gdb/804):

gdb_breakpoint "C::marker"
gdb_continue_to_breakpoint "continue to shadow breakpoint"

gdb_test "print shadow" "\\$\[0-9]\* = 1" "shadowing member"
gdb_test "print ::shadow" "\\$\[0-9]\* = 0" "shadowed global variable"

gdb_exit
return 0
