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

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

set testfile "m-data"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
     untested m-data.exp
     return -1
}

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

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}


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
