# Copyright 2002-2013 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 static data
# 2002-05-13  Benjamin Kosnik  <bkoz@redhat.com>
# 2002-08-22  David Carlton <carlton@math.stanford.edu>

# This file is part of the gdb testsuite

if { [skip_cplus_tests] } { continue }

#
# test running programs
#

standard_testfile .cc m-static1.cc

if [get_compiler_info] {
    return -1
}

if {[prepare_for_testing $testfile.exp $testfile \
	 [list $srcfile $srcfile2] {debug c++}]} {
    return -1
}

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

get_debug_format
set non_dwarf [expr ! [test_debug_format "DWARF 2"]]

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

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


# One.

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

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

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

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

gdb_test "print test1.'~gnu_obj_1'" \
    { = {void \(gnu_obj_1 \*( const)?, int\)} 0x[0-9a-f]+ <gnu_obj_1::~gnu_obj_1\(\)>} \
    "simple object instance, print quoted destructor"

gdb_test "ptype gnu_obj_1::'~gnu_obj_1'" \
    {type = void \(gnu_obj_1 \* const\)} \
    "simple object class, ptype quoted destructor"

# Two.

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

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

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

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

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

# Three.

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

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

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

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

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

# 2002-08-16
# Four.

# static const int initialized in another file.
gdb_test "print test4.elsewhere" "\\$\[0-9\].* = 221" "static const int initialized elsewhere"

# static const int that nobody initializes.  From PR gdb/635.
if {[test_compiler_info {gcc-[0-3]-*}]
    || [test_compiler_info {gcc-4-[0-4]-*}]} {
    # There was an extra CU-level DW_TAG_variable as DW_AT_declaration
    # with DW_AT_name = nowhere
    # and DW_AT_MIPS_linkage_name = _ZN9gnu_obj_47nowhereE .
    setup_xfail *-*-*
}
gdb_test "print test4.nowhere" "field nowhere is nonexistent or has been optimized out" "static const int initialized nowhere"

# static const initialized in the class definition, PR gdb/11702.
if { $non_dwarf } { setup_xfail *-*-* }
gdb_test "print test4.everywhere" "\\$\[0-9\].* = 317" "static const int initialized in class definition"
if { $non_dwarf } { setup_xfail *-*-* }
gdb_test "print test4.somewhere" "\\$\[0-9\].* = 3.14\[0-9\]*" "static const float initialized in class definition"

# Also make sure static const members can be found via "info var".
if { $non_dwarf } { setup_xfail *-*-* }
gdb_test "info variable everywhere" "File .*/m-static\[.\]h.*const int gnu_obj_4::everywhere;" "info variable everywhere"

# Perhaps at some point test4 should also include a test for a static
# const int that was initialized in the header file.  But I'm not sure
# that GDB's current behavior in such situations is either consistent
# across platforms or optimal, so I'm not including one now.

# Step into test1.method and examine the method-scoped static.
# This is a regression test for PR 9708.
gdb_test "step" "gnu_obj_1::method.*"
gdb_test "print svar" " = true"

gdb_exit
return 0
