diff options
author | Harald Anlauf <anlauf@gmx.de> | 2023-08-23 21:08:01 +0200 |
---|---|---|
committer | Harald Anlauf <anlauf@gmx.de> | 2023-08-23 21:08:01 +0200 |
commit | 829c0c06fe7ba2cf3e83508b95999b884b21236d (patch) | |
tree | 13e390896bcc5ccc2164329320fcc8876e49bca7 /gcc | |
parent | 0cfc9c953d0221ec3971a25e6509ebe1041f142e (diff) | |
download | gcc-829c0c06fe7ba2cf3e83508b95999b884b21236d.zip gcc-829c0c06fe7ba2cf3e83508b95999b884b21236d.tar.gz gcc-829c0c06fe7ba2cf3e83508b95999b884b21236d.tar.bz2 |
Fortran: improve diagnostic message for COMMON with automatic object [PR32986]
gcc/fortran/ChangeLog:
PR fortran/32986
* resolve.cc (is_non_constant_shape_array): Add forward declaration.
(resolve_common_vars): Diagnose automatic array object in COMMON.
(resolve_symbol): Prevent confusing follow-on error.
gcc/testsuite/ChangeLog:
PR fortran/32986
* gfortran.dg/common_28.f90: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/resolve.cc | 15 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/common_28.f90 | 7 |
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index ce8261d..1042b8c 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -959,6 +959,10 @@ cleanup: } +/* Forward declaration. */ +static bool is_non_constant_shape_array (gfc_symbol *sym); + + /* Resolve common variables. */ static void resolve_common_vars (gfc_common_head *common_block, bool named_common) @@ -1007,6 +1011,15 @@ resolve_common_vars (gfc_common_head *common_block, bool named_common) gfc_error_now ("%qs at %L cannot appear in COMMON " "[F2008:C5100]", csym->name, &csym->declared_at); + if (csym->attr.dimension && is_non_constant_shape_array (csym)) + { + gfc_error_now ("Automatic object %qs at %L cannot appear in " + "COMMON at %L", csym->name, &csym->declared_at, + &common_block->where); + /* Avoid confusing follow-on error. */ + csym->error = 1; + } + if (csym->ts.type != BT_DERIVED) continue; @@ -16612,7 +16625,7 @@ resolve_symbol (gfc_symbol *sym) /* Resolve array specifier. Check as well some constraints on COMMON blocks. */ - check_constant = sym->attr.in_common && !sym->attr.pointer; + check_constant = sym->attr.in_common && !sym->attr.pointer && !sym->error; /* Set the formal_arg_flag so that check_conflict will not throw an error for host associated variables in the specification diff --git a/gcc/testsuite/gfortran.dg/common_28.f90 b/gcc/testsuite/gfortran.dg/common_28.f90 new file mode 100644 index 0000000..9b583b9 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/common_28.f90 @@ -0,0 +1,7 @@ +! { dg-do compile } +! PR fortran/32986 - Improve diagnostic message for COMMON with automatic object + +function a(n) + real :: x(n) ! { dg-error "Automatic object" } + common /c/ x ! { dg-error "cannot appear in COMMON" } +end function |