From fd336a18dfa251dab345e0541133fdc2cf50244c Mon Sep 17 00:00:00 2001 From: Keith Seitz Date: Tue, 31 May 2011 22:14:21 +0000 Subject: [PATCH] PR c++/12750 * gdb.cp/static-method.cc: New file. * gdb.cp/static-method.exp: New file. --- gdb/testsuite/ChangeLog | 6 ++ gdb/testsuite/gdb.cp/static-method.cc | 46 +++++++++++++++ gdb/testsuite/gdb.cp/static-method.exp | 82 ++++++++++++++++++++++++++ 3 files changed, 134 insertions(+) create mode 100644 gdb/testsuite/gdb.cp/static-method.cc create mode 100644 gdb/testsuite/gdb.cp/static-method.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 2e5e4cb762..eab307b129 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-05-31 Keith Seitz + + PR c++/12750 + * gdb.cp/static-method.cc: New file. + * gdb.cp/static-method.exp: New file. + 2010-05-31 Keith Seitz PR symtab/12704 diff --git a/gdb/testsuite/gdb.cp/static-method.cc b/gdb/testsuite/gdb.cp/static-method.cc new file mode 100644 index 0000000000..5d8e0b9742 --- /dev/null +++ b/gdb/testsuite/gdb.cp/static-method.cc @@ -0,0 +1,46 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011 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 . */ + +namespace xxx +{ + namespace + { + static int func (void) { return 0; } // xxx::func + class A + { + public: + static int func (void) { return 0; } // xxx::A::func + }; + } +} + +int +test_function (void) +{ + return xxx::func () + xxx::A::func (); +} + +int +main (void) +{ + int i, x; + + for (i = 0; i < 1000; ++i) + x += test_function (); + + return x; +} diff --git a/gdb/testsuite/gdb.cp/static-method.exp b/gdb/testsuite/gdb.cp/static-method.exp new file mode 100644 index 0000000000..9867c2c532 --- /dev/null +++ b/gdb/testsuite/gdb.cp/static-method.exp @@ -0,0 +1,82 @@ +# Copyright 2011 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. + +# A helper proc which sets a breakpoint at FUNC and attempts to +# run to the breakpoint. +proc test_breakpoint {func result} { + set DEC {[0-9]} + + # Return to the top of the test function every time. + delete_breakpoints + if {![gdb_breakpoint test_function]} { + fail "set test_function breakpoint for $func" + } elseif {[gdb_test "continue" \ + "Continuing.\r\n\r\nBreakpoint $DEC+,.*test_function.*" \ + ""] != 0} { + fail "continue to test_function for $func" + } else { + gdb_breakpoint "$func" + gdb_test "continue" \ + "Continuing.\r\n\r\nBreakpoint $DEC+,.*$result.*" \ + "continue to $func" + } +} + +if {[skip_cplus_tests]} { continue } + +# Tests for c++/12750 +set testfile "static-method" +set srcfile $testfile.cc + +if {[prepare_for_testing $testfile $testfile $srcfile {c++ debug}]} { + return -1 +} + +if {![runto_main]} { + perror "couldn't run to breakpoint" + continue +} + +set ans {(anonymous namespace)} +set methods {} +lappend methods "xxx::${ans}::func" +lappend methods "xxx::${ans}::A::func" + +gdb_test_no_output "set listsize 1" "" + +foreach test $methods { + # The result we expect is the source code name of the symbol, + # i.e., without "(anonymous namespace)". + regsub -all [string_to_regexp "${ans}::"] $test "" expected + set result ".*// [string_to_regexp $expected]" + + # Test whether the function/method can be "list"ed + # with the filename pre-pended. + gdb_test "list ${srcfile}:$test" $result + gdb_test "list '${srcfile}:$test'" $result + gdb_test "list '${srcfile}':$test'" $result + gdb_test "list ${srcfile}:'$test'" $result + + # Test setting and hitting a breakoint at the function/method. + test_breakpoint $test $expected + test_breakpoint "'$test'" $expected +} + +gdb_exit +return 0