From: Tom Tromey Date: Tue, 19 Oct 2021 20:42:04 +0000 (-0600) Subject: Document resolve_dynamic_type oddity X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=52429bbd71af5f14f8f3f5a962a2457a93c6d171;p=binutils-gdb.git Document resolve_dynamic_type oddity 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. --- diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 4324641eb0d..f36a7532d67 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 + true for the return value of this function. */ extern struct type *resolve_dynamic_type (struct type *type, gdb::array_view 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 *);