aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.cp/m-static.exp
blob: 563d70108e9b06d8878ab085fd25e0b71eeb574b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# Copyright 2002, 2004, 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 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
#

set testfile "m-static"
set srcfile  "${testfile}.cc"
set srcfile1 "${testfile}1.cc"
set objfile  "${testfile}.o"
set objfile1 "${testfile}1.o"
set binfile  "${objdir}/${subdir}/${testfile}"

if  { [gdb_compile "$srcdir/$subdir/$srcfile" "$objdir/$subdir/$objfile" object {debug c++}] != "" } {
     untested m-static.exp
     return -1
}

if  { [gdb_compile "$srcdir/$subdir/$srcfile1" "$objdir/$subdir/$objfile1" object {debug c++}] != "" } {
     untested m-static.exp
     return -1
}

if { [gdb_compile "$objdir/$subdir/$objfile $objdir/$subdir/$objfile1" "${binfile}" executable {debug c++}] != "" } {
     untested m-static.exp
     return -1
}

if [get_compiler_info $binfile] {
    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
}

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"

# 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