diff options
author | kargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2019-08-17 18:16:51 +0000 |
---|---|---|
committer | kargl <kargl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2019-08-17 18:16:51 +0000 |
commit | b196fa8d1bcb9e85e1f763fdb2ce763056305500 (patch) | |
tree | 482d2427fecb88c336729df5aed664f0121917af | |
parent | 4bbb23e415a943955a0bc4e6b4f5294caddd4972 (diff) |
2019-08-17 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/91471
* primary.c (gfc_variable_attr): Remove a gfc_internal_error(),
which cannot be reached by conforming Fortran code, but seems to
be reachable from nonconforming Fortran code. Treat the AR_UNKNOWN
case as a no-op.
2019-08-17 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/91471
* gfortran.dg/pr91471.f90: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-9-branch@274612 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/primary.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr91471.f90 | 14 |
4 files changed, 31 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9904d79dd68..87eda46365b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,13 @@ 2019-08-17 Steven G. Kargl <kargl@gcc.gnu.org> + PR fortran/91471 + * primary.c (gfc_variable_attr): Remove a gfc_internal_error(), + which cannot be reached by conforming Fortran code, but seems to + be reachable from nonconforming Fortran code. Treat the AR_UNKNOWN + case as a no-op. + +2019-08-17 Steven G. Kargl <kargl@gcc.gnu.org> + PR fortran/78739 * match.c (gfc_match_st_function): When matching a statement function, need to check if the statement function name shadows the function diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index e918372ef85..4af1db5f4bd 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -2559,12 +2559,10 @@ gfc_variable_attr (gfc_expr *expr, gfc_typespec *ts) break; case AR_UNKNOWN: - /* If any of start, end or stride is not integer, there will - already have been an error issued. */ - int errors; - gfc_get_errors (NULL, &errors); - if (errors == 0) - gfc_internal_error ("gfc_variable_attr(): Bad array reference"); + /* For standard conforming code, AR_UNKNOWN should not happen. + For nonconforming code, gfortran can end up here. Treat it + as a no-op. */ + break; } break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4c62c6a259d..4c944f8aa47 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2019-08-17 Steven G. Kargl <kargl@gcc.gnu.org> + PR fortran/91471 + * gfortran.dg/pr91471.f90: New test. + +2019-08-17 Steven G. Kargl <kargl@gcc.gnu.org> + PR fortran/78739 * fortran.dg/pr78739.f90: New test. diff --git a/gcc/testsuite/gfortran.dg/pr91471.f90 b/gcc/testsuite/gfortran.dg/pr91471.f90 new file mode 100644 index 00000000000..fa798444c1d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr91471.f90 @@ -0,0 +1,14 @@ +! { dg-do compile } +! PR fortran/91471 +! Code contributed by Sameeran Joshi <SameeranJayant dot Joshi at amd dot com> +! +! This invalid code (x(1) is referenced, but never set) caused an ICE due +! to hitting a gfc_internal_error() in primary.c (gfc_variable_attr). The +! fix is to remove that gfc_internal_error(). +! +program dynamic + implicit none + integer, dimension(:), allocatable :: x + allocate(x(1)) + stop x(1) +end program dynamic |