]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/testsuite/gdb.cp/nsalias.exp
GDB copyright headers update after running GDB's copyright.py script.
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.cp / nsalias.exp
CommitLineData
618f726f 1# Copyright 2013-2016 Free Software Foundation, Inc.
74921315
KS
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16# Test namespace aliases.
17# PRs c++/7935, c++/10541
18
19load_lib dwarf.exp
20
21if {![dwarf2_support]} {
22 return 0
23}
24
25if {[skip_cplus_tests]} {
26 continue
27}
28
29standard_testfile .cc nsalias-dw.S
30
31# Make the DWARF used for the test. This is necessary to work
32# around compiler issues. Not all versions of gcc output the
33# correct debuginfo we need.
34#
35# This should create the equivalent DWARF to:
36#
37# namespace outer
38# {
39# namespace inner
40# {
41# namespace innermost
42# {
43# const int x = 2;
44# int foo (void) { return x; }
45# }
46#
47# namespace Innermost = innermost;
48#
49# const int x = 1;
50# int foo (void) { return x + Innermost::foo (); }
51# }
52#
53# namespace Inner = inner;
54#
55# const int x = 0;
56# int foo (void) { return x + Inner::foo (); }
57# }
58#
59# namespace Outer = outer;
60# namespace oi = Outer::Inner;
61
62set asm_file [standard_output_file $srcfile2]
63Dwarf::assemble $asm_file {
64 cu {} {
65 compile_unit {{language @DW_LANG_C_plus_plus}} {
66 declare_labels int_label outer_label inner_label innermost_label
67 declare_labels im_foo_label i_foo_label o_foo_label
68 declare_labels OuterInner_label oi1_label oi2_label
69
70 int_label: base_type {
71 {name int}
72 {encoding @DW_ATE_signed}
73 {byte_size 4 DW_FORM_sdata}
74 }
75
76 outer_label: DW_TAG_namespace {
77 {name outer}
78 } {
79 inner_label: DW_TAG_namespace {
80 {name inner}
81 } {
82 innermost_label: DW_TAG_namespace {
83 {name innermost}
84 } {
85 DW_TAG_variable {
86 {name x}
87 {type :$int_label}
88 {const_value 2 DW_FORM_data1}
89 }
90
91 im_foo_label: DW_TAG_subprogram {
92 {name foo}
cc73dbcc
DE
93 {external 1 flag_present}
94 {declaration 1 flag_present}
74921315
KS
95 }
96 }
97
98 imported_declaration {
99 {name Innermost}
100 {import :$innermost_label}
101 }
102
103 DW_TAG_variable {
104 {name x}
105 {type :$int_label}
106 {const_value 1 DW_FORM_data1}
107 }
108
109 i_foo_label: subprogram {
110 {name foo}
cc73dbcc
DE
111 {external 1 flag_present}
112 {declaration 1 flag_present}
74921315
KS
113 }
114 }
115
116 OuterInner_label: imported_declaration {
117 {name Inner}
118 {import :$inner_label}
119 }
120
121 DW_TAG_variable {
122 {name x}
123 {type :$int_label}
124 {const_value 0 DW_FORM_data1}
125 }
126
127 o_foo_label: subprogram {
128 {name foo}
cc73dbcc
DE
129 {external 1 flag_present}
130 {declaration 1 flag_present}
74921315
KS
131 }
132 }
133
134 imported_declaration {
135 {name Outer}
136 {import :$outer_label}
137 }
138
139 oi1_label: imported_declaration {
140 {name oi1}
141 {import :$OuterInner_label}
142 }
143
144 oi2_label: imported_declaration {
145 {name oi2}
146 {import :$oi1_label}
147 }
148
149 imported_declaration {
150 {name oi3}
151 {import :$oi2_label}
152 }
153
154 subprogram {
155 {specification :$im_foo_label}
621661e3
MR
156 {low_pc 0x4 DW_FORM_addr}
157 {high_pc 0x7 DW_FORM_addr}
74921315
KS
158 }
159
160 subprogram {
161 {specification :$i_foo_label}
621661e3
MR
162 {low_pc 0x8 DW_FORM_addr}
163 {high_pc 0xb DW_FORM_addr}
74921315
KS
164 }
165
166 subprogram {
167 {specification :$o_foo_label}
621661e3
MR
168 {low_pc 0xc DW_FORM_addr}
169 {high_pc 0xf DW_FORM_addr}
74921315
KS
170 }
171 }
172 }
173}
174
175if {[gdb_compile $srcdir/$subdir/$srcfile ${binfile}1.o \
176 object {c++ debug}] != ""} {
177 return -1
178}
179
180if {[gdb_compile $asm_file ${binfile}2.o object {nodebug}] != ""} {
181 return -1
182}
183
184if {[gdb_compile [list ${binfile}1.o ${binfile}2.o] \
185 $binfile executable {c++}] != ""} {
186 return -1
187}
188
189clean_restart $testfile
190
191# A procedure to run various tests on aliased namespaces.
192proc do_alias_tests {ns {real ""} {x ""}} {
193
194 # The "real" namespace is simply NS in all lowercase.
195 if {$real == ""} {
196 set real [string tolower $ns]
197 }
198
199 # The value of `x' is the number of '::' in NS.
200 if {$x == ""} {
201 set x [expr {[llength [split $ns ":"]] / 2}]
202 }
203
204 # Test "whatis"
205 gdb_test "whatis $ns" "type = $real"
206
207 # Test "ptype"
208 gdb_test "ptype $ns" "type = namespace $real"
209
210 # Print 'x'
211 send_log "expecting x = $x\n"
212 gdb_test "print ${ns}::x" " = $x"
213
214 # Attempt to list the function.
215 gdb_test_no_output "list ${ns}::foo"
216
217 # Attempt to break on the start of the function.
218 gdb_breakpoint "*${ns}::foo"
219
220 # And then erase it
221 with_test_prefix "($ns)" {
222 gdb_test_no_output "delete \$bpnum"
223 }
224}
225
226# This is a list of all the permutations to be tested. For troubleshooting
227# purposes, this list is explicitly enumerated.
228
229set permutations {}
230lappend permutations "outer"
231lappend permutations "Outer"
232lappend permutations "outer::inner"
233lappend permutations "Outer::inner"
234lappend permutations "outer::Inner"
235lappend permutations "Outer::Inner"
236lappend permutations "outer::inner::innermost"
237lappend permutations "outer::inner::Innermost"
238lappend permutations "outer::Inner::innermost"
239lappend permutations "outer::Inner::Innermost"
240lappend permutations "Outer::inner::innermost"
241lappend permutations "Outer::inner::Innermost"
242lappend permutations "Outer::Inner::innermost"
243lappend permutations "Outer::Inner::Innermost"
244
245foreach p $permutations {
246 do_alias_tests $p
247}
248
249# Test recursively imported aliases.
250foreach ns {"oi1" "oi2" "oi3"} {
251 do_alias_tests $ns "outer::inner" 1
252 do_alias_tests "${ns}::innermost" "outer::inner::innermost" 2
253 do_alias_tests "${ns}::Innermost" "outer::inner::innermost" 2
254}
255
256# Generate another objfile with nested imported declarations.
257
258set imports {
259 declare_labels n0_label
260
261 n0_label: DW_TAG_namespace {
262 {name n0}
263 } {
264 DW_TAG_variable {
265 {name x}
266 {type :$int_label}
267 {const_value 3 DW_FORM_data1}
268 }
269 }
270
271 declare_labels n0_import
272 n0_import: imported_declaration {
273 {name N0}
274 {import :$n0_label}
275 }
276}
277
278for {set i 1} {$i <= 100} {incr i} {
279 append imports [format "
280 declare_labels n%d_import
281 n%d_import: imported_declaration {
282 {name N%d}
283 {import :\$n%d_import}
284 }" $i $i $i [expr {$i - 1}]]
285}
286
287standard_testfile .cc nsalias-r-dw.S
288
289set asm_file [standard_output_file $srcfile2]
290set the_dwarf [format {
291 cu {} {
292 compile_unit {{language @DW_LANG_C_plus_plus}} {
293 declare_labels int_label n0_label
294
295 int_label: base_type {
296 {name int}
297 {encoding @DW_ATE_signed}
298 {byte_size 4 DW_FORM_sdata}
299 }
300
301%s
302 }
303 }
304} $imports]
305
306Dwarf::assemble $asm_file $the_dwarf
307
308if {[gdb_compile $asm_file ${binfile}3.o object {nodebug}] != ""} {
309 return -1
310}
311
312if {[gdb_compile [list ${binfile}1.o ${binfile}3.o] \
313 ${binfile}-r executable {c++}] != ""} {
314 return -1
315}
316
317clean_restart ${testfile}-r
318
319gdb_test_no_output "set complaints 1"
320gdb_test "print N100::x" \
321 ".* has too many recursively imported declarations.*" \
322 "compaint for too many recursively imported declarations"