# Copyright 2011-2019 Free Software Foundation, Inc. # # Contributed by Red Hat, originally written by Keith Seitz. # # 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 file is part of the gdb testsuite. proc add {var name params expected {kind {func}}} { upvar $var result if {[string compare $kind "template"] == 0} { set method_name "${name}<$expected>" } else { set method_name "$name" } set expect ".*// ${method_name}\\($expected\\)" lappend result [list "${method_name}($params)" $expect] } if {[skip_cplus_tests]} { continue } # Tests for c++/12266 et al standard_testfile .cc if {[prepare_for_testing "failed to prepare" $testfile $srcfile {c++ debug}]} { return -1 } if {![runto_main]} { perror "couldn't run to breakpoint" continue } array set typedefs { "my_other_type" {"my_other_type" "my_type" "const char* const*"} "my_other_type_2" {"my_other_type_2" "my_type_2" "int"} "CORE_ADDR" { "CORE_ADDR" "unsigned long" } "_BAR_" { "_BAR_" "a::b::BAR" "a::b::c::d::bar" } "aenum" { "aenum" "anon_enum" } "astruct" { "astruct" "anon_struct" } "aunion" { "aunion" "anon_union" } } set methods {} # Add the simple, one-parameter methods foreach meth {A::FOO::test A::FOO::foo} { foreach type {my_other_type my_other_type_2} { foreach t $typedefs($type) { add methods $meth $t $type } } } # Add two-parameter methods foreach meth {A::FOO::test A::FOO::foo} { set type "my_other_type_2, const my_other_type" foreach t1 $typedefs(my_other_type_2) { foreach t2 $typedefs(my_other_type) { add methods $meth "$t1, const $t2" $type add methods $meth "$t1, $t2" $type } } } # Add three-parameter methods/functions foreach meth {A::FOO::test A::FOO::foo B::test test} { set type "aenum, astruct const&, aunion const\\*\\*\\*" foreach t1 $typedefs(aenum) { foreach t2 $typedefs(astruct) { foreach t3 $typedefs(aunion) { add methods $meth "$t1, $t2 const&, $t3 const***" $type } } } } # Add the array-of-function pointer methods set type "fptr1\\*" foreach meth {A::FOO::test A::FOO::foo} { add methods $meth "fptr1*" $type foreach t $typedefs(my_other_type) { add methods $meth "void (**) ($t)" $type } } # Add the function pointer methods set type "fptr3" foreach meth {A::FOO::test A::FOO::foo} { add methods $meth "fptr3" $type foreach t1 $typedefs(my_other_type) { add methods $meth "void (*)(fptr2, $t1)" $type foreach t2 $typedefs(my_other_type_2) { add methods $meth "void (*)(void (*)(fptr1, $t2), $t1)" $type foreach t3 $typedefs(my_other_type) { add methods $meth \ "void (*)(void (*)(void (*) ($t3), $t2), $t1)" $type } } } } set type1 "my_other_type" set type2 "my_other_type, my_other_type_2" foreach meth {"test" "B::test"} { foreach t1 $typedefs(my_other_type) { add methods $meth $t1 $type1 foreach t2 $typedefs(my_other_type_2) { add methods $meth "$t1, $t2" $type2 template } } } # Miscellaneous tests set type {CORE_ADDR \(\*\) \[10\]} foreach meth {A::FOO::foo A::FOO::test} { foreach t $typedefs(CORE_ADDR) { add methods $meth "$t (*) \[10\]" $type } } foreach t $typedefs(_BAR_) { add methods "test" "$t&" {_BAR_&} } gdb_test_no_output "set listsize 1" "" # Finally, for each method in the list METHODS, check whether # the user can "list" it and "break" on it (both quoted and unquoted). foreach test $methods { set func [lindex $test 0] set result [lindex $test 1] gdb_test "list -qualified $func" $result gdb_test "list -qualified '$func'" $result if {[gdb_breakpoint "-qualified $func"]} { pass "break -qualified $func" } if {[gdb_breakpoint "-qualified '$func'"]} { pass "break -qualified '$func'" } } # The tests above use -qualified to explicitly pick the one "test" # symbol each test cares about. Now check that both "break test(..)" # and "list test(..)" without -qualified find "test(..)" in all the 3 # scopes that have the this particular overload. set func "test(aenum, astruct const&, aunion const***)" set func_re "test\\(anon_enum, anon_struct const&, anon_union const\\*\\*\\*\\)" set line1 [gdb_get_line_number " A::FOO::$func"] set line2 [gdb_get_line_number " B::$func"] set line3 [gdb_get_line_number " $func"] foreach f [list "$func" "'$func'"] { set any "\[^\r\n\]*" gdb_test \ "list $f" \ [multi_line \ "file: \".*$srcfile\", line number: $line1, symbol: \"A::foo::$func_re\"" \ "$line1${any}A::FOO::test${any}" \ "file: \".*$srcfile\", line number: $line2, symbol: \"B::$func_re\"" \ "$line2${any}B::test${any}" \ "file: \".*$srcfile\", line number: $line3, symbol: \"$func_re\"" \ "$line3${any}// test${any}"] \ "list $f" delete_breakpoints gdb_test "break $f" "\\(3 locations\\)" } gdb_exit return 0