[PATCH] Document resolve_dynamic_type oddity
Tom Tromey
tromey@adacore.com
Tue Oct 19 20:46:53 GMT 2021
Today I re-learned that resolve_dynamic_type can return a type for
which is_dynamic_type returns true. This can happen for an array
whose elements have dynamic type -- the array is reported as dynamic,
but resolving the elements would be incorrect, because each element
might have a different type after resolution.
You can see the special case in resolve_dynamic_array_or_string:
if (ary_dim != NULL && ary_dim->code () == TYPE_CODE_ARRAY)
...
else
...
I looked into having the TYPE_CODE_ARRAY case in
is_dynamic_type_internal follow this same logic, but that breaks down
on the gdb.fortran/dynamic-ptype-whatis.exp test case. In particular
this code in fortran_undetermined::evaluate:
value *callee = std::get<0> (m_storage)->evaluate (nullptr, exp, noside);
if (noside == EVAL_AVOID_SIDE_EFFECTS
&& is_dynamic_type (value_type (callee)))
callee = std::get<0> (m_storage)->evaluate (nullptr, exp, EVAL_NORMAL);
... relies on is_dynamic_type returning true for such an array.
I wasn't really sure of the best way to fix this, so in the meantime I
wrote this patch, which documents the oddity so that I might have a
chance of remembering this in the future.
---
gdb/gdbtypes.h | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 4324641eb0d..62fbbc484a2 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -2666,12 +2666,21 @@ extern CORE_ADDR get_pointer_type_max (struct type *);
/* * Resolve all dynamic values of a type e.g. array bounds to static values.
ADDR specifies the location of the variable the type is bound to.
If TYPE has no dynamic properties return TYPE; otherwise a new type with
- static properties is returned. */
+ static properties is returned.
+
+ For an array type, if the element type is dynamic, then that will
+ not be resolved. This is done because each individual element may
+ have a different type when resolved (depending on the contents of
+ memory). In this situation, 'is_dynamic_type' will still return
+ type for the return value of this function. */
extern struct type *resolve_dynamic_type
(struct type *type, gdb::array_view<const gdb_byte> valaddr,
CORE_ADDR addr);
-/* * Predicate if the type has dynamic values, which are not resolved yet. */
+/* * Predicate if the type has dynamic values, which are not resolved yet.
+ See the caveat in 'resolve_dynamic_type' to understand a scenario
+ where an apparently-resolved type may still be considered
+ "dynamic". */
extern int is_dynamic_type (struct type *type);
extern struct type *check_typedef (struct type *);
--
2.31.1
More information about the Gdb-patches
mailing list