This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] PR fortran/91864 -- inquiry parameter is a constant
- From: Steve Kargl <sgk at troutmask dot apl dot washington dot edu>
- To: fortran at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Sat, 28 Sep 2019 09:27:22 -0700
- Subject: Re: [PATCH] PR fortran/91864 -- inquiry parameter is a constant
- References: <20190924220731.GA53020@troutmask.apl.washington.edu>
- Reply-to: sgk at troutmask dot apl dot washington dot edu
Committed as r276253.
--
steve
On Tue, Sep 24, 2019 at 03:07:31PM -0700, Steve Kargl wrote:
> The attached patch has been tested on x86_64-*-freebsd. OK to commit?
>
> 2019-09-24 Steven G. Kargl <kargl@gcc.gnu.org>
>
> PR fortran/91864
> * gcc/fortran/io.c (match_io_element): An inquiry parameter cannot be
> read into.
> * gcc/fortran/match.c (gfc_match_allocate): An inquiry parameter
> can be neither an allocate-object nor stat variable.
> (gfc_match_deallocate): An inquiry parameter cannot be deallocated.
>
> 2019-09-24 Steven G. Kargl <kargl@gcc.gnu.org>
>
> PR fortran/91864
> * gcc/testsuite/gfortran.dg/pr91864.f90
>
> --
> Steve
> Index: gcc/fortran/io.c
> ===================================================================
> --- gcc/fortran/io.c (revision 276104)
> +++ gcc/fortran/io.c (working copy)
> @@ -3657,8 +3657,18 @@ match_io_element (io_kind k, gfc_code **cpp)
> {
> m = gfc_match_variable (&expr, 0);
> if (m == MATCH_NO)
> - gfc_error ("Expected variable in READ statement at %C");
> + {
> + gfc_error ("Expecting variable in READ statement at %C");
> + m = MATCH_ERROR;
> + }
>
> + if (m == MATCH_YES && expr->expr_type == EXPR_CONSTANT)
> + {
> + gfc_error ("Expecting variable or io-implied-do in READ statement "
> + "at %L", &expr->where);
> + m = MATCH_ERROR;
> + }
> +
> if (m == MATCH_YES
> && expr->expr_type == EXPR_VARIABLE
> && expr->symtree->n.sym->attr.external)
> @@ -3667,7 +3677,6 @@ match_io_element (io_kind k, gfc_code **cpp)
> &expr->where);
> m = MATCH_ERROR;
> }
> -
> }
> else
> {
> Index: gcc/fortran/match.c
> ===================================================================
> --- gcc/fortran/match.c (revision 276104)
> +++ gcc/fortran/match.c (working copy)
> @@ -4242,6 +4242,12 @@ gfc_match_allocate (void)
> if (m == MATCH_ERROR)
> goto cleanup;
>
> + if (tail->expr->expr_type == EXPR_CONSTANT)
> + {
> + gfc_error ("Unexpected constant at %C");
> + goto cleanup;
> + }
> +
> if (gfc_check_do_variable (tail->expr->symtree))
> goto cleanup;
>
> @@ -4374,6 +4380,12 @@ alloc_opt_list:
> tmp = NULL;
> saw_stat = true;
>
> + if (stat->expr_type == EXPR_CONSTANT)
> + {
> + gfc_error ("STAT tag at %L cannot be a constant", &stat->where);
> + goto cleanup;
> + }
> +
> if (gfc_check_do_variable (stat->symtree))
> goto cleanup;
>
> @@ -4649,6 +4661,12 @@ gfc_match_deallocate (void)
> goto cleanup;
> if (m == MATCH_NO)
> goto syntax;
> +
> + if (tail->expr->expr_type == EXPR_CONSTANT)
> + {
> + gfc_error ("Unexpected constant at %C");
> + goto cleanup;
> + }
>
> if (gfc_check_do_variable (tail->expr->symtree))
> goto cleanup;
> Index: gcc/testsuite/gfortran.dg/pr91864.f90
> ===================================================================
> --- gcc/testsuite/gfortran.dg/pr91864.f90 (nonexistent)
> +++ gcc/testsuite/gfortran.dg/pr91864.f90 (working copy)
> @@ -0,0 +1,22 @@
> +program p
> + integer :: i
> + read (*,*) i%kind ! { dg-error "Expecting variable or io-implied-do" }
> +end
> +
> +subroutine t
> + integer, allocatable :: x(:)
> + integer :: stat
> + allocate (x(3), stat=stat%kind) ! { dg-error "cannot be a constant" }
> +end
> +
> +subroutine u
> + integer, allocatable :: x(:)
> + integer :: stat
> + allocate (x(3), stat%kind=stat) ! { dg-error "Unexpected constant" }
> +end
> +
> +subroutine v
> + integer, allocatable :: x(:)
> + integer :: stat
> + deallocate (x, stat%kind=stat) ! { dg-error "Unexpected constant" }
> +end
--
Steve
20170425 https://www.youtube.com/watch?v=VWUpyCsUKR4
20161221 https://www.youtube.com/watch?v=IbCHE-hONow