This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] PR fortran/91864 -- inquiry parameter is a constant


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]