2008-08-21 Jakub Jelinek * trans-decl.c (gfc_build_qualified_array): Build non-flat array type for debug info purposes. * dwarf2out.c (add_bound_info): If lookup_decl_die failed, try loc_descriptor_from_tree_1. --- gcc/fortran/trans-decl.c.jj 2008-08-21 11:56:09.000000000 +0200 +++ gcc/fortran/trans-decl.c 2008-08-21 23:07:01.000000000 +0200 @@ -703,6 +703,50 @@ gfc_build_qualified_array (tree decl, gf TYPE_DOMAIN (type) = range; layout_type (type); } + + if (nest || write_symbols == NO_DEBUG) + return; + + if (TYPE_NAME (type) != NULL_TREE + && GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1) != NULL_TREE + && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, sym->as->rank - 1)) == VAR_DECL) + { + tree gtype = DECL_ORIGINAL_TYPE (TYPE_NAME (type)); + + for (dim = 0; dim < sym->as->rank - 1; dim++) + { + gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE); + gtype = TREE_TYPE (gtype); + } + gcc_assert (TREE_CODE (gtype) == ARRAY_TYPE); + if (TYPE_MAX_VALUE (TYPE_DOMAIN (gtype)) == NULL) + TYPE_NAME (type) = NULL_TREE; + } + + if (TYPE_NAME (type) == NULL_TREE) + { + tree gtype = TREE_TYPE (type), rtype, type_decl; + + for (dim = sym->as->rank - 1; dim >= 0; dim--) + { + rtype = build_range_type (gfc_array_index_type, + GFC_TYPE_ARRAY_LBOUND (type, dim), + GFC_TYPE_ARRAY_UBOUND (type, dim)); + gtype = build_array_type (gtype, rtype); + /* Ensure the bound variables aren't optimized out at -O0. */ + if (!optimize) + { + if (GFC_TYPE_ARRAY_LBOUND (type, dim) + && TREE_CODE (GFC_TYPE_ARRAY_LBOUND (type, dim)) == VAR_DECL) + DECL_IGNORED_P (GFC_TYPE_ARRAY_LBOUND (type, dim)) = 0; + if (GFC_TYPE_ARRAY_UBOUND (type, dim) + && TREE_CODE (GFC_TYPE_ARRAY_UBOUND (type, dim)) == VAR_DECL) + DECL_IGNORED_P (GFC_TYPE_ARRAY_UBOUND (type, dim)) = 0; + } + } + TYPE_NAME (type) = type_decl = build_decl (TYPE_DECL, NULL, gtype); + DECL_ORIGINAL_TYPE (type_decl) = gtype; + } } --- gcc/dwarf2out.c.jj 2008-08-21 13:15:41.000000000 +0200 +++ gcc/dwarf2out.c 2008-08-21 18:27:30.000000000 +0200 @@ -11943,6 +11943,7 @@ add_bound_info (dw_die_ref subrange_die, case RESULT_DECL: { dw_die_ref decl_die = lookup_decl_die (bound); + dw_loc_descr_ref loc; /* ??? Can this happen, or should the variable have been bound first? Probably it can, since I imagine that we try to create @@ -11951,6 +11952,11 @@ add_bound_info (dw_die_ref subrange_die, later parameter. */ if (decl_die != NULL) add_AT_die_ref (subrange_die, bound_attr, decl_die); + else + { + loc = loc_descriptor_from_tree_1 (bound, 0); + add_AT_location_description (subrange_die, bound_attr, loc); + } break; }