From c2e0e465f9488970c7e460a41e3fb7c366530619 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Wed, 7 Feb 2018 08:48:14 -0500 Subject: [PATCH] Fix type of values representing optimized out static members As reported here: https://sourceware.org/ml/gdb/2018-02/msg00019.html the type of values representing static members that are optimized out is wrong. It currently assigns the type of the containing class rather than the type of the field. This patch fixes that. I found a place in m-static.exp already dealing with optimized out static members, so I just added some gdb_test there. gdb/ChangeLog: * value.c (value_static_field): Assign field type instead of containing type when returning an optimized out value. gdb/testsuite/ChangeLog: * gdb.cp/m-static.exp: Check type of optimized out static member. --- gdb/ChangeLog | 5 +++++ gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.cp/m-static.exp | 2 ++ gdb/value.c | 8 +++----- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 229756853c..00ed7e78c2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2018-02-07 Simon Marchi + + * value.c (value_static_field): Assign field type instead of + containing type when returning an optimized out value. + 2018-02-06 Yao Qi * ft32-tdep.c (ft32_read_pc): Remove. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 0af50b0498..18512b9724 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-02-07 Simon Marchi + + * gdb.cp/m-static.exp: Check type of optimized out static + member. + 2018-02-03 Andrew Burgess * config/sid.exp (gdb_target_sid): Remove use of cleanup. diff --git a/gdb/testsuite/gdb.cp/m-static.exp b/gdb/testsuite/gdb.cp/m-static.exp index 65661713ff..ffcbf5334f 100644 --- a/gdb/testsuite/gdb.cp/m-static.exp +++ b/gdb/testsuite/gdb.cp/m-static.exp @@ -165,6 +165,8 @@ if {[test_compiler_info {gcc-[0-3]-*}] setup_xfail *-*-* } gdb_test "print test4.nowhere" "" "static const int initialized nowhere (print field)" +gdb_test "ptype test4.nowhere" "type = const int" +gdb_test "print test4.nowhere.nowhere" "Attempt to extract a component of a value that is not a structure." # Same, but print the whole struct. gdb_test "print test4" "static nowhere = .*" "static const int initialized nowhere (whole struct)" diff --git a/gdb/value.c b/gdb/value.c index 9a144fb7fb..9cd9a2fcc7 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -2976,14 +2976,12 @@ value_static_field (struct type *type, int fieldno) reported as non-debuggable symbols. */ struct bound_minimal_symbol msym = lookup_minimal_symbol (phys_name, NULL, NULL); + struct type *field_type = TYPE_FIELD_TYPE (type, fieldno); if (!msym.minsym) - return allocate_optimized_out_value (type); + retval = allocate_optimized_out_value (field_type); else - { - retval = value_at_lazy (TYPE_FIELD_TYPE (type, fieldno), - BMSYMBOL_VALUE_ADDRESS (msym)); - } + retval = value_at_lazy (field_type, BMSYMBOL_VALUE_ADDRESS (msym)); } else retval = value_of_variable (sym.symbol, sym.block); -- 2.34.1