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

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

# This file is part of the gdb testsuite

if $tracelevel then {
        strace $tracelevel
        }

if { [skip_cplus_tests] } { continue }

#
# test running programs
#
set prms_id 0
set bug_id 0

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
