Ada: fix bad handling in ada_convert_actual
authorXavier Roirand <roirand@adacore.com>
Mon, 18 Dec 2017 02:59:07 +0000 (21:59 -0500)
committerJoel Brobecker <brobecker@adacore.com>
Mon, 18 Dec 2017 03:01:32 +0000 (22:01 -0500)
commitcb923fcc23e07fe3dfb3837f47249aba79cdee6f
treefa811e63c5b7e2f20eac8b77806c49854a855d9b
parent7d47b066d0e5ea1df82aa24fde2dd4e38814627c
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/ChangeLog
gdb/ada-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/funcall_ptr.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/funcall_ptr/foo.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/funcall_ptr/pck.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/funcall_ptr/pck.ads [new file with mode: 0644]