Check for initialization of substrings beyond bounds in DATA statements.
gcc/fortran/ChangeLog:
	PR fortran/70070
	* data.c (create_character_initializer): Check substring indices
	against bounds.
	(gfc_assign_data_value): Catch error returned from
	create_character_initializer.
gcc/testsuite/ChangeLog:
	PR fortran/70070
	* gfortran.dg/pr70070.f90: New test.
        }
     }
 
+  if (start < 0)
+    {
+      gfc_error ("Substring start index at %L is less than one",
+                &ref->u.ss.start->where);
+      return NULL;
+    }
+  if (end > init->value.character.length)
+    {
+      gfc_error ("Substring end index at %L exceeds the string length",
+                &ref->u.ss.end->where);
+      return NULL;
+    }
+
   if (rvalue->ts.type == BT_HOLLERITH)
     {
       for (size_t i = 0; i < (size_t) len; i++)
       if (lvalue->ts.u.cl->length == NULL && !(ref && ref->u.ss.length != NULL))
        return false;
       expr = create_character_initializer (init, last_ts, ref, rvalue);
+      if (!expr)
+       return false;
     }
   else
     {
 
--- /dev/null
+! { dg-do compile }
+! PR fortran/70070 - ICE on initializing character data beyond min/max bound
+
+program p
+  character(1) :: a, b
+  data (a(i:i),i=0,0) /1*'#'/   ! { dg-error "Substring start index" }
+  data (b(i:i),i=2,3) /2*'#'/   ! { dg-error "Substring end index" }
+end