utils.c (build_template): Deal with parameters passed by pointer to component of...
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 30 Aug 2019 14:44:50 +0000 (14:44 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 30 Aug 2019 14:44:50 +0000 (14:44 +0000)
* gcc-interface/utils.c (build_template): Deal with parameters
passed by pointer to component of multi-dimensional arrays.

From-SVN: r275190

gcc/ada/ChangeLog
gcc/ada/gcc-interface/utils.c

index 5f004a92fdd0cccc3f02fd0671ab97fbed580d25..463a47a6619b5a58972b3aad85353296635e0e1a 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-30  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/utils.c (build_template): Deal with parameters
+       passed by pointer to component of multi-dimensional arrays.
+
 2019-08-30  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (annotate_value) <CALL_EXPR>: Inline the call
index c6942fe7761a72de2e22b4e00f03a5be27b97e48..020257668e044708c896c37d860d8bc278ed8cf4 100644 (file)
@@ -3953,27 +3953,30 @@ build_template (tree template_type, tree array_type, tree expr)
          && TYPE_HAS_ACTUAL_BOUNDS_P (array_type)))
     bound_list = TYPE_ACTUAL_BOUNDS (array_type);
 
-  /* First make the list for a CONSTRUCTOR for the template.  Go down the
-     field list of the template instead of the type chain because this
-     array might be an Ada array of arrays and we can't tell where the
-     nested arrays stop being the underlying object.  */
-
-  for (field = TYPE_FIELDS (template_type); field;
-       (bound_list
-       ? (bound_list = TREE_CHAIN (bound_list))
-       : (array_type = TREE_TYPE (array_type))),
+  /* First make the list for a CONSTRUCTOR for the template.  Go down
+     the field list of the template instead of the type chain because
+     this array might be an Ada array of array and we can't tell where
+     the nested array stop being the underlying object.  */
+  for (field = TYPE_FIELDS (template_type);
+       field;
        field = DECL_CHAIN (DECL_CHAIN (field)))
     {
       tree bounds, min, max;
 
       /* If we have a bound list, get the bounds from there.  Likewise
         for an ARRAY_TYPE.  Otherwise, if expr is a PARM_DECL with
-        DECL_BY_COMPONENT_PTR_P, use the bounds of the field in the template.
-        This will give us a maximum range.  */
+        DECL_BY_COMPONENT_PTR_P, use the bounds of the field in the
+        template, but this will only give us a maximum range.  */
       if (bound_list)
-       bounds = TREE_VALUE (bound_list);
+       {
+         bounds = TREE_VALUE (bound_list);
+         bound_list = TREE_CHAIN (bound_list);
+       }
       else if (TREE_CODE (array_type) == ARRAY_TYPE)
-       bounds = TYPE_INDEX_TYPE (TYPE_DOMAIN (array_type));
+       {
+         bounds = TYPE_INDEX_TYPE (TYPE_DOMAIN (array_type));
+         array_type = TREE_TYPE (array_type);
+       }
       else if (expr && TREE_CODE (expr) == PARM_DECL
               && DECL_BY_COMPONENT_PTR_P (expr))
        bounds = TREE_TYPE (field);