| # Copyright 2003-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 <http://www.gnu.org/licenses/>. |
| |
| |
| # This file tests C++-specific maintenance commands and help on those. |
| |
| # Currently, no source file is used. |
| |
| # Test the help messages. |
| |
| proc test_help {} { |
| set first_component_help "Print the first class/namespace component of NAME" |
| set namespace_help "Deprecated placeholder for removed functionality." |
| |
| test_prefix_command_help {"maintenance cplus"} { |
| "C\\+\\+ maintenance commands\.\[\r\n\]+" |
| } |
| |
| test_prefix_command_help {"maint cp" "maintenance cplus"} { |
| "C\\+\\+ maintenance commands.\r\n\r\n" |
| } |
| |
| set multiple_help_body "List of maintenance cplus subcommands:.*Command name abbreviations are allowed if unambiguous." |
| |
| gdb_test "maint cp" $multiple_help_body |
| |
| gdb_test "help maint cp first_component" "${first_component_help}." |
| gdb_test "help maint cp namespace" "${namespace_help}." |
| } |
| |
| # This is used when NAME should contain only a single component. Be |
| # careful to make sure that parentheses get escaped properly. |
| proc test_single_component {name} { |
| set matchname [string_to_regexp "$name"] |
| gdb_test "maint cp first_component $name" "$matchname" |
| } |
| |
| # This is used when NAME is invalid. |
| proc test_invalid_name {name} { |
| set matchname [string_to_regexp "$name"] |
| gdb_test "maint cp first_component $name" \ |
| "During symbol reading: unexpected demangled name '$matchname'\r\n$matchname" |
| } |
| |
| proc test_first_component {} { |
| # The function in question might complain; make sure that we see |
| # all complaints. |
| |
| gdb_test_no_output "set complaints 1000" |
| |
| test_single_component "foo" |
| |
| foreach spc [list "" " " " "] { |
| test_single_component "operator${spc}<<" |
| test_single_component "operator${spc}>>" |
| test_single_component "operator${spc}->" |
| test_single_component "operator${spc}()" |
| test_single_component "operator${spc}>" |
| test_single_component "operator${spc}<" |
| |
| test_single_component "foo${spc}()" |
| test_single_component "foo${spc}(int)" |
| test_single_component "foo${spc}(X::Y)" |
| test_single_component "foo${spc}(X::Y, A::B)" |
| test_single_component "foo${spc}(std::basic_streambuf<wchar_t,std::char_traits<wchar_t> >)" |
| test_single_component "operator>${spc}(X::Y)" |
| } |
| |
| # Operator names can show up in weird places. |
| |
| test_single_component "int operator<< <char>()" |
| test_single_component "T<Cooperator>" |
| |
| # NOTE: carlton/2003-04-23: I've only seen the first of these |
| # produced by the demangler, but I'm including two more just to be |
| # on the safe side. |
| test_single_component "int foo<&(operator<<(C, C))>()" |
| test_single_component "int foo<&operator<<(C, C)>()" |
| test_single_component "int foo<operator<<(C, C)>()" |
| |
| gdb_test "maint cp first_component foo::bar" "foo" |
| gdb_test "maint cp first_component foo::bar::baz" "foo" |
| gdb_test "maint cp first_component C<A>::bar" "C<A>" |
| gdb_test "maint cp first_component C<std::basic_streambuf<wchar_t,std::char_traits<wchar_t> > >::bar" "C<std::basic_streambuf<wchar_t,std::char_traits<wchar_t> > >" |
| |
| # Make sure we behave appropriately on invalid input. |
| |
| # NOTE: carlton/2003-06-25: As of today, the demangler can in fact |
| # produce examples like the third case below: there really should |
| # be a space between the two <'s. See PR gdb/1245. |
| |
| test_invalid_name "foo<" |
| test_invalid_name "foo(" |
| test_invalid_name "bool operator<<char>" |
| } |
| |
| proc test_namespace {} { |
| gdb_test "maint cp namespace" "The `maint namespace' command was removed." |
| } |
| |
| gdb_exit |
| gdb_start |
| |
| test_help |
| test_first_component |
| test_namespace |
| |
| gdb_exit |
| return 0 |