diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2021-10-12 09:56:08 +0200 |
---|---|---|
committer | Tobias Burnus <tobias@codesourcery.com> | 2021-10-12 09:56:08 +0200 |
commit | eb92cd57a1ebe7cd7589bdbec34d9ae337752ead (patch) | |
tree | 39db63459b97064e20f383b5179a8f3713c5a598 /gcc/fortran/trans-array.c | |
parent | 8e1fe3f779185cc678493ceda42c2e620a5c1387 (diff) | |
download | gcc-eb92cd57a1ebe7cd7589bdbec34d9ae337752ead.zip gcc-eb92cd57a1ebe7cd7589bdbec34d9ae337752ead.tar.gz gcc-eb92cd57a1ebe7cd7589bdbec34d9ae337752ead.tar.bz2 |
Fortran: Various CLASS + assumed-rank fixed [PR102541]
Starting point was PR102541, were a previous patch caused an invalid
e->ref access for class. When testing, it turned out that for
CLASS to CLASS the code was never executed - additionally, issues
appeared for optional and a bogus error for -fcheck=all. In particular:
There were a bunch of issues related to optional CLASS, can have the
'attr.dummy' set in CLASS_DATA (sym) - but sometimes also in 'sym'!?!
Additionally, gfc_variable_attr could return pointer = 1 for nonpointers
when the expr is no longer "var" but "var%_data".
PR fortran/102541
gcc/fortran/ChangeLog:
* check.c (gfc_check_present): Handle optional CLASS.
* interface.c (gfc_compare_actual_formal): Likewise.
* trans-array.c (gfc_trans_g77_array): Likewise.
* trans-decl.c (gfc_build_dummy_array_decl): Likewise.
* trans-types.c (gfc_sym_type): Likewise.
* primary.c (gfc_variable_attr): Fixes for dummy and
pointer when 'class%_data' is passed.
* trans-expr.c (set_dtype_for_unallocated, gfc_conv_procedure_call):
For assumed-rank dummy, fix setting rank for dealloc/notassoc actual
and setting ubound to -1 for assumed-size actuals.
gcc/testsuite/ChangeLog:
* gfortran.dg/assumed_rank_24.f90: New test.
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index e2f59e0..0c5cf4b 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -6549,7 +6549,9 @@ gfc_trans_g77_array (gfc_symbol * sym, gfc_wrapped_block * block) /* Add the initialization code to the start of the function. */ - if (sym->attr.optional || sym->attr.not_always_present) + if ((sym->ts.type == BT_CLASS && CLASS_DATA (sym)->attr.optional) + || sym->attr.optional + || sym->attr.not_always_present) { tree nullify; if (TREE_CODE (parm) != PARM_DECL) |