aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite
diff options
context:
space:
mode:
authorSiva Chandra <sivachandra@chromium.org>2014-11-11 05:43:03 -0800
committerSiva Chandra <sivachandra@chromium.org>2014-11-28 16:01:16 -0800
commit6c659fc2c7cd2da6d2b9a3d7c38597ad3821832a (patch)
tree4d45593c088252f07a928ff05ba96e79ea629daf /gdb/testsuite
parentf4f855e84b45eb41987641b4a26037c7444dda33 (diff)
downloadgdb-6c659fc2c7cd2da6d2b9a3d7c38597ad3821832a.zip
gdb-6c659fc2c7cd2da6d2b9a3d7c38597ad3821832a.tar.gz
gdb-6c659fc2c7cd2da6d2b9a3d7c38597ad3821832a.tar.bz2
Enable chained function calls in C++ expressions.
gdb/ChangeLog: * eval.c: Include gdbthread.h. (evaluate_subexp): Enable thread stack temporaries before evaluating a complete expression and clean them up after the evaluation is complete. * gdbthread.h: Include common/vec.h. (value_ptr): New typedef. (VEC (value_ptr)): New vector type. (value_vec): New typedef. (struct thread_info): Add new fields stack_temporaries_enabled and stack_temporaries. (enable_thread_stack_temporaries) (thread_stack_temporaries_enabled_p, push_thread_stack_temporary) (get_last_thread_stack_temporary) (value_in_thread_stack_temporaries): Declare. * gdbtypes.c (class_or_union_p): New function. * gdbtypes.h (class_or_union_p): Declare. * infcall.c (call_function_by_hand): Store return values of class type as temporaries on stack. * thread.c (enable_thread_stack_temporaries): New function. (thread_stack_temporaries_enabled_p, push_thread_stack_temporary) (get_last_thread_stack_temporary): Likewise. (value_in_thread_stack_temporaries): Likewise. * value.c (value_force_lval): New function. * value.h (value_force_lval): Declare. gdb/testsuite/ChangeLog: * gdb.cp/chained-calls.cc: New file. * gdb.cp/chained-calls.exp: New file. * gdb.cp/smartp.exp: Remove KFAIL for "p c2->inta".
Diffstat (limited to 'gdb/testsuite')
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.cp/chained-calls.cc203
-rw-r--r--gdb/testsuite/gdb.cp/chained-calls.exp44
-rw-r--r--gdb/testsuite/gdb.cp/smartp.exp1
4 files changed, 253 insertions, 1 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index d2a0a43..282cb88 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2014-11-28 Siva Chandra Reddy <sivachandra@google.com>
+
+ * gdb.cp/chained-calls.cc: New file.
+ * gdb.cp/chained-calls.exp: New file.
+ * gdb.cp/smartp.exp: Remove KFAIL for "p c2->inta".
+
2014-11-28 Simon Marchi <simon.marchi@ericsson.com>
* gdb.ada/py_range.exp: Add parentheses to python calls to print.
diff --git a/gdb/testsuite/gdb.cp/chained-calls.cc b/gdb/testsuite/gdb.cp/chained-calls.cc
new file mode 100644
index 0000000..a30ec3b
--- /dev/null
+++ b/gdb/testsuite/gdb.cp/chained-calls.cc
@@ -0,0 +1,203 @@
+/* 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/>. */
+
+class S
+{
+public:
+ S () { }
+ S (S &obj);
+
+ S operator+ (const S &s);
+
+ int a;
+};
+
+S::S (S &obj)
+{
+ a = obj.a;
+}
+
+S
+S::operator+ (const S &s)
+{
+ S res;
+
+ res.a = a + s.a;
+
+ return res;
+}
+
+S
+f (int i)
+{
+ S s;
+
+ s.a = i;
+
+ return s;
+}
+
+int
+g (const S &s)
+{
+ return s.a;
+}
+
+class A
+{
+public:
+ A operator+ (const A &);
+ int a;
+};
+
+A
+A::operator+ (const A &obj)
+{
+ A n;
+
+ n.a = a + obj.a;
+
+ return n;
+}
+
+A
+p ()
+{
+ A a;
+ a.a = 12345678;
+ return a;
+}
+
+A
+r ()
+{
+ A a;
+ a.a = 10000000;
+ return a;
+}
+
+A
+q (const A &a)
+{
+ return a;
+}
+
+class B
+{
+public:
+ int b[1024];
+};
+
+B
+makeb ()
+{
+ B b;
+ int i;
+
+ for (i = 0; i < 1024; i++)
+ b.b[i] = i;
+
+ return b;
+}
+
+int
+getb (const B &b, int i)
+{
+ return b.b[i];
+}
+
+class C
+{
+public:
+ C ();
+ ~C ();
+
+ A operator* ();
+
+ A *a_ptr;
+};
+
+C::C ()
+{
+ a_ptr = new A;
+ a_ptr->a = 5678;
+}
+
+C::~C ()
+{
+ delete a_ptr;
+}
+
+A
+C::operator* ()
+{
+ return *a_ptr;
+}
+
+#define TYPE_INDEX 1
+
+enum type
+{
+ INT,
+ CHAR
+};
+
+union U
+{
+public:
+ U (type t);
+ type get_type ();
+
+ int a;
+ char c;
+ type tp[2];
+};
+
+U::U (type t)
+{
+ tp[TYPE_INDEX] = t;
+}
+
+U
+make_int ()
+{
+ return U (INT);
+}
+
+U
+make_char ()
+{
+ return U (CHAR);
+}
+
+type
+U::get_type ()
+{
+ return tp[TYPE_INDEX];
+}
+
+int
+main ()
+{
+ int i = g(f(0));
+ A a = q(p() + r());
+
+ B b = makeb ();
+ C c;
+
+ return i + getb(b, 0); /* Break here */
+}
diff --git a/gdb/testsuite/gdb.cp/chained-calls.exp b/gdb/testsuite/gdb.cp/chained-calls.exp
new file mode 100644
index 0000000..c903bea
--- /dev/null
+++ b/gdb/testsuite/gdb.cp/chained-calls.exp
@@ -0,0 +1,44 @@
+# 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 g(f(12345))" ".* = 12345" "g(f())"
+gdb_test "p q(p())" ".* = {a = 12345678}" "q(p())"
+gdb_test "p p() + r()" ".* = {a = 22345678}" "p() + r()"
+gdb_test "p q(p() + r())" ".* = {a = 22345678}" "q(p() + r())"
+gdb_test "p g(f(6700) + f(89))" ".* = 6789" "g(f() + f())"
+gdb_test "p g(f(g(f(300) + f(40))) + f(5))" ".* = 345" \
+ "g(f(g(f() + f())) + f())"
+gdb_test "p getb(makeb(), 789)" ".* = 789" "getb(makeb(), ...)"
+gdb_test "p *c" ".* = {a = 5678}" "*c"
+gdb_test "p *c + *c" ".* = {a = 11356}" "*c + *c"
+gdb_test "P q(*c + *c)" ".* = {a = 11356}" "q(*c + *c)"
+gdb_test "p make_int().get_type ()" ".* = INT" "make_int().get_type ()"
diff --git a/gdb/testsuite/gdb.cp/smartp.exp b/gdb/testsuite/gdb.cp/smartp.exp
index 2a1028a..e3d271f 100644
--- a/gdb/testsuite/gdb.cp/smartp.exp
+++ b/gdb/testsuite/gdb.cp/smartp.exp
@@ -72,6 +72,5 @@ gdb_test "p b->foo()" "= 66"
gdb_test "p c->foo()" "= 66"
gdb_test "p c->inta" "= 77"
-setup_kfail "gdb/11606" "*-*-*"
gdb_test "p c2->inta" "= 77"