diff options
-rw-r--r-- | gdb/gdbtypes.c | 13 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/recursive-variant.exp | 31 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/recursive-variant/main.adb | 38 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/vla-cxx.exp | 4 |
4 files changed, 80 insertions, 6 deletions
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index f1e9d70..599a696 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -2809,10 +2809,15 @@ resolve_dynamic_type_internal (struct type *type, pinfo.addr = read_memory_typed_address (addr_stack->addr, type); pinfo.next = addr_stack; - resolved_type = copy_type (type); - resolved_type->set_target_type - (resolve_dynamic_type_internal (type->target_type (), - &pinfo, frame, top_level)); + /* Special case a NULL pointer here -- we don't want to + dereference it. */ + if (pinfo.addr != 0) + { + resolved_type = copy_type (type); + resolved_type->set_target_type + (resolve_dynamic_type_internal (type->target_type (), + &pinfo, frame, true)); + } break; } diff --git a/gdb/testsuite/gdb.ada/recursive-variant.exp b/gdb/testsuite/gdb.ada/recursive-variant.exp new file mode 100644 index 0000000..ea13f83 --- /dev/null +++ b/gdb/testsuite/gdb.ada/recursive-variant.exp @@ -0,0 +1,31 @@ +# Copyright 2024 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/>. + +load_lib "ada.exp" + +require allow_ada_tests + +standard_ada_testfile main + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable debug] != ""} { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "STOP" ${testdir}/main.adb] +runto "main.adb:$bp_location" + +gdb_test "print *instance" [string_to_regexp "= (x => false, link => 0x0)"] diff --git a/gdb/testsuite/gdb.ada/recursive-variant/main.adb b/gdb/testsuite/gdb.ada/recursive-variant/main.adb new file mode 100644 index 0000000..93b47e5 --- /dev/null +++ b/gdb/testsuite/gdb.ada/recursive-variant/main.adb @@ -0,0 +1,38 @@ +-- Copyright 2024 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/>. + +procedure Main is + + type Rec_Type; + + type Rec_Type_Ref is access all Rec_Type; + + type Rec_Type (X : Boolean) is record + Link : Rec_Type_Ref; + case X is + when True => + Value : Integer; + when False => + null; + end case; + end record; + + Instance : Rec_Type_Ref := new Rec_Type'(X => False, Link => null); + +begin + + null; -- STOP + +end Main; diff --git a/gdb/testsuite/gdb.cp/vla-cxx.exp b/gdb/testsuite/gdb.cp/vla-cxx.exp index 0033a96..bf3ca79 100644 --- a/gdb/testsuite/gdb.cp/vla-cxx.exp +++ b/gdb/testsuite/gdb.cp/vla-cxx.exp @@ -26,10 +26,10 @@ if ![runto_main] { gdb_breakpoint [gdb_get_line_number "Before pointer assignment"] gdb_continue_to_breakpoint "Before pointer assignment" -gdb_test "ptype ptr" "= int \\(\\*\\)\\\[3\\\]" \ +gdb_test "ptype ptr" "= int \\(\\*\\)\\\[variable length\\\]" \ "ptype ptr, before pointer assignment" -gdb_test "print ptr" "= \\(int \\(\\*\\)\\\[3\\\]\\) 0x0" \ +gdb_test "print ptr" "= \\(int \\(\\*\\)\\\[variable length\\\]\\) 0x0" \ "print ptr, before pointer assignment" gdb_test "print *ptr" "Cannot access memory at address 0x0" \ |