The attached patch implements a check for F2015:C830. The wording of the F2008:C531 is nearly identical, but the restriction on BLOCK is noted in the normative test. The 3 lines in the new testcase show be sufficient to see the issue. In regression testing, I needed to adjust the regex pattern in a few existing test because it seems my patch now catches the problem earlier.
Regression tested on x86_64-*-freebsd. OK to commit? 2018-01-26 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/83633 * decl.c (variable_decl): Check that an explicit-shape-array with nonconstant bounds is allowed. 2018-01-26 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/83633 * gfortran.dg/explicit_shape_1.f90: New test. * gfortran.dg/automatic_module_variable.f90: Update regex. * gfortran.dg/bad_automatic_objects_1.f90: Ditto. * gfortran.dg/constant_shape.f90: Ditto. * gfortran.dg/dec_structure_23.f90: Ditto. * gfortran.dg/pr78240.f90: Ditto. -- Steve
Index: gcc/fortran/decl.c =================================================================== --- gcc/fortran/decl.c (revision 257103) +++ gcc/fortran/decl.c (working copy) @@ -2280,7 +2280,10 @@ variable_decl (int elem) /* At this point, we know for sure if the symbol is PARAMETER and can thus determine (and check) whether it can be implied-shape. If it was parsed as assumed-size, change it because PARAMETERs can not - be assumed-size. */ + be assumed-size. + + An explicit-shape-array cannot appear under several conditions. + That check is done here as well. */ if (as) { if (as->type == AS_IMPLIED_SHAPE && current_attr.flavor != FL_PARAMETER) @@ -2302,6 +2305,44 @@ variable_decl (int elem) m = MATCH_ERROR; goto cleanup; } + + /* F2015:C830 (R816) An explicit-shape-spec whose bounds are not + constant expressions shall appear only in a subprogram, derived + type definition, BLOCK construct, or interface body. */ + if (as->type == AS_EXPLICIT + && gfc_current_state () != COMP_BLOCK + && gfc_current_state () != COMP_DERIVED + && gfc_current_state () != COMP_FUNCTION + && gfc_current_state () != COMP_INTERFACE + && gfc_current_state () != COMP_SUBROUTINE) + { + gfc_expr *e; + bool not_constant = false; + + for (int i = 0; i < as->rank + as->corank; i++) + { + e = gfc_copy_expr (as->lower[i]); + gfc_resolve_expr (e); + gfc_simplify_expr (e, 0); + if (e && (e->expr_type != EXPR_CONSTANT)) + not_constant = true; + gfc_free_expr (e); + + e = gfc_copy_expr (as->upper[i]); + gfc_resolve_expr (e); + gfc_simplify_expr (e, 0); + if (e && (e->expr_type != EXPR_CONSTANT)) + not_constant = true; + gfc_free_expr (e); + } + + if (not_constant) + { + gfc_error ("Explicit shaped array with nonconstant bounds at %C"); + m = MATCH_ERROR; + goto cleanup; + } + } } char_len = NULL; @@ -2421,6 +2462,7 @@ variable_decl (int elem) && gfc_current_block ()->result && strcmp ("ppr@", gfc_current_block ()->result->name) == 0) strcpy (name, "ppr@"); + /* OK, we've successfully matched the declaration. Now put the symbol in the current namespace, because it might be used in the Index: gcc/testsuite/gfortran.dg/explicit_shape_1.f90 =================================================================== --- gcc/testsuite/gfortran.dg/explicit_shape_1.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/explicit_shape_1.f90 (working copy) @@ -0,0 +1,7 @@ +! { dg-do compile } +! PR fortran/83633 +! Original testcase by Nathan T. Weeks <weeks at iastate dot edu> +! +integer :: A(command_argument_count()) = 1 ! { dg-error "nonconstant bounds" } +write (*,*) A +end Index: gcc/testsuite/gfortran.dg/automatic_module_variable.f90 =================================================================== --- gcc/testsuite/gfortran.dg/automatic_module_variable.f90 (revision 257103) +++ gcc/testsuite/gfortran.dg/automatic_module_variable.f90 (working copy) @@ -1,10 +1,12 @@ ! { dg-do compile } ! Tests fix for PR15976 ! +! Error message update with patch for PR fortran/83633 +! module sd integer, parameter :: n = 20 integer :: i(n) - integer :: j(m) ! { dg-error "must have constant shape" } + integer :: j(m) ! { dg-error "array with nonconstant bounds" } integer, pointer :: p(:) integer, allocatable :: q(:) contains Index: gcc/testsuite/gfortran.dg/bad_automatic_objects_1.f90 =================================================================== --- gcc/testsuite/gfortran.dg/bad_automatic_objects_1.f90 (revision 257103) +++ gcc/testsuite/gfortran.dg/bad_automatic_objects_1.f90 (working copy) @@ -5,16 +5,18 @@ ! ! Contributed by Joost VandeVondele <jv...@cam.ac.uk> ! +! Error message update with patch for PR fortran/83633 +! module foo integer :: i end module foo module bar use foo - integer, dimension (i) :: j ! { dg-error "must have constant shape" } + integer, dimension (i) :: j ! { dg-error "array with nonconstant bounds" } character (len = i) :: c1 ! { dg-error "must have constant character length" } end module bar program foobar use foo - integer, dimension (i) :: k ! { dg-error "must have constant shape" } + integer, dimension (i) :: k ! { dg-error "array with nonconstant bounds" } character (len = i) :: c2 ! { dg-error "must have constant character length" } end program foobar Index: gcc/testsuite/gfortran.dg/constant_shape.f90 =================================================================== --- gcc/testsuite/gfortran.dg/constant_shape.f90 (revision 257103) +++ gcc/testsuite/gfortran.dg/constant_shape.f90 (working copy) @@ -3,7 +3,8 @@ ! PR 78392: ICE in gfc_trans_auto_array_allocation, at fortran/trans-array.c:5979 ! ! Contributed by Janus Weil <ja...@gcc.gnu.org> - +! Error message update with patch for PR fortran/83633 +! module mytypes implicit none contains @@ -15,6 +16,6 @@ end module program test use mytypes implicit none - integer, dimension(get_i()) :: x ! { dg-error "must have constant shape" } - print *, size (x) + integer, dimension(get_i()) :: x ! { dg-error "array with nonconstant bounds" } + print *, size (x) ! { dg-error "has no IMPLICIT type" } end Index: gcc/testsuite/gfortran.dg/dec_structure_23.f90 =================================================================== --- gcc/testsuite/gfortran.dg/dec_structure_23.f90 (revision 257103) +++ gcc/testsuite/gfortran.dg/dec_structure_23.f90 (working copy) @@ -6,14 +6,15 @@ ! Test a regression where an ICE occurred attempting to create array variables ! with non-constant array-specs in legacy clist initializers. ! - +! Error message update with patch for PR fortran/83633 +! program p implicit none integer :: nn real :: rr structure /s/ - integer x(n) /1/ ! { dg-error "xpected constant" } - integer xx(nn) /1/ ! { dg-error "xpected constant" } - integer xxx(rr) /1.0/ ! { dg-error "xpected constant" } + integer x(n) /1/ ! { dg-error "array with nonconstant bounds" } + integer xx(nn) /1/ ! { dg-error "array with nonconstant bounds" } + integer xxx(rr) /1.0/ ! { dg-error "array with nonconstant bounds" } end structure end Index: gcc/testsuite/gfortran.dg/pr78240.f90 =================================================================== --- gcc/testsuite/gfortran.dg/pr78240.f90 (revision 257103) +++ gcc/testsuite/gfortran.dg/pr78240.f90 (working copy) @@ -7,9 +7,10 @@ ! to the error handling routine for non-constant array-specs in DATA list ! initializers. ! - +! Error message update with patch for PR fortran/83633 +! program p - integer x(n) /1/ ! { dg-error "cannot appear in the expression" } + integer x(n) /1/ ! { dg-error "array with nonconstant bounds" } end ! { dg-prune-output "module or main program" } ! { dg-prune-output "Nonconstant array" }