Bug 35723 - Can't use run-time array element in character declaration
Summary: Can't use run-time array element in character declaration
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 4.4.0
: P3 normal
Target Milestone: ---
Assignee: Daniel Kraft
URL:
Keywords: rejects-valid
Depends on:
Blocks: 32834
  Show dependency treegraph
 
Reported: 2008-03-27 20:33 UTC by Dick Hendrickson
Modified: 2008-10-09 07:33 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail: 4.4.0
Last reconfirmed: 2008-09-24 09:59:41


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Dick Hendrickson 2008-03-27 20:33:51 UTC
The following program gives an error message for valid use of
an array element in an expression for an automatic character
array.  

The error message is repeated twice.

Changing from a run-time subscript in the parameter array to a
constant fixes the problem.

Dick Hendrickson

      program try_vf0016
! fails on Windows XP
! gcc version 4.4.0 20080312 (experimental) [trunk revision 133139]
! syntax error for valid syntax

      call       vf0016(  1,  2,  3)

      end
      SUBROUTINE VF0016(nf1,nf2,nf3)
      CHARACTER(LEN=9,KIND=1),DIMENSION(3), PARAMETER
     $     ::  TEST_STRINGS =
     $  (/'       HI','ABC      ','  CDEFG  '/)
      CHARACTER :: TEST_ARRAY
     $(LEN_TRIM(ADJUSTL(TEST_STRINGS(nf1))),  ! changing nf1 to 1 fixes it
     $ SUM(LEN_TRIM(ADJUSTL(TEST_STRINGS))),
     $ LEN_TRIM(ADJUSTL(ADJUSTR(TEST_STRINGS(3)))),
     $ SUM(LEN_TRIM(ADJUSTL(ADJUSTR(TEST_STRINGS(NF1:NF3:NF2)))))   )

       print *, 2, 10, 5, 7
       print *, shape (test_array)
         end



C:\g_experiments\gfortran>gfortran vf0016.f
vf0016.f:14.24:

     $(LEN_TRIM(ADJUSTL(TEST_STRINGS(nf1))),  ! changing nf1 to 1 fixes
                       1
Error: Variable 'test_strings' cannot appear in the expression at (1)
vf0016.f:14.24:

     $(LEN_TRIM(ADJUSTL(TEST_STRINGS(nf1))),  ! changing nf1 to 1 fixes
                       1
Error: Variable 'test_strings' cannot appear in the expression at (1)
Comment 1 Tobias Burnus 2008-03-28 19:40:15 UTC
Confirmed.

A simple patch would be the following:

Index: expr.c
===================================================================
--- expr.c      (Revision 133693)
+++ expr.c      (Arbeitskopie)
@@ -2502,6 +2502,7 @@ check_restricted (gfc_expr *e)
          || sym->attr.use_assoc
          || sym->attr.dummy
          || sym->attr.implied_index
+         || sym->attr.flavor == FL_PARAMETER
          || sym->ns != gfc_current_ns
          || (sym->ns->proc_name != NULL
              && sym->ns->proc_name->attr.flavor == FL_MODULE)

However, this also accepts the following invalid program (note the "i"):

      program try_vf0016
      call    vf0016(  1,  2,  3)
      end
      SUBROUTINE VF0016(nf1,nf2,nf3)
      CHARACTER(LEN=9,KIND=1),DIMENSION(3) , PARAMETER
     $     ::  TEST_STRINGS =
     $  (/'       HI','ABC      ','  CDEFG  '/)
      integer :: i = 2
      CHARACTER :: TEST_ARRAY
     $(LEN_TRIM(ADJUSTL(TEST_STRINGS(i))),  ! changing nf1 to 1 fixes it
     $ SUM(LEN_TRIM(ADJUSTL(TEST_STRINGS))),
     $ LEN_TRIM(ADJUSTL(ADJUSTR(TEST_STRINGS(3)))),
     $ SUM(LEN_TRIM(ADJUSTL(ADJUSTR(TEST_STRINGS(NF1:NF3:NF2)))))   )

       print *, 2, 10, 5, 7
       print *, shape (test_array)
         end

We therefore need to loop over expr->ref and check_restricted() these expressions as well. I think that we can throw in another half a dozen checks as well. ;-)
Comment 2 Daniel Kraft 2008-09-25 10:28:53 UTC
I guess this is illegal, too:

PROGRAM main
  IMPLICIT NONE
  CALL test (5, (/ 1, 2, 3, 4, 5, 6, 7, 8, 9 /) )

CONTAINS

  SUBROUTINE test (n, arr)
    IMPLICIT NONE
    INTEGER :: n, arr(:)

    INTEGER :: i = 5
    INTEGER :: local(arr(n))
    INTEGER :: local2(arr(i)) ! { dg-error "XXX" }
  END SUBROUTINE test

END PROGRAM main

where the definition of local is ok, but local2 is illegal.  This program is however accepted with gfortran without your patch.  I will implement general checking of the references for EXPR_VARIABLEs that have one.
Comment 3 Daniel Kraft 2008-10-09 07:29:53 UTC
Subject: Bug 35723

Author: domob
Date: Thu Oct  9 07:28:22 2008
New Revision: 141001

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=141001
Log:
2008-10-09  Daniel Kraft  <d@domob.eu>

	PR fortran/35723
	* gfortran.h (gfc_suppress_error): Removed from header.
	(gfc_push_suppress_errors), (gfc_pop_suppress_errors): New methods.
	* array.c (gfc_array_size): Use new gfc_push/pop_suppress_errors
	instead of directly changing gfc_suppress_error.
	* intrinsic.c (gfc_intrinsic_func_interface): Ditto.
	(gfc_intrinsic_sub_interface): Ditto.
	* error.c (suppress_errors): Made static from `gfc_suppress_error'.
	(gfc_push_suppress_errors), (gfc_pop_suppress_errors): New methods.
	(gfc_notify_std), (gfc_error): Use new static name of global.
	* expr.c (check_arglist), (check_references): New methods.
	(check_restricted): Check arglists and references of EXPR_FUNCTIONs
	and EXPR_VARAIBALEs, respectively.  Allow PARAMETER symbols.

2008-10-09  Daniel Kraft  <d@domob.eu>

	PR fortran/35723
	* gfortran.dg/restricted_expression_1.f90: New test.
	* gfortran.dg/restricted_expression_2.f90: New test.
	* gfortran.dg/restricted_expression_3.f90: New test.

Added:
    trunk/gcc/testsuite/gfortran.dg/restricted_expression_1.f90
    trunk/gcc/testsuite/gfortran.dg/restricted_expression_2.f90
    trunk/gcc/testsuite/gfortran.dg/restricted_expression_3.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/array.c
    trunk/gcc/fortran/error.c
    trunk/gcc/fortran/expr.c
    trunk/gcc/fortran/gfortran.h
    trunk/gcc/fortran/intrinsic.c
    trunk/gcc/testsuite/ChangeLog

Comment 4 Daniel Kraft 2008-10-09 07:33:43 UTC
Fixed.