aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/riscv-tdep.c6
-rw-r--r--gdb/testsuite/gdb.cp/non-trivial-retval.cc19
-rw-r--r--gdb/testsuite/gdb.cp/non-trivial-retval.exp6
3 files changed, 30 insertions, 1 deletions
diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c
index 932708c..200a20a 100644
--- a/gdb/riscv-tdep.c
+++ b/gdb/riscv-tdep.c
@@ -2857,8 +2857,12 @@ static void
riscv_call_arg_scalar_int (struct riscv_arg_info *ainfo,
struct riscv_call_info *cinfo)
{
+ auto lang_req = language_pass_by_reference (ainfo->type);
+
if (TYPE_HAS_DYNAMIC_LENGTH (ainfo->type)
- || ainfo->length > (2 * cinfo->xlen))
+ || ainfo->length > (2 * cinfo->xlen)
+ || !lang_req.trivially_copy_constructible
+ || !lang_req.trivially_destructible)
{
/* Argument is going to be passed by reference. */
ainfo->argloc[0].loc_type
diff --git a/gdb/testsuite/gdb.cp/non-trivial-retval.cc b/gdb/testsuite/gdb.cp/non-trivial-retval.cc
index 4bba0f1..4e81251 100644
--- a/gdb/testsuite/gdb.cp/non-trivial-retval.cc
+++ b/gdb/testsuite/gdb.cp/non-trivial-retval.cc
@@ -142,6 +142,24 @@ f4 (int i1, int i2)
return e;
}
+class F
+{
+public:
+ ~F () {}
+
+ int f;
+};
+
+F
+f5 (int i1, int i2)
+{
+ F f;
+
+ f.f = i1 + i2;
+
+ return f;
+}
+
/* We place a breakpoint on the call to this function. */
void
@@ -164,6 +182,7 @@ main (void)
B1 b1 = f22 (i1, i2);
C c = f3 (i1, i2);
E e = f4 (i1, i2);
+ F f = f5 (i1, i2);
return 0;
}
diff --git a/gdb/testsuite/gdb.cp/non-trivial-retval.exp b/gdb/testsuite/gdb.cp/non-trivial-retval.exp
index 89035e1..6c9f7e1 100644
--- a/gdb/testsuite/gdb.cp/non-trivial-retval.exp
+++ b/gdb/testsuite/gdb.cp/non-trivial-retval.exp
@@ -42,12 +42,14 @@ gdb_test "p f2 (i1, i2)" ".* = {b = 123}"
gdb_test "p f22 (i1, i2)" ".* = {b1 = 123}"
gdb_test "p f3 (i1, i2)" ".* = {.* c = 123}"
gdb_test "p f4 (i1, i2)" ".* = {.* e = 123}"
+gdb_test "p f5 (i1, i2)" ".* = {f = 123}"
gdb_breakpoint "f1"
gdb_breakpoint "f2"
gdb_breakpoint "f22"
gdb_breakpoint "f3"
gdb_breakpoint "f4"
+gdb_breakpoint "f5"
gdb_continue_to_breakpoint "Break in f1"
gdb_test "finish" " = {a = 123}" \
@@ -68,3 +70,7 @@ gdb_test "finish" " = {.* c = 123}" \
gdb_continue_to_breakpoint "Break in f4"
gdb_test "finish" " = {.* e = 123}" \
"finish from f4"
+
+gdb_continue_to_breakpoint "Break in f5"
+gdb_test "finish" " = {f = 123}" \
+ "finish from f5"