From cb923fcc23e07fe3dfb3837f47249aba79cdee6f Mon Sep 17 00:00:00 2001 From: Xavier Roirand Date: Sun, 17 Dec 2017 21:59:07 -0500 Subject: Ada: fix bad handling in ada_convert_actual Using this small example: procedure Foo is type Integer_Access is access all Integer; procedure P (A : Integer_Access) is begin null; end P; begin P (null); end Foo; and doing this debug session: (gdb) b p Breakpoint 1 at 0x402d67: file foo.adb, line 7. (gdb) print p(null) Breakpoint 1, foo.p (a=0x641010) at foo.adb:10 ... ^^^^^^^^^^ shows that something goes wrong between the initial null value and the received parameter value in the 'f' function. The value for the parameter 'a' we get is the address of the value we would expect instead of the value itself. This can be checked by doing: (gdb) p *a $1 = 0 Before this fix, in ada_convert_value, this function was looking to the actual value (the null value here) to determine if the formal (parameter 'a' in the procedure 'P' in this exemple) requires a pointer or not which is a wrong assumption and leads to push the address of the value to the inferior instead of the value itself. This is fixed by this patch. gdb/ChangeLog: * ada-lang.c (ada_convert_actual): Change the way actual value are passed to the inferior when the inferior expects a pointer type. gdb/testsuite/ChangeLog: * gdb.ada/funcall_ptr: New testcase. Tested on x86_64-linux. --- gdb/ada-lang.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gdb/ada-lang.c') diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index c40803c..8a0423e 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -4513,7 +4513,7 @@ ada_convert_actual (struct value *actual, struct type *formal_type0) if (TYPE_CODE (formal_target) == TYPE_CODE_ARRAY && ada_is_array_descriptor_type (actual_target)) result = desc_data (actual); - else if (TYPE_CODE (actual_type) != TYPE_CODE_PTR) + else if (TYPE_CODE (formal_type) != TYPE_CODE_PTR) { if (VALUE_LVAL (actual) != lval_memory) { -- cgit v1.1