Automatic Copyright Year update after running gdb/copyright.py
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.cp / demangle.exp
CommitLineData
88b9d363 1# Copyright (C) 1992-2022 Free Software Foundation, Inc.
c906108c
SS
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
e22f8b7c 5# the Free Software Foundation; either version 3 of the License, or
c906108c 6# (at your option) any later version.
e22f8b7c 7#
c906108c
SS
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.
e22f8b7c 12#
c906108c 13# You should have received a copy of the GNU General Public License
e22f8b7c 14# along with this program. If not, see <http://www.gnu.org/licenses/>.
c906108c 15
c906108c
SS
16# This file was written by Fred Fish. (fnf@cygnus.com)
17
d4f3574e
SS
18if { [skip_cplus_tests] } { continue }
19
7a292a7a
SS
20### The demangling style we last sent to GDB.
21set current_demangling_style none
c906108c 22
7a292a7a
SS
23### Set GDB's current demangling style to STYLE. Subsequent calls to
24### test_demangle will include STYLE in the test name when reporting
25### passes and failures.
26proc set_demangling_style {style} {
c906108c 27 global gdb_prompt
7a292a7a 28 global current_demangling_style
c906108c 29
f8d3bf8f
MS
30 gdb_test_multiple "set demangle-style $style" \
31 "$style: set demangle-style" {
32 -re "set demangle-style $style\[\r\n\]+$gdb_prompt $" {
33 pass "$style: set demangle-style"
34 }
35 -re ".*$gdb_prompt $" {
36 fail "$style: set demangle-style"
37 error "set_demangling_style: set style"
38 }
39 timeout {
40 fail "$style: set demangle-style (timeout)"
41 error "set_demangling_style: set style"
42 }
7a292a7a 43 }
c906108c 44
f8d3bf8f
MS
45 gdb_test_multiple "show demangle-style" \
46 "$style: check demangling style" {
47 -re "The current C\[+\]+ demangling style is \"$style\".\r\n$gdb_prompt $" {
48 pass "$style: check demangling style"
49 }
50 -re ".*$gdb_prompt $" {
51 fail "$style: check demangling style"
52 error "set_demangling_style: check style"
53 }
54 timeout {
55 fail "$style: check demangling style (timeout)"
56 error "set_demangling_style: check style"
57 }
7a292a7a 58 }
c906108c 59
7a292a7a
SS
60 set current_demangling_style $style
61}
62
63
64### Utility function for test_demangling and test_demangling_exact.
65proc test_demangling_core {tester test result} {
66 global current_demangling_style
67
68 if {! [regexp {^([^ ]+): (.+)$} $test dummy style name]} {
69 error "bad test name passed to test_demangling"
70 }
71
72 if {[string compare $style $current_demangling_style]} {
c0f55cc6
AV
73 with_test_prefix $test {
74 set_demangling_style $style
75 }
7a292a7a
SS
76 }
77
439250fb 78 $tester "demangle $name" $result $test
7a292a7a
SS
79}
80
81### Demangle an identifier, and check that the result matches a pattern.
82###
83### TEST should be of the form "STYLE: NAME", where STYLE is the name
84### of a demangling style (like "gnu" or "arm"), and NAME is a mangled
85### identifier to demangle. Pass when the result matches the regular
86### expression RESULT. Report passes and fails using TEST as the name
87### of the test.
88###
89### Why don't we just pass the STYLE and NAME as two separate
90### arguments, or let the style be a global variable? That would be
91### cleaner. However, doing it this way means that:
92###
93### 1) the name of the test, as recorded in the summary and log,
94### appears verbatim in the script, and
95###
96### 2) that test names are unique, even though we try to demangle the same
97### identifiers using several different mangling styles.
98###
99### This makes it a lot easier for people tracking down failures to
100### find the one they care about.
101
102proc test_demangling {test result} {
103 test_demangling_core gdb_test $test $result
104}
105
106### Like test_demangling, above, except that RESULT is not a regexp,
107### but a string that must match exactly.
108
109proc test_demangling_exact {test result} {
110 test_demangling_core gdb_test_exact $test $result
111}
112
7a292a7a 113#
041be526 114# Test gnu-v3 style name demangling
7a292a7a
SS
115#
116
041be526 117proc test_gnuv3_style_demangling {} {
e017c81f
DJ
118 global gdb_prompt
119
c0f55cc6
AV
120 # Rvalue reference tests
121 test_demangling_exact "gnu-v3: _ZN9ArrowLine19ArrowheadIntersectsEP9ArrowheadO6BoxObjP7Graphic" "ArrowLine::ArrowheadIntersects(Arrowhead*, BoxObj&&, Graphic*)"
122 test_demangling "gnu-v3: _Z13BitPatterntoaOK10BitPatternccc" \
123 "BitPatterntoa\[(\]+(const BitPattern|BitPattern const)&&, char, char, char\[)\]+"
124 test_demangling_exact "gnu-v3: _ZN8TextCode14CoreConstDeclsEO7ostream" "TextCode::CoreConstDecls(ostream&&)"
125 test_demangling "gnu-v3: _Z31DrawDestinationTransformedImageP7_XImageiiS0_iimjiijmmP4_XGCOK13ivTransformeriiii" \
126 "DrawDestinationTransformedImage\[(\]+_XImage\[*\]+, int, int, _XImage\[*\]+, int, int, unsigned long, unsigned int, int, int, unsigned int, unsigned long, unsigned long, _XGC\[*\]+, (const ivTransformer|ivTransformer const)&&, int, int, int, int\[)\]+"
127 test_demangling_exact "gnu-v3: _ZN11RelateManip6EffectEO7ivEvent" "RelateManip::Effect(ivEvent&&)"
128 test_demangling_exact "gnu-v3: _ZN20DisplayList_IteratorC4EO11DisplayList" "DisplayList_Iterator::DisplayList_Iterator(DisplayList&&)"
129 test_demangling_exact "gnu-v3: _ZN3fooC4EOS_" "foo::foo(foo&&)"
130 test_demangling_exact "gnu-v3: _ZN3fooC4EiOS_iS0_iS0_" "foo::foo(int, foo&&, int, foo&&, int, foo&&)"
131 test_demangling "gnu-v3: _ZN7ivWorldC2EPKcOiPPcPK12ivOptionDescPK14ivPropertyData" \
132 "ivWorld::ivWorld\[(\]+(const char|char const)\[*\]+, int&&, char\[*\]+\[*\]+, (const ivOptionDesc|ivOptionDesc const)\[*\]+, (const ivPropertyData|ivPropertyData const)\[*\]+\[)\]+"
133 test_demangling "gnu-v3: _Z3argOK7Complex" \
134 "arg\[(\]+(const Complex|Complex const)&&\[)\]+"
135 test_demangling "gnu-v3: _ZNK9BitString8containsEOK10BitPattern" \
136 "BitString::contains\[(\]+(const BitPattern|BitPattern const)&&\[)\]+ const"
137 test_demangling "gnu-v3: _ZNK9BitString8containsEOK12BitSubStringi" \
138 "BitString::contains\[(\]+(const BitSubString|BitSubString const)&&, int\[)\]+ const"
139 test_demangling "gnu-v3: _ZNK9BitString8containsEOKS_" \
140 "BitString::contains\[(\]+(const BitString|BitString const)&&\[)\]+ const"
141 test_demangling_exact "gnu-v3: _ZN4ListI10VHDLEntityE3PixC4EOKS2_" \
142 "List<VHDLEntity>::Pix::Pix(List<VHDLEntity>::Pix const&&)"
143 test_demangling_exact "gnu-v3: _ZN4ListI10VHDLEntityE7elementC2EOKS0_PS2_" \
144 "List<VHDLEntity>::element::element(VHDLEntity const&&, List<VHDLEntity>::element*)"
145 test_demangling_exact "gnu-v3: _ZN4ListI10VHDLEntityE7elementC4EOKS2_" \
146 "List<VHDLEntity>::element::element(List<VHDLEntity>::element const&&)"
147 test_demangling_exact "gnu-v3: _ZNK4ListI10VHDLEntityEclEOKNS1_3PixE" \
148 "List<VHDLEntity>::operator()(List<VHDLEntity>::Pix const&&) const"
149 test_demangling_exact "gnu-v3: _ZN4ListI10VHDLEntityEC4EOKS1_" \
150 "List<VHDLEntity>::List(List<VHDLEntity> const&&)"
151 test_demangling_exact "gnu-v3: _ZN4PixXI11VHDLLibrary14VHDLLibraryRep4ListI10VHDLEntityEEC2EOKS5_" \
152 "PixX<VHDLLibrary, VHDLLibraryRep, List<VHDLEntity> >::PixX(PixX<VHDLLibrary, VHDLLibraryRep, List<VHDLEntity> > const&&)"
153 test_demangling_exact "gnu-v3: _ZNK11VHDLLibrary5nextEEO4PixXIS_14VHDLLibraryRep4ListI10VHDLEntityEE" \
154 "VHDLLibrary::nextE(PixX<VHDLLibrary, VHDLLibraryRep, List<VHDLEntity> >&&) const"
155 test_demangling_exact "gnu-v3: _ZNK4ListI10VHDLEntityE4nextEONS1_3PixE" \
156 "List<VHDLEntity>::next(List<VHDLEntity>::Pix&&) const"
c906108c
SS
157}
158
7a292a7a
SS
159proc catch_demangling_errors {command} {
160 if {[catch $command result]} {
161 puts "ERROR: demangle.exp: while running $command: $result"
162 }
c906108c 163}
7a292a7a 164
c906108c
SS
165# Test support for different demangling styles. Note that this does
166# not depend upon running the test program and does not depend upon
167# gdb being able to lookup any C++ symbols. It simply calls the
168# internal demangler with synthesized strings and tests the results.
169
170proc do_tests {} {
c906108c
SS
171 global subdir
172 global gdb_prompt
173
c906108c
SS
174
175 # Start with a fresh gdb.
176
177 gdb_exit
178 gdb_start
179
f8d3bf8f
MS
180 gdb_test_no_output "set language c++"
181 gdb_test_no_output "set width 0"
7a292a7a
SS
182
183 # Using catch_demangling_errors this way ensures that, if one of
184 # the functions raises a Tcl error, then it'll get reported, and
185 # the rest of the functions will still run.
041be526 186 catch_demangling_errors test_gnuv3_style_demangling
439250fb
DE
187
188 # Verify specifying demangle language.
189 gdb_test_no_output "set language unknown"
190 set_demangling_style "auto"
191 gdb_test_exact "demangle -l c++ -- _ZSt4cout" "std::cout"
192 gdb_test_exact "demangle -l c++ _ZSt4cout" "std::cout"
193 gdb_test_exact "demangle -l c -- _ZSt4cout" "Can't demangle \"_ZSt4cout\""
194 gdb_test_exact "demangle -l garbage xyzdje" "Unknown language \"garbage\""
c906108c
SS
195}
196
197do_tests
This page took 2.420952 seconds and 4 git commands to generate.