Hi, I tried the attached patch that gets rid of gfc_array_range_type because it seems pointless from middle-end POV. It however affects .original dumps in the following way: --- assumed_type_2.f90.003t.original 2016-05-24 14:32:45.771503552 +0200 +++ ../assumed_type_2.f90.003t.original 2016-05-24 14:34:07.637311579 +0200 @@ -246,7 +246,7 @@ parm.20.offset = NON_LVALUE_EXPR <D.3501>; D.3504 = _gfortran_internal_pack (&parm.20); sub_array_assumed (D.3504); - if ((void *[0:] *) parm.20.data != (void *[0:] *) D.3504) + if ((void *[<unknown>] *) parm.20.data != (void *[<unknown>] *) D.3504) { _gfortran_internal_unpack (&parm.20, D.3504); __builtin_free (D.3504); @@ -576,12 +576,12 @@ { static logical(kind=4) C.3584 = 1;
- sub_scalar (&(*(real(kind=4)[0:] * restrict) array_real_alloc.data)[(array_real_alloc.offset + array_real_alloc.dim[1].stride * 2) + 3], &C.3584); + sub_scalar (&(*(real(kind=4)[<unknown>] * restrict) array_real_alloc.data)[(array_real_alloc.offset + array_real_alloc.dim[1].stride * 2) + 3], &C.3584); } { static logical(kind=4) C.3585 = 1; - sub_scalar (&(*(character(kind=1)[0:][1:1] *) array_char_ptr.data)[array_char_ptr.offset + NON_LVALUE_EXPR <array_char_ptr.dim[1].stride>], &C.3585, 1); + sub_scalar (&(*(character(kind=1)[<unknown>][1:1] *) array_char_ptr.data)[array_char_ptr.offset + NON_LVALUE_EXPR <array_char_ptr.dim[1].stride>], &C.3585, 1); } { static logical(kind=4) C.3586 = 1; Which breaks testsuite. Perhaps just <unknown> can be printed as 0: (because that is what NULL domain means). This is done by dump_array_domain in pretty-print.c and I am not quite sure who else relies on the format. Or we can just compoensate the testsuite given that the bounds are really unknown... Honza Index: trans-types.c =================================================================== --- trans-types.c (revision 236556) +++ trans-types.c (working copy) @@ -52,7 +52,6 @@ along with GCC; see the file COPYING3. CInteropKind_t c_interop_kinds_table[ISOCBINDING_NUMBER]; tree gfc_array_index_type; -tree gfc_array_range_type; tree gfc_character1_type_node; tree pvoid_type_node; tree prvoid_type_node; @@ -945,12 +944,6 @@ gfc_init_types (void) = build_pointer_type (build_function_type_list (void_type_node, NULL_TREE)); gfc_array_index_type = gfc_get_int_type (gfc_index_integer_kind); - /* We cannot use gfc_index_zero_node in definition of gfc_array_range_type, - since this function is called before gfc_init_constants. */ - gfc_array_range_type - = build_range_type (gfc_array_index_type, - build_int_cst (gfc_array_index_type, 0), - NULL_TREE); /* The maximum array element size that can be handled is determined by the number of bits available to store this field in the array @@ -1920,12 +1913,12 @@ gfc_get_array_type_bounds (tree etype, i /* We define data as an array with the correct size if possible. Much better than doing pointer arithmetic. */ - if (stride) + if (stride && akind >= GFC_ARRAY_UNKNOWN) rtype = build_range_type (gfc_array_index_type, gfc_index_zero_node, int_const_binop (MINUS_EXPR, stride, build_int_cst (TREE_TYPE (stride), 1))); else - rtype = gfc_array_range_type; + rtype = NULL; arraytype = build_array_type (etype, rtype); arraytype = build_pointer_type (arraytype); if (restricted)