diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2023-12-16 13:26:47 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2023-12-16 13:26:47 +0000 |
commit | 5ae6f524f5d4ee2ab79ba797fa4901daf90afb25 (patch) | |
tree | 5de0ed1bfea9d7921e0c643c1f4bcbaaef9f9986 /gcc/fortran/parse.cc | |
parent | 39f9c426f58448d6df340cdccd84e05721a20921 (diff) | |
download | gcc-5ae6f524f5d4ee2ab79ba797fa4901daf90afb25.zip gcc-5ae6f524f5d4ee2ab79ba797fa4901daf90afb25.tar.gz gcc-5ae6f524f5d4ee2ab79ba797fa4901daf90afb25.tar.bz2 |
Fortran: Fix problems with class array function selectors [PR112834]
2023-12-16 Paul Thomas <pault@gcc.gnu.org>
gcc/fortran
PR fortran/112834
* match.cc (build_associate_name): Fix whitespace issues.
(select_type_set_tmp): If the selector is of unknown type, go
the SELECT TYPE selector to see if this is a function and, if
the result is available, use its typespec.
* parse.cc (parse_associate): Again, use the function result if
the type of the selector result is unknown.
* trans-stmt.cc (trans_associate_var): The expression has to be
of type class, for class_target to be true. Convert and fix
class functions. Pass the fixed expression.
PR fortran/111853
* resolve.cc (gfc_expression_rank): Avoid null dereference.
gcc/testsuite/
PR fortran/112834
* gfortran.dg/associate_63.f90 : New test.
PR fortran/111853
* gfortran.dg/pr111853.f90 : New test.
Diffstat (limited to 'gcc/fortran/parse.cc')
-rw-r--r-- | gcc/fortran/parse.cc | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/gcc/fortran/parse.cc b/gcc/fortran/parse.cc index 9b4c392..042a6ad 100644 --- a/gcc/fortran/parse.cc +++ b/gcc/fortran/parse.cc @@ -5136,7 +5136,7 @@ parse_associate (void) gfc_current_ns = my_ns; for (a = new_st.ext.block.assoc; a; a = a->next) { - gfc_symbol* sym; + gfc_symbol *sym, *tsym; gfc_expr *target; int rank; @@ -5200,6 +5200,16 @@ parse_associate (void) sym->ts.type = BT_DERIVED; sym->ts.u.derived = derived; } + else if (target->symtree && (tsym = target->symtree->n.sym)) + { + sym->ts = tsym->result ? tsym->result->ts : tsym->ts; + if (sym->ts.type == BT_CLASS) + { + if (CLASS_DATA (sym)->as) + target->rank = CLASS_DATA (sym)->as->rank; + sym->attr.class_ok = 1; + } + } } rank = target->rank; |