diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2024-10-25 17:59:03 +0100 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2024-10-25 17:59:50 +0100 |
commit | 6cb1da72cac166bd3b005c0430557b68b9761da5 (patch) | |
tree | a8ee3161cfd93148f58abb453c8a353b4abf4a8d /gcc/fortran | |
parent | 68e7ced1c7a9b205d3de5937d36ceab94fb44144 (diff) | |
download | gcc-6cb1da72cac166bd3b005c0430557b68b9761da5.zip gcc-6cb1da72cac166bd3b005c0430557b68b9761da5.tar.gz gcc-6cb1da72cac166bd3b005c0430557b68b9761da5.tar.bz2 |
Fortran: Fix ICE with structure constructor in data statement [PR79685]
2024-10-25 Paul Thomas <pault@gcc.gnu.org>
gcc/fortran
PR fortran/79685
* decl.cc (match_data_constant): Find the symtree instead of
the symbol so the use renamed symbols are found. Pass this and
the derived type to gfc_match_structure_constructor.
* match.h: Update prototype of gfc_match_structure_contructor.
* primary.cc (gfc_match_structure_constructor): Remove call to
gfc_get_ha_sym_tree and use caller supplied symtree instead.
gcc/testsuite/
PR fortran/79685
* gfortran.dg/use_rename_13.f90: New test.
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/decl.cc | 7 | ||||
-rw-r--r-- | gcc/fortran/match.h | 2 | ||||
-rw-r--r-- | gcc/fortran/primary.cc | 8 |
3 files changed, 9 insertions, 8 deletions
diff --git a/gcc/fortran/decl.cc b/gcc/fortran/decl.cc index 499a846..000c8dc 100644 --- a/gcc/fortran/decl.cc +++ b/gcc/fortran/decl.cc @@ -377,6 +377,7 @@ match_data_constant (gfc_expr **result) gfc_expr *expr; match m; locus old_loc; + gfc_symtree *symtree; m = gfc_match_literal_constant (&expr, 1); if (m == MATCH_YES) @@ -437,9 +438,11 @@ match_data_constant (gfc_expr **result) if (m != MATCH_YES) return m; - if (gfc_find_symbol (name, NULL, 1, &sym)) + if (gfc_find_sym_tree (name, NULL, 1, &symtree)) return MATCH_ERROR; + sym = symtree->n.sym; + if (sym && sym->attr.generic) dt_sym = gfc_find_dt_in_generic (sym); @@ -453,7 +456,7 @@ match_data_constant (gfc_expr **result) return MATCH_ERROR; } else if (dt_sym && gfc_fl_struct (dt_sym->attr.flavor)) - return gfc_match_structure_constructor (dt_sym, result); + return gfc_match_structure_constructor (dt_sym, symtree, result); /* Check to see if the value is an initialization array expression. */ if (sym->value->expr_type == EXPR_ARRAY) diff --git a/gcc/fortran/match.h b/gcc/fortran/match.h index b2158e1..13972bfe 100644 --- a/gcc/fortran/match.h +++ b/gcc/fortran/match.h @@ -303,7 +303,7 @@ match gfc_match_bind_c_stmt (void); match gfc_match_bind_c (gfc_symbol *, bool); /* primary.cc. */ -match gfc_match_structure_constructor (gfc_symbol *, gfc_expr **); +match gfc_match_structure_constructor (gfc_symbol *, gfc_symtree *, gfc_expr **); match gfc_match_variable (gfc_expr **, int); match gfc_match_equiv_variable (gfc_expr **); match gfc_match_actual_arglist (int, gfc_actual_arglist **, bool = false); diff --git a/gcc/fortran/primary.cc b/gcc/fortran/primary.cc index f3f659c..0f258edd 100644 --- a/gcc/fortran/primary.cc +++ b/gcc/fortran/primary.cc @@ -3648,18 +3648,16 @@ gfc_convert_to_structure_constructor (gfc_expr *e, gfc_symbol *sym, gfc_expr **c match -gfc_match_structure_constructor (gfc_symbol *sym, gfc_expr **result) +gfc_match_structure_constructor (gfc_symbol *sym, gfc_symtree *symtree, + gfc_expr **result) { match m; gfc_expr *e; - gfc_symtree *symtree; bool t = true; - gfc_get_ha_sym_tree (sym->name, &symtree); - e = gfc_get_expr (); - e->symtree = symtree; e->expr_type = EXPR_FUNCTION; + e->symtree = symtree; e->where = gfc_current_locus; gcc_assert (gfc_fl_struct (sym->attr.flavor) |