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:
Harald Anlauf 2023-08-23 21:08:01 +02:00
parent 0cfc9c953d
commit 829c0c06fe
2 changed files with 21 additions and 1 deletions

View file

@ -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

View 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