# This testcase is part of GDB, the GNU debugger. # Copyright 2018-2021 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 . # This test verifies the TYPEREGEXP and NAMEREGEXP matching logic # in the commands # info [args|functions|locals|variables] [-q] [-t TYPEREGEXP] [NAMEREGEXP]. standard_testfile if { [prepare_for_testing "failed to prepare" ${testfile}] } { return -1 } clean_restart ${binfile} if ![runto setup_done] then { fail "can't run to setup_done" return 0 } set any "\[^\r\n\]*" set ws "\[ \t\]\+" set number "\[0-9]\+" ############# Test 'info functions'. with_test_prefix "info functions nameregexp" { foreach cmd { "info functions info_fun" "info functions -- info_fun" "info functions ^info_fun" } { gdb_test $cmd \ [multi_line \ "All functions matching regular expression \".*info_fun.*\":" \ "" \ "File .*info_qt.c:" \ "${number}: void info_fun1\\\(void\\\);" \ "${number}: int info_fun2\\\(char\\\);" \ "${number}: int info_fun2bis\\\(char\\\);" \ "${number}: entier info_fun2xxx\\\(char, int, int\\\);" \ "${number}: entier info_fun2yyy\\\(char, int, int\\\);" \ ] } } with_test_prefix "info functions nameregexp quiet" { foreach cmd { "info functions -q info_fun" "info functions -q -- info_fun" } { gdb_test $cmd \ [multi_line \ "" \ "File .*info_qt.c:" \ "${number}: void info_fun1\\\(void\\\);" \ "${number}: int info_fun2\\\(char\\\);" \ "${number}: int info_fun2bis\\\(char\\\);" \ "${number}: entier info_fun2xxx\\\(char, int, int\\\);" \ "${number}: entier info_fun2yyy\\\(char, int, int\\\);" \ ] } } with_test_prefix "info functions nameregexp quiet no match" { foreach cmd { "info functions -q nowaythiscanmatch" "info functions -q -- -q" } { gdb_test_no_output $cmd } } with_test_prefix "info functions typeregexp nameregexp" { foreach cmd { "info functions -t entier -q info_fun" "info functions -q -t 'entier (' -- info_fun" "info functions -q -t '(char, int, int)' -- info_fun" "info functions -q -t 'entier (char, int, int)' -- info_fun" } { gdb_test $cmd \ [multi_line \ "" \ "File .*info_qt.c:" \ "${number}: entier info_fun2xxx\\\(char, int, int\\\);" \ "${number}: entier info_fun2yyy\\\(char, int, int\\\);" \ ] } } with_test_prefix "info functions typeregexp nameregexp no match" { gdb_test_no_output "info functions -t ganze_Zahl -q info_fun" \ "quiet output info functions no matching type" } ############# Test 'info variables'. with_test_prefix "info variables nameregexp" { foreach cmd { "info variables info_qt" "info variables -- info_qt" "info variables ^info_qt" } { gdb_test $cmd \ [multi_line \ "All variables matching regular expression \".*info_qt.*\":" \ "" \ "File .*info_qt.c:" \ "${number}: entier info_qt_ent;" \ "${number}: int info_qt_inc;" \ ] } } with_test_prefix "info variables nameregexp quiet no match" { foreach cmd { "info variables -q nowaythiscanmatch" "info variables -q -- -q" } { gdb_test_no_output $cmd } } with_test_prefix "info variables typeregexp nameregexp quiet" { foreach cmd { "info variables -t entier -q info_qt" "info variables -q -t entier -- info_qt" } { gdb_test $cmd \ [multi_line \ "" \ "File .*info_qt.c:" \ "${number}: entier info_qt_ent;" \ ] } } with_test_prefix "info variables typeregexp nameregexp quiet no match" { gdb_test_no_output "info variables -t ganze_Zahl -q info_at" \ "quiet output info variables no matching type" } ############# Test 'info args' in function setup. gdb_test "frame 1" ".* in setup .*" "set frame 1 for info args" with_test_prefix "info args matching all args" { foreach cmd { "info args" "info args arg_" "info args g" "info args -- .*" } { gdb_test $cmd \ [multi_line \ "arg_c = 100 'd'" \ "arg_i = 3" \ "arg_j = 4" \ ] } } with_test_prefix "info args matching some args" { foreach cmd { "info args -t int" "info args arg_[ij]"} { gdb_test $cmd \ [multi_line \ "arg_i = 3" \ "arg_j = 4" \ ] } } with_test_prefix "info args no match" { gdb_test "info args nowaythiscanmatch" "No matching arguments." "no matching args" gdb_test_no_output "info args -q nowaythiscanmatch" "quiet no matching args" gdb_test_no_output "info args -q -t entier" "quiet no matching args with type" } ############# Test 'info locals' in function setup. gdb_test "frame 1" ".* in setup .*" "set frame 1 for info locals" with_test_prefix "info locals matching all locals" { foreach cmd { "info locals" "info locals loc_arg_" "info locals g" "info locals -- .*" } { gdb_test $cmd \ [multi_line \ "loc_arg_c = 100 'd'" \ "loc_arg_i = 3" \ "loc_arg_j = 4" \ ] } } with_test_prefix "info locals matching some locals" { foreach cmd { "info locals -t int" "info locals arg_[ij]" "info locals loc_arg_[ij]"} { gdb_test $cmd \ [multi_line \ "loc_arg_i = 3" \ "loc_arg_j = 4" \ ] } } with_test_prefix "info locals no match" { gdb_test "info locals nowaythiscanmatch" "No matching locals." "no matching locals" gdb_test_no_output "info locals -q nowaythiscanmatch" "quiet no matching locals" gdb_test_no_output "info locals -q -t ganze_Zahl loc" "quiet no matching locals with type" } # Verify that the rest of the args is taken as a single regexp. with_test_prefix "rest of args as single regexp" { gdb_test "info functions abc def" \ "All functions matching regular expression \\\"abc def\\\":" \ "single regexp" gdb_test "info functions -t uvw abc def" \ "All functions matching regular expression \\\"abc def\\\" with type matching regular expression \\\"uvw\\\":" \ "-t noquote single regexp" gdb_test "info functions -t 'uvw xyz' abc def" \ "All functions matching regular expression \\\"abc def\\\" with type matching regular expression \\\"uvw xyz\\\":" \ "-t quote single regexp" }