diff options
author | Siva Chandra <sivachandra@chromium.org> | 2014-07-09 10:25:48 -0700 |
---|---|---|
committer | Siva Chandra <sivachandra@chromium.org> | 2014-08-15 18:28:59 -0700 |
commit | e66d44466912ecf581f6b67ff299d064c7bf4f1a (patch) | |
tree | 447ff1714ecb2c4bce548c8565e0102feb489cc8 /gdb/testsuite/gdb.cp | |
parent | 940df408121be31beed22ef7a5ad133cb1592726 (diff) | |
download | gdb-e66d44466912ecf581f6b67ff299d064c7bf4f1a.zip gdb-e66d44466912ecf581f6b67ff299d064c7bf4f1a.tar.gz gdb-e66d44466912ecf581f6b67ff299d064c7bf4f1a.tar.bz2 |
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.
Diffstat (limited to 'gdb/testsuite/gdb.cp')
-rw-r--r-- | gdb/testsuite/gdb.cp/pr17132.cc | 61 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/pr17132.exp | 40 |
2 files changed, 101 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>. */ + + +/* One could use unique_ptr instead, but that requires a GCC which can + support "-std=c++11". */ + +template <typename T> +class smart_ptr +{ +public: + smart_ptr (T *obj) : _obj (obj) { } + ~smart_ptr () { delete _obj; } + + T *operator-> (); + +private: + T *_obj; +}; + +template <typename T> +T * +smart_ptr<T>::operator-> () +{ + return _obj; +} + +class A +{ +public: + virtual int func (); +}; + +int +A::func () +{ + return 3; +} + +int +main () +{ + A *a_ptr = 0; + smart_ptr<A> 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 <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 "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()" |