1# Copyright 2017-2023 Free Software Foundation, Inc. 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# This file is part of the gdb testsuite. 17 18# Test ABI tag support in linespecs. 19 20load_lib completion-support.exp 21 22standard_testfile cpls-abi-tag.cc 23 24if {[prepare_for_testing "failed to prepare" $testfile \ 25 [list $srcfile] {c++ debug}]} { 26 return -1 27} 28 29# Tests below are about tab-completion, which doesn't work if readline 30# library isn't used. Check it first. 31 32if { ![readline_is_used] } { 33 untested "no tab completion support without readline" 34 return -1 35} 36 37gdb_test_no_output "set max-completions unlimited" 38 39# Check that the explicit location completer manages to find the next 40# option name after a -function option, when the -function's argument 41# is a function with an ABI tag. 42 43proc check_explicit_skips_function_argument {function} { 44 test_gdb_complete_unique \ 45 "b -function $function -sour" \ 46 "b -function $function -source" 47} 48 49# The ABI tag tests. 50 51proc_with_prefix test_abi_tag {} { 52 with_test_prefix "completion" { 53 foreach cmd_prefix {"b" "b -function"} { 54 # Complete all prefixes between "_funcio" and the full 55 # prototype. The ABI tag is not considered for actual 56 # completion. 57 58 with_test_prefix "skip tag" { 59 # set location "test_abi_tag_function\[abi:tag1\](int)" 60 set location "test_abi_tag_function(int)" 61 set line "$cmd_prefix $location" 62 set start [index_after "_functio" $line] 63 test_complete_prefix_range $line $start 64 } 65 66 # Now the same, but start completing at the [. In that case, 67 # GDB considers the ABI tag as part of actual completion. 68 with_test_prefix "at tag" { 69 set location "test_abi_tag_function\[abi:tag1\](int)" 70 set line "$cmd_prefix $location" 71 set start [index_after "_function" $line] 72 test_complete_prefix_range $line $start 73 } 74 75 # Same, but with extra spaces. Note that the original spaces in 76 # the input line are preserved after completion. 77 78 with_test_prefix "spaces" { 79 test_gdb_complete_unique \ 80 "$cmd_prefix test_abi_tag_function \[abi:tag1\] (" \ 81 "$cmd_prefix test_abi_tag_function \[abi:tag1\] (int)" 82 83 test_gdb_complete_unique \ 84 "$cmd_prefix test_abi_tag_function \[abi:tag1\] ( int " \ 85 "$cmd_prefix test_abi_tag_function \[abi:tag1\] ( int )" 86 } 87 } 88 } 89 90 with_test_prefix "set breakpoints" { 91 foreach cmd_prefix {"b" "b -function"} { 92 # Test setting breakpoints. If the symbol name has an ABI 93 # tag, but the input linespec doesn't, then the ABI tag in the 94 # symbol name is ignored. 95 set linespec_list { 96 "test_abi_tag_function" 97 "test_abi_tag_function[abi:tag1]" 98 "test_abi_tag_function[abi:tag1](int)" 99 "test_abi_tag_function [abi:tag1]" 100 "test_abi_tag_function [abi:tag1] ( int )" 101 "test_abi_tag_function(int)" 102 "test_abi_tag_function (int)" 103 "test_abi_tag_function ( int )" 104 } 105 foreach linespec $linespec_list { 106 check_bp_locations_match_list \ 107 "$cmd_prefix $linespec" [list $location] 108 } 109 } 110 } 111 112 with_test_prefix "set breakpoints wrong ABI tag" { 113 foreach cmd_prefix {"b" "b -function"} { 114 # Test setting breakpoints with the wrong ABI tag. Should 115 # fail to create the breakpoints. Completion should not find 116 # any match either. 117 set linespec_list { 118 "test_abi_tag_function[abi:tag2]" 119 "test_abi_tag_function[abi:tag2](int)" 120 "test_abi_tag_function [abi:tag2]" 121 "test_abi_tag_function [abi:tag2] ( int )" 122 } 123 foreach linespec $linespec_list { 124 check_setting_bp_fails "$cmd_prefix $linespec" 125 test_gdb_complete_none "$cmd_prefix $linespec" 126 } 127 128 } 129 } 130 131 # Test completion of overloaded functions with ABI tags. 132 with_test_prefix "completion of overloaded functions" { 133 foreach cmd_prefix {"b" "b -function"} { 134 set completion_list { 135 "test_abi_tag_ovld_function[abi:tag1]()" 136 "test_abi_tag_ovld_function[abi:tag1](int)" 137 } 138 139 # If the input string does not include the ABI tag, then 140 # actual completion ignores it. 141 test_gdb_complete_multiple \ 142 "$cmd_prefix " "test_abi_tag_ovld_f" "unction(" \ 143 $completion_list 144 145 # Otherwise, it's considered. 146 test_gdb_complete_multiple \ 147 "$cmd_prefix " "test_abi_tag_ovld_function\[" "abi:tag1\](" \ 148 $completion_list 149 150 } 151 } 152 153 # Test setting breakpoints on overloaded functions with ABI tags. 154 with_test_prefix "breakpoints on overloaded functions" { 155 foreach cmd_prefix {"b" "b -function"} { 156 set completion_list { 157 "test_abi_tag_ovld_function[abi:tag1]()" 158 "test_abi_tag_ovld_function[abi:tag1](int)" 159 } 160 set location_list { 161 "test_abi_tag_ovld_function" 162 "test_abi_tag_ovld_function[abi:tag1]" 163 } 164 foreach linespec $location_list { 165 check_bp_locations_match_list \ 166 "$cmd_prefix $linespec" $completion_list 167 } 168 169 } 170 } 171 172 with_test_prefix "completion of overloaded functions different abi" { 173 foreach cmd_prefix {"b" "b -function"} { 174 # Test completion of overloaded functions with ABI tags. 175 set completion_list { 176 "test_abi_tag_ovld2_function()" 177 "test_abi_tag_ovld2_function[abi:tag1](short)" 178 "test_abi_tag_ovld2_function[abi:tag2](int)" 179 "test_abi_tag_ovld2_function[abi:tag2](long)" 180 } 181 182 # If the input string does not include the ABI tag, then 183 # actual completion ignores it. 184 test_gdb_complete_multiple \ 185 "$cmd_prefix " "test_abi_tag_ovld2_f" "unction(" \ 186 $completion_list 187 188 # Otherwise, it's considered. Match stops at the part of 189 # the tag that diverges, and the completion list only 190 # shows matches with ABI tags. 191 set completion_list { 192 "test_abi_tag_ovld2_function[abi:tag1](short)" 193 "test_abi_tag_ovld2_function[abi:tag2](int)" 194 "test_abi_tag_ovld2_function[abi:tag2](long)" 195 } 196 test_gdb_complete_multiple \ 197 "$cmd_prefix " "test_abi_tag_ovld2_function\[" "abi:tag" \ 198 $completion_list 199 200 # If you disambiguate, matches include only locations for 201 # the specified tag. 202 set completion_list { 203 "test_abi_tag_ovld2_function[abi:tag2](int)" 204 "test_abi_tag_ovld2_function[abi:tag2](long)" 205 } 206 test_gdb_complete_multiple \ 207 "$cmd_prefix " "test_abi_tag_ovld2_function\[abi:tag2" "\](" \ 208 $completion_list 209 210 test_gdb_complete_unique \ 211 "$cmd_prefix test_abi_tag_ovld2_function\[abi:tag1" \ 212 "$cmd_prefix test_abi_tag_ovld2_function\[abi:tag1\](short)" 213 } 214 } 215 216 with_test_prefix "completion of struct prefixes with tags" { 217 foreach cmd_prefix {"b" "b -function"} { 218 # Test completion of methods of structs with ABI tags. 219 set completion_list { 220 "test_abi_tag_struct[abi:tag1]::test_abi_tag_struct[abi:tag2]()" 221 "test_abi_tag_struct[abi:tag1]::~test_abi_tag_struct[abi:tag2]()" 222 } 223 224 # If the input string does not include the ABI tag, then 225 # actual completion ignores it. 226 test_gdb_complete_multiple \ 227 "$cmd_prefix " "test_abi_tag_struc" "t::" \ 228 $completion_list 229 230 # Otherwise, it's considered. 231 test_gdb_complete_multiple \ 232 "$cmd_prefix " "test_abi_tag_struct\[" "abi:tag1\]::" \ 233 $completion_list 234 235 # Mix and match different abi tag positions. 236 test_gdb_complete_unique \ 237 "$cmd_prefix test_abi_tag_struct::t" \ 238 "$cmd_prefix test_abi_tag_struct::test_abi_tag_struct()" 239 240 test_gdb_complete_unique \ 241 "$cmd_prefix test_abi_tag_struct\[abi:tag1\]::t" \ 242 "$cmd_prefix test_abi_tag_struct\[abi:tag1\]::test_abi_tag_struct()" 243 244 test_gdb_complete_unique \ 245 "$cmd_prefix test_abi_tag_struct\[abi:tag1\]::test_abi_tag_struct\[" \ 246 "$cmd_prefix test_abi_tag_struct\[abi:tag1\]::test_abi_tag_struct\[abi:tag2\]()" 247 } 248 } 249 250 with_test_prefix "abi tag in parameters" { 251 foreach cmd_prefix {"b" "b -function"} { 252 # Complete all prefixes between "_funcio" and the full 253 # prototype. The ABI tag is not considered for actual 254 # completion. 255 256 set completion_list { 257 "test_abi_tag_in_params(abi_tag_param_struct1[abi:tag2])" 258 "test_abi_tag_in_params(abi_tag_param_struct1[abi:tag2], abi_tag_param_struct2[abi:tag2])" 259 } 260 # If the input string does not include the ABI tag, then 261 # actual completion ignores it. 262 test_gdb_complete_multiple \ 263 "$cmd_prefix " "test_abi_tag_in_para" "ms(abi_tag_param_struct1" \ 264 $completion_list 265 266 # If OTOH the input string includes the ABI tag, then it 267 # is considered. 268 test_gdb_complete_multiple \ 269 "$cmd_prefix " "test_abi_tag_in_params(abi_tag_param_struct1\[ab" "i:tag2\]"\ 270 $completion_list 271 272 set location_list { 273 "test_abi_tag_in_params(abi_tag_param_struct1[abi:tag2], abi_tag_param_struct2[abi:tag2])" 274 } 275 276 set tags {"" "\[abi:tag2\]"} 277 foreach tag1 $tags { 278 foreach tag2 $tags { 279 set linespec "test_abi_tag_in_params(abi_tag_param_struct1${tag1}, abi_tag_param_struct2${tag2})" 280 check_bp_locations_match_list \ 281 "$cmd_prefix $linespec" $location_list 282 } 283 } 284 } 285 } 286 287 # Check that the explicit location completer manages to find the 288 # option name after -function, when the -function's argument is a 289 # function with an ABI tag. 290 check_explicit_skips_function_argument \ 291 "test_abi_tag_function\[abi:unknown\](int)" 292} 293 294test_abi_tag 295