+2015-12-17  Pierre-Marie de Rodat  <derodat@adacore.com>
+
+       * dwarf2out.h (DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN): New macro.
+       (struct array_descr_info): Use it for the dimensions array's
+       size.
+       * dwarf2out.c (gen_type_die_with_usage): Check that the array
+       descr. language hook does not return an array with more
+       dimensions that it should.
+
 2015-12-17  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * langhooks.h (struct lang_hooks_for_types): Add a
 
+2015-12-17  Pierre-Marie de Rodat  <derodat@adacore.com>
+
+       * gcc-interface/misc.c (gnat_get_array_descr_info): When the
+       array has more dimensions than the language hook can handle,
+       fall back to a nested arrays description.  Handle context-less
+       array types.
+
 2015-12-17  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * gcc-interface/decl.c (gnat_to_gnu_entity): When
 
        break;
       last_dimen = dimen;
     }
+
   info->ndimensions = i;
+
+  /* Too many dimensions?  Give up generating proper description: yield instead
+     nested arrays.  Note that in this case, this hook is invoked once on each
+     intermediate array type: be consistent and output nested arrays for all
+     dimensions.  */
+  if (info->ndimensions > DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN
+      || TYPE_MULTI_ARRAY_P (first_dimen))
+    {
+      info->ndimensions = 1;
+      last_dimen = first_dimen;
+    }
+
   info->element_type = TREE_TYPE (last_dimen);
 
   /* Now iterate over all dimensions in source-order and fill the info
             expressions:  arrays that are constrained by record discriminants
             and XUA types.  */
          const bool is_xua_type =
-          (TREE_CODE (TYPE_CONTEXT (first_dimen)) != RECORD_TYPE
+          (TYPE_CONTEXT (first_dimen) != NULL_TREE
+            && TREE_CODE (TYPE_CONTEXT (first_dimen)) != RECORD_TYPE
            && contains_placeholder_p (TYPE_MIN_VALUE (index_type)));
 
          if (is_xua_type && gnat_encodings != DWARF_GNAT_ENCODINGS_MINIMAL)
 
       memset (&info, 0, sizeof (info));
       if (lang_hooks.types.get_array_descr_info (type, &info))
        {
+         /* Fortran sometimes emits array types with no dimension.  */
+         gcc_assert (info.ndimensions >= 0
+                     && (info.ndimensions
+                         <= DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN));
          gen_descr_array_type_die (type, &info, context_die);
          TREE_ASM_WRITTEN (type) = 1;
          return;
 
   array_descr_ordering_column_major
 };
 
+#define DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN 16
+
 struct array_descr_info
 {
   int ndimensions;
       /* Only Fortran uses more than one dimension for array types.  For other
         languages, the stride can be rather specified for the whole array.  */
       tree stride;
-    } dimen[10];
+    } dimen[DWARF2OUT_ARRAY_DESCR_INFO_MAX_DIMEN];
 };
 
 enum fixed_point_scale_factor