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.
This commit is contained in:
parent
0cfc9c953d
commit
829c0c06fe
2 changed files with 21 additions and 1 deletions
|
@ -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
|
||||
|
|
7
gcc/testsuite/gfortran.dg/common_28.f90
Normal file
7
gcc/testsuite/gfortran.dg/common_28.f90
Normal file
|
@ -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
|
Loading…
Add table
Reference in a new issue