diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 06f4d20ef45c970bf5d88dcd287ae8032158a905..bf5b74dab061a1278c6aa049bb144e35388d1ddf 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -1063,7 +1063,13 @@ find_array_section (gfc_expr *expr, gfc_ref *ref)
       if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR)  /* Vector subscript.  */
 	{
 	  gcc_assert (begin);
-	  gcc_assert (begin->expr_type == EXPR_ARRAY); 
+
+	  if (begin->expr_type != EXPR_ARRAY)
+	    {
+	      t = FAILURE;
+	      goto cleanup;
+	    }
+
 	  gcc_assert (begin->rank == 1);
 	  gcc_assert (begin->shape);
 
diff --git a/gcc/testsuite/gfortran.dg/parameter_array_dummy.f90 b/gcc/testsuite/gfortran.dg/parameter_array_dummy.f90
new file mode 100644
index 0000000000000000000000000000000000000000..2aa3ad8ef8cf8b1970fed9b9c9adfc06a8b7dfac
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/parameter_array_dummy.f90
@@ -0,0 +1,21 @@
+! { dg-do run}
+! PR fortran/31188
+program foo_mod
+  implicit none
+  character (len=1), parameter :: letters(2) = (/"a","b"/)
+  call concat(1, [1])
+  call concat(2, [2])
+  call concat(3, [1,2])
+  call concat(4, [2,1])
+  call concat(5, [2,2,2])
+contains
+  subroutine concat(i, ivec)
+    integer, intent(in)  :: i, ivec(:)
+    write (*,*) i, "a" // letters(ivec)
+  end subroutine concat
+end program foo_mod
+! { dg-output "1 aa" }
+! { dg-output "2 ab" }
+! { dg-output "3 aaab" }
+! { dg-output "4 abaa" }
+! { dg-output "5 ababab" }