fortran: ICE in gfc_match_assignment PR93600
authorMark Eggleston <markeggleston@gcc.gnu.org>
Mon, 23 Mar 2020 14:42:20 +0000 (14:42 +0000)
committerMark Eggleston <markeggleston@gcc.gnu.org>
Mon, 23 Mar 2020 14:42:20 +0000 (14:42 +0000)
commitb0d84ecc55f3ea86764b119040c5ffde36cd0524
tree73d9ff77b120458df6091a1c83710812d515c6ce
parent4897bb0045dd68474176be9aafb4d77bac4b363a
fortran: ICE in gfc_match_assignment PR93600

This patch builds on the original patch by Steve Kargl that fixed the
ICE and produced an "Unclassifiable statement at (1)" error. The
processing of parameter variables now correctly handles zero length
arrays used with %kind and %len. A side affect is that "Unclassifiable"
error now says "Assignment to constant expression at (1)". It also
fixes PR93365.

gcc/fortran/ChangeLog:

PR fortran/93600
* expr.c (simplify_parameter_variable): Check whether the ref
chain contains INQUIRY_LEN or INQUIRY_KIND and set inquiry
boolean. When an empty array has been identified and a new
new EXPR_ARRAY expression has been created only return that
expression if inquiry is not set. This allows the new
expression to drop through to be simplified into a
EXPR_CONSTANT representing %kind or %len.
* match.c (gfc_match_assignment): If lvalue doesn't have a
symtree free both lvalue and rvalue expressions and return
an error.
* resolv.c (gfc_resolve_ref): Ensure that code to handle
INQUIRY_LEN is only performed for arrays with deferred types.

gcc/testsuite/ChangeLog:

PR fortran/93365
PR fortran/93600
* gfortran.dg/pr93365.f90: New test.
* gfortran.dg/pr93600_1.f90: New test.
* gfortran.dg/pr93600_2.f90: New test.
gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/fortran/match.c
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr93365.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr93600_1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr93600_2.f90 [new file with mode: 0644]