mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-18 23:51:08 +08:00
Fortran: incorrect array bounds when bound intrinsic used in decl [PR108131]
gcc/fortran/ChangeLog: PR fortran/108131 * array.cc (match_array_element_spec): Avoid too early simplification of matched array element specs that can lead to a misinterpretation when used as array bounds in array declarations. gcc/testsuite/ChangeLog: PR fortran/108131 * gfortran.dg/pr103505.f90: Adjust expected patterns. * gfortran.dg/pr108131.f90: New test.
This commit is contained in:
parent
cf59c8983e
commit
6a95f0e0a0
@ -512,8 +512,6 @@ match_array_element_spec (gfc_array_spec *as)
|
||||
if (!gfc_expr_check_typed (*upper, gfc_current_ns, false))
|
||||
return AS_UNKNOWN;
|
||||
|
||||
gfc_try_simplify_expr (*upper, 0);
|
||||
|
||||
if (((*upper)->expr_type == EXPR_CONSTANT
|
||||
&& (*upper)->ts.type != BT_INTEGER) ||
|
||||
((*upper)->expr_type == EXPR_FUNCTION
|
||||
@ -546,8 +544,6 @@ match_array_element_spec (gfc_array_spec *as)
|
||||
if (!gfc_expr_check_typed (*upper, gfc_current_ns, false))
|
||||
return AS_UNKNOWN;
|
||||
|
||||
gfc_try_simplify_expr (*upper, 0);
|
||||
|
||||
if (((*upper)->expr_type == EXPR_CONSTANT
|
||||
&& (*upper)->ts.type != BT_INTEGER) ||
|
||||
((*upper)->expr_type == EXPR_FUNCTION
|
||||
|
@ -3,7 +3,9 @@
|
||||
! Testcase by G.Steinmetz
|
||||
|
||||
program p
|
||||
integer, parameter :: a((2.)) = [4,8] ! { dg-error "scalar INTEGER" }
|
||||
integer, parameter :: z(1:(2.)) = [4,8] ! { dg-error "scalar INTEGER" }
|
||||
print *, a(1:1) ! { dg-error "Syntax error" }
|
||||
integer, parameter :: a((2.)) = [4,8] ! { dg-error "INTEGER type" }
|
||||
integer, parameter :: z(1:(2.)) = [4,8] ! { dg-error "INTEGER type" }
|
||||
print *, a(1:1)
|
||||
end
|
||||
|
||||
! { dg-prune-output "Parameter array" }
|
||||
|
25
gcc/testsuite/gfortran.dg/pr108131.f90
Normal file
25
gcc/testsuite/gfortran.dg/pr108131.f90
Normal file
@ -0,0 +1,25 @@
|
||||
! { dg-do run }
|
||||
! { dg-additional-options "-fdump-tree-original" }
|
||||
! PR fortran/108131
|
||||
!
|
||||
! Incorrect array bounds when bound intrinsic used in declaration
|
||||
|
||||
program test
|
||||
implicit none
|
||||
integer, parameter :: mg(7:10) = 0
|
||||
integer, parameter :: u = ubound(mg, dim=1)
|
||||
integer, parameter :: cx(-1:ubound(mg, dim=1)) = 1
|
||||
integer, parameter :: dx(lbound(mg, dim=1):ubound(cx, dim=1)) = 2
|
||||
|
||||
write(*,*) ubound(mg, dim=1)
|
||||
write(*,*) ubound(cx, dim=1)
|
||||
if (u /= 10) stop 1
|
||||
if (ubound(mg, dim=1) /= 10) stop 2
|
||||
if (ubound(cx, dim=1) /= 10) stop 3
|
||||
if (ubound(dx, dim=1) /= 10) stop 4
|
||||
if (lbound(mg, dim=1) /= 7) stop 5
|
||||
if (lbound(cx, dim=1) /= -1) stop 6
|
||||
if (lbound(dx, dim=1) /= 7) stop 7
|
||||
end program test
|
||||
|
||||
! { dg-final { scan-tree-dump-not "_gfortran_stop_numeric" "original" } }
|
Loading…
x
Reference in New Issue
Block a user