From e66d44466912ecf581f6b67ff299d064c7bf4f1a Mon Sep 17 00:00:00 2001 From: Siva Chandra Date: Wed, 9 Jul 2014 10:25:48 -0700 Subject: Add new argument NOSIDE to find_overload_match. This is a fix for PR c++/17132. If this new argument is set to EVAL_AVOID_SIDE_EFFECTS, then the object's memory will not be read while picking the best overload match. gdb/ * eval.c: Update all calls to find_overload_match. * valarith.c: Likewise. (value_user_defined_cpp_op, value_user_defined_op): New argument NOSIDE. Update all callers. * valops.c (find_overload_match): New argument NOSIDE. * value.h (find_overload_match): Update signature. gdb/testsuite * gdb.cp/pr17132.cc: New file. * gdb.cp/pr17132.exp: New file. --- gdb/testsuite/ChangeLog | 6 ++++ gdb/testsuite/gdb.cp/pr17132.cc | 61 ++++++++++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.cp/pr17132.exp | 40 ++++++++++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 gdb/testsuite/gdb.cp/pr17132.cc create mode 100644 gdb/testsuite/gdb.cp/pr17132.exp (limited to 'gdb/testsuite') diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 38682fa..553f695 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2014-08-15 Siva Chandra Reddy + PR c++/17132 + * gdb.cp/pr17132.cc: New file. + * gdb.cp/pr17132.exp: New file. + +2014-08-15 Siva Chandra Reddy + * gdb.python/py-xmethods.py (A_getarrayind) (E_method_char_worker.__call__, E_method_int_worker.__call__): Use 'print' with function call syntax. diff --git a/gdb/testsuite/gdb.cp/pr17132.cc b/gdb/testsuite/gdb.cp/pr17132.cc new file mode 100644 index 0000000..42d99af --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr17132.cc @@ -0,0 +1,61 @@ +/* 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 . */ + + +/* One could use unique_ptr instead, but that requires a GCC which can + support "-std=c++11". */ + +template +class smart_ptr +{ +public: + smart_ptr (T *obj) : _obj (obj) { } + ~smart_ptr () { delete _obj; } + + T *operator-> (); + +private: + T *_obj; +}; + +template +T * +smart_ptr::operator-> () +{ + return _obj; +} + +class A +{ +public: + virtual int func (); +}; + +int +A::func () +{ + return 3; +} + +int +main () +{ + A *a_ptr = 0; + smart_ptr a (new A); + + return a->func(); /* Break here */ +} diff --git a/gdb/testsuite/gdb.cp/pr17132.exp b/gdb/testsuite/gdb.cp/pr17132.exp new file mode 100644 index 0000000..26a02a2 --- /dev/null +++ b/gdb/testsuite/gdb.cp/pr17132.exp @@ -0,0 +1,40 @@ +# 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 . + +# 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 "ptype a_ptr->func ()" ".* = int" "ptype a_ptr->func ()" +gdb_test "ptype a->func ()" ".* = int" "ptype a->func ()" +gdb_test "p sizeof (a_ptr->func()) == sizeof (int)" ".* = true" \ + "p sizeof (a_ptr->func())" +gdb_test "p sizeof (a->func()) == sizeof (int)" ".* = true" \ + "p sizeof (a->func())" +gdb_test "p 1 && a->func()" ".* = true" "p 1 && a->func()" +gdb_test "p 0 || a->func()" ".* = true" "p 0 || a->func()" -- cgit v1.1