F2018 §16.9.193: TRANSFER(SOURCE, MOLD) without SIZE defaults to
ceil(bytes(SOURCE) / sizeof(MOLD_elem)) elements in the rank-1 result.
The 2-arg path only knew how to derive bytes from a whole-array Name
(via the runtime descriptor); inline array constructors fell through
and the assignment took the generic path that segfaulted. Compute the
constructor's byte count at compile time from its length × element
kind size and feed both into the existing allocate-then-memcpy path.
Unblocks example_hashmaps_get_other_data (was rc=139).
DEALLOCATE on a pointer object must leave the pointer disassociated
so a subsequent ASSOCIATED() returns false. We freed the heap but
left the slot value alone, so stdlib_hashmap_chaining's recursive
free_map_entry_pool — which terminates on .not. associated(pool) —
walked stale pool memory after re-init reused the dangling cache
slot as the new pool's lastpool, overflowing the stack at 47k+
frames. Now store null into the slot after the runtime call, both
for component-access and ordinary scalar pointer deallocations.
Unblocks example_hashmaps_init.
F2018 §16.9.193: when SIZE is omitted from TRANSFER(SOURCE, MOLD)
and MOLD is array-shaped, the result rank-1 extent is
ceil(bytes(SOURCE) / sizeof(MOLD_elem)). stdlib_hashmap_wrappers's
set_int32_key writes 'key%value = transfer(value, key%value)' where
the source is integer(int32), :) and the destination is
integer(int8), allocatable, :). Without this branch the 2-arg form
fell through expr_is_transfer_array_call_dynamic's args.len() >= 3
guard, took the generic assignment path, and segfaulted. Now derive
SOURCE's runtime byte count from its descriptor (whole-array Name +
elem_size from semantic type), allocate the destination to fit, and
memcpy. Unblocks 13 more hashmaps examples (20/26 pass — was 0).
arg_uses_descriptor_from_decls flagged class(name) scalars but not
ClassStar — so the caller-side descriptor mask returned false for a
class(*) optional dummy and routed the actual through the by_ref path,
which dereferenced the dummy slot and crashed when the actual was
absent. The callee-side already laid the parameter out as a 384-byte
descriptor pointer; the asymmetry caused the segfault. Recognising
ClassStar in the same arm aligns both sides: forwarding via
lower_arg_descriptor passes the descriptor (or null when absent)
without dereferencing it, unblocking 7/10 stdlib_hashmaps examples
(calls, get, set, loading, entries, key_test, copy_key).
A component declared procedure(iface), pointer :: fn => target_proc
now lands in the type layout as FieldDefaultInit::ProcedurePointer,
gets resolved through host-module USE renames to its origin module's
afs_modproc_<mod>_<proc> link symbol, and is materialized via
global_addr+ptr_to_int+store at every default-constructed instance.
Round-tripped through .amod to survive separate compilation. Without
this stdlib_hashmaps's hasher field (=> default_hasher aliased from
fnv_1_hasher in stdlib_hashmap_wrappers) was left zero and every
dispatch through it crashed.