diff options
author | Siva Chandra <sivachandra@chromium.org> | 2014-10-18 06:14:00 -0700 |
---|---|---|
committer | Siva Chandra <sivachandra@chromium.org> | 2014-11-03 18:01:39 -0800 |
commit | e0f52461c2467b6610391681fa27cd9b3c5def57 (patch) | |
tree | dd366cad441389a5483994a0c6ad2454464ac4e2 /gdb/testsuite | |
parent | f868b157aa4079bcdcb482b6b6634b5df8f74dbd (diff) | |
download | gdb-e0f52461c2467b6610391681fa27cd9b3c5def57.zip gdb-e0f52461c2467b6610391681fa27cd9b3c5def57.tar.gz gdb-e0f52461c2467b6610391681fa27cd9b3c5def57.tar.bz2 |
Fix evaluation of method calls under EVAL_SKIP.
When evaluating method calls under EVAL_SKIP, the "object" and the
arguments to the method should also be evaluated under EVAL_SKIP,
instead of skipping to evaluate them as was being done previously.
gdb/ChangeLog:
PR c++/17494
* eval.c (evaluate_subexp_standard): Evaluate the "object" and
the method args also under EVAL_SKIP when evaluating method
calls under EVAL_SKIP.
gdb/testsuite/ChangeLog:
PR c++/17494
* gdb.cp/pr17494.cc: New file.
* gdb.cp/pr17494.exp: New file.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/pr17494.cc | 63 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/pr17494.exp | 57 |
3 files changed, 126 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 2aff9de..7983271 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-11-03 Siva Chandra Reddy <sivachandra@google.com> + + PR c++/17494 + * gdb.cp/pr17494.cc: New file. + * gdb.cp/pr17494.exp: New file. + 2014-11-02 Yao Qi <yao@codesourcery.com> * gdb.python/python.exp: Get working directory and match the diff --git a/gdb/testsuite/gdb.cp/pr17494.cc b/gdb/testsuite/gdb.cp/pr17494.cc new file mode 100644 index 0000000..77653e1 --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr17494.cc @@ -0,0 +1,63 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2014 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/>. */ + + +/* One could use unique_ptr instead, but that requires a GCC which can + support "-std=c++11". */ + +int +func (int i, int j) +{ + return i + j; +} + +class A +{ +public: + A () { a = 12345; f = &func; } + int geta (); + int adda (int i); + + int a; + int (*f) (int, int); +}; + +int +A::geta () +{ + return a; +} + +int +A::adda (int i) +{ + return a + i; +} + +int +main () +{ + A a; + A *a_ptr = &a; + int (A::*m1) (); + int (A::*m2) (int); + + m1 = &A::geta; + m2 = &A::adda; + + return (a.*m1) () + (a.*m2) (12) + (a.*(&A::f)) (1, 2); /* Break here */ +} diff --git a/gdb/testsuite/gdb.cp/pr17494.exp b/gdb/testsuite/gdb.cp/pr17494.exp new file mode 100644 index 0000000..7f2e0cf --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr17494.exp @@ -0,0 +1,57 @@ +# Copyright 2014 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 is part of the gdb testsuite + +if {[skip_cplus_tests]} { continue } + +standard_testfile .cc + +if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} { + return -1 +} + +if {![runto_main]} { + return -1 +} + +gdb_breakpoint [gdb_get_line_number "Break here"] +gdb_continue_to_breakpoint "Break here" + +gdb_test "p a.geta()" ".* = 12345" "a.geta()" +gdb_test "p a_ptr->geta()" ".* = 12345" "a.geta()" + +gdb_test "p false ? a.geta() : 123" ".* = 123" "ternop 1" +gdb_test "p false ? a_ptr->geta() : 123" ".* = 123" "ternop 2" +gdb_test "p (true ? 123 : a.geta()) + 123" ".* = 246" "ternop 3" +gdb_test "p (true ? 123 : a_ptr->geta()) + 123" ".* = 246" "ternop 4" +gdb_test "p false ? (a.*m1)() : 123" ".* = 123" "ternop 5" +gdb_test "p false ? (a_ptr->*m1)() : 123" ".* = 123" "ternop 6" +gdb_test "p (true ? 123 : (a.*m1)()) + 123" ".* = 246" "ternop 7" +gdb_test "p (true ? 123 : (a_ptr->*m1)()) + 123" ".* = 246" "ternop 8" + +gdb_test "p false ? a.adda(456) : 123" ".* = 123" "ternop 9" +gdb_test "p false ? a_ptr->adda(456) : 123" ".* = 123" "ternop 10" +gdb_test "p (true ? 123 : a.adda(456)) + 123" ".* = 246" "ternop 11" +gdb_test "p (true ? 123 : a_ptr->adda(456)) + 123" ".* = 246" "ternop 12" +gdb_test "p false ? (a.*m2)(123) : 123" ".* = 123" "ternop 13" +gdb_test "p false ? (a_ptr->*m2)(123) : 123" ".* = 123" "ternop 14" +gdb_test "p (true ? 123 : (a.*m2)(123)) + 123" ".* = 246" "ternop 15" +gdb_test "p (true ? 123 : (a_ptr->*m2)(123)) + 123" ".* = 246" "ternop 16" + +gdb_test "p false ? (a.*(&A::f))(1, 2) : 123" ".* = 123" "ternop 17" +gdb_test "p false ? (a_ptr->*(&A::f))(1, 2) : 123" ".* = 123" "ternop 18" +gdb_test "p (true ? 123 : (a.*(&A::f))(1, 2)) + 123" ".* = 246" "ternop 19" +gdb_test "p (true ? 123 : (a_ptr->*(&A::f))(1, 2)) + 123" ".* = 246" "ternop 20" |