https://gcc.gnu.org/g:637112b62a20d0354f58b2401e40453513389016
commit r17-2520-g637112b62a20d0354f58b2401e40453513389016 Author: Thomas Koenig <[email protected]> Date: Sun Jul 19 16:17:28 2026 +0200 Showing ALLOCATE typespecs and walking character lengths in code walker. This dumps the typespec of an ALLOCATE statement and also walks the charlen of a character espression and an array if present. gcc/fortran/ChangeLog: * dump-parse-tree.cc (show_code_node): Show typespec for ALLOCATE if present. * frontend-passes.cc (gfc_expr_walker): Walk the character typespec length for array expressions. (gfc_code_walker): Walk the typespec for ALLOCATE if present. Diff: --- gcc/fortran/dump-parse-tree.cc | 7 +++++++ gcc/fortran/frontend-passes.cc | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/fortran/dump-parse-tree.cc b/gcc/fortran/dump-parse-tree.cc index eaf6565d0e08..5f058cdc8300 100644 --- a/gcc/fortran/dump-parse-tree.cc +++ b/gcc/fortran/dump-parse-tree.cc @@ -3407,6 +3407,13 @@ show_code_node (int level, gfc_code *c) case EXEC_ALLOCATE: fputs ("ALLOCATE ", dumpfile); + + if (c->ext.alloc.ts.type != BT_UNKNOWN) + { + show_typespec (&c->ext.alloc.ts); + fputs (":: ", dumpfile); + } + if (c->expr1) { fputs (" STAT=", dumpfile); diff --git a/gcc/fortran/frontend-passes.cc b/gcc/fortran/frontend-passes.cc index 87ac6e0a4e7d..92678310ffd3 100644 --- a/gcc/fortran/frontend-passes.cc +++ b/gcc/fortran/frontend-passes.cc @@ -5306,8 +5306,14 @@ gfc_expr_walker (gfc_expr **e, walk_expr_fn_t exprfn, void *data) WALK_SUBEXPR (a->expr); break; - case EXPR_STRUCTURE: case EXPR_ARRAY: + if ((*e)->ts.type == BT_CHARACTER) + WALK_SUBEXPR ((*e)->ts.u.cl->length); + + gcc_fallthrough (); + + case EXPR_STRUCTURE: + for (c = gfc_constructor_first ((*e)->value.constructor); c; c = gfc_constructor_next (c)) { @@ -5480,6 +5486,11 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t codefn, walk_expr_fn_t exprfn, continue; case EXEC_ALLOCATE: + if (co->ext.alloc.ts.type == BT_CHARACTER) + WALK_SUBEXPR (co->ext.alloc.ts.u.cl->length); + + gcc_fallthrough(); + case EXEC_DEALLOCATE: { gfc_alloc *a;
