From fbd03f077be85a8c455aa82cf247cc12cc9dea5f Mon Sep 17 00:00:00 2001 From: Pierre-Marie de Rodat Date: Tue, 10 Mar 2015 09:18:45 +0100 Subject: [PATCH] Do not consider reference types as dynamic Even when referenced types are dynamic, the corresponding referencing type should not be considered as dynamic: it's only a pointer. This prevents reference type for values not in memory to be resolved. gdb/ChangeLog: 2015-03-10 Pierre-Marie de Rodat * gdbtypes.c (is_dynamic_type_internal): Remove special handling of TYPE_CODE_REF types so that they are not considered as dynamic depending on the referenced type. gdb/testsuite/ChangeLog: 2015-03-10 Pierre-Marie de Rodat * gdb.ada/funcall_ref.exp: New file. * gdb.ada/funcall_ref/foo.adb: New file. --- gdb/gdbtypes.c | 4 --- gdb/testsuite/gdb.ada/funcall_ref.exp | 42 +++++++++++++++++++++++++++++++ gdb/testsuite/gdb.ada/funcall_ref/foo.adb | 19 ++++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 gdb/testsuite/gdb.ada/funcall_ref.exp create mode 100644 gdb/testsuite/gdb.ada/funcall_ref/foo.adb diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index a80151c..f75eac5 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -1748,10 +1748,6 @@ is_dynamic_type_internal (struct type *type, int top_level) { type = check_typedef (type); - /* We only want to recognize references at the outermost level. */ - if (top_level && TYPE_CODE (type) == TYPE_CODE_REF) - type = check_typedef (TYPE_TARGET_TYPE (type)); - /* Types that have a dynamic TYPE_DATA_LOCATION are considered dynamic, even if the type itself is statically defined. From a user's point of view, this may appear counter-intuitive; diff --git a/gdb/testsuite/gdb.ada/funcall_ref.exp b/gdb/testsuite/gdb.ada/funcall_ref.exp new file mode 100644 index 0000000..b754e59 --- /dev/null +++ b/gdb/testsuite/gdb.ada/funcall_ref.exp @@ -0,0 +1,42 @@ +# Copyright 2008-2015 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 . + +load_lib "ada.exp" + +standard_ada_testfile foo + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable \ + [list debug]] != "" } { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb] +runto "foo.adb:$bp_location" + +# Test printing and type-printing of a discriminated record that a function +# returns by reference. + +gdb_test "p get (\"Hello world!\")" \ + "= \\(n => 12, s => \"Hello world!\"\\)" \ + "p get (\"Hello world!\")" + +gdb_test "ptype get (\"Hello world!\")" \ + [multi_line "type = record" \ + " n: natural;" \ + " s: access array \\(1 \\.\\. n\\) of character;" \ + "end record"] \ + "ptype get (\"Hello world!\")" diff --git a/gdb/testsuite/gdb.ada/funcall_ref/foo.adb b/gdb/testsuite/gdb.ada/funcall_ref/foo.adb new file mode 100644 index 0000000..17d7641 --- /dev/null +++ b/gdb/testsuite/gdb.ada/funcall_ref/foo.adb @@ -0,0 +1,19 @@ +procedure Foo is + type Bar (N : Natural) is record + S : String (1 .. N); + end record; + + function Get (S : String) return Bar is + begin + return (N => S'Length, S => S); + end Get; + + procedure Do_Nothing (B : Bar) is + begin + null; + end Do_Nothing; + + B : Bar := Get ("Foo"); +begin + Do_Nothing (B); -- STOP +end Foo; -- 2.3.1