# 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 int, accessing via 'class::method::variable'
# Regression test for PR c++/15203 and PR c++/15210
gdb_test "print 'gnu_obj_1::method()::sintvar'" "\\$\[0-9\]+ = 4" \
    "simple object, static const int, accessing via 'class::method::variable"

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

if { [istarget arm*-*-*] } {
    gdb_test "print test5.single_constructor" \
	{ = {single_constructor \*\(single_constructor \* const\)} 0x[0-9a-f]+ <single_constructor::single_constructor\(\)>} \
	"simple object instance, print constructor"
    gdb_test "ptype test5.single_constructor" \
	{type = class single_constructor {\r\n  public:\r\n    single_constructor\(void\);\r\n    ~single_constructor\(int\);\r\n} \*\(single_constructor \* const\)} \
	"simple object instance, ptype constructor"
    gdb_test "ptype single_constructor::single_constructor" \
	{type = class single_constructor {\r\n  public:\r\n    single_constructor\(void\);\r\n    ~single_constructor\(int\);\r\n} \*\(single_constructor \* const\)} \
	"simple object class, ptype constructor"

    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 destructor"
    gdb_test "ptype test1.~gnu_obj_1" \
	{type = void \*\(gnu_obj_1 \* const, int\)} \
	"simple object instance, ptype destructor"

    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"
} else {
    gdb_test "print test5.single_constructor" \
	{ = {void \(single_constructor \* const\)} 0x[0-9a-f]+ <single_constructor::single_constructor\(\)>} \
	"simple object instance, print constructor"
    gdb_test "ptype test5.single_constructor" \
	{type = void \(single_constructor \* const\)} \
	"simple object instance, ptype constructor"
    gdb_test "ptype single_constructor::single_constructor" \
	{type = void \(single_constructor \* const\)} \
	"simple object class, ptype constructor"

    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 destructor"
    gdb_test "ptype test1.~gnu_obj_1" \
	{type = void \(gnu_obj_1 \* const, int\)} \
	"simple object instance, ptype destructor"

    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
