aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface/utils.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2021-11-17 00:09:56 +0100
committerPierre-Marie de Rodat <derodat@adacore.com>2021-12-02 16:26:31 +0000
commit5a11ffadf58a3668655e08f610281ac5567b4d93 (patch)
tree5d4bf3f53bbf4ab6414139a4414798a40fa02df1 /gcc/ada/gcc-interface/utils.c
parent9e10b7002acb3ce6134a6343cba04691f8c2d8ff (diff)
downloadgcc-5a11ffadf58a3668655e08f610281ac5567b4d93.zip
gcc-5a11ffadf58a3668655e08f610281ac5567b4d93.tar.gz
gcc-5a11ffadf58a3668655e08f610281ac5567b4d93.tar.bz2
[Ada] Fix packing for array component with discriminated part
gcc/ada/ * gcc-interface/gigi.h (aggregate_type_contains_array_p): Delete. (type_has_variable_size): Declare. * gcc-interface/decl.c (adjust_packed): Return 0 only if the field type is an array with variable size. * gcc-interface/utils.c (aggregate_type_contains_array_p): Make static and remove SELF_REFERENTIAL parameter. (type_has_variable_size): Make public. (create_field_decl): Adjust call to aggregate_type_contains_array_p.
Diffstat (limited to 'gcc/ada/gcc-interface/utils.c')
-rw-r--r--gcc/ada/gcc-interface/utils.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index ab5ca5b..d5dd04a 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -2902,12 +2902,10 @@ create_var_decl (tree name, tree asm_name, tree type, tree init,
return var_decl;
}
-/* Return true if TYPE, an aggregate type, contains (or is) an array.
- If SELF_REFERENTIAL is true, then an additional requirement on the
- array is that it be self-referential. */
+/* Return true if TYPE, an aggregate type, contains (or is) an array. */
-bool
-aggregate_type_contains_array_p (tree type, bool self_referential)
+static bool
+aggregate_type_contains_array_p (tree type)
{
switch (TREE_CODE (type))
{
@@ -2918,14 +2916,13 @@ aggregate_type_contains_array_p (tree type, bool self_referential)
tree field;
for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
if (AGGREGATE_TYPE_P (TREE_TYPE (field))
- && aggregate_type_contains_array_p (TREE_TYPE (field),
- self_referential))
+ && aggregate_type_contains_array_p (TREE_TYPE (field)))
return true;
return false;
}
case ARRAY_TYPE:
- return self_referential ? type_contains_placeholder_p (type) : true;
+ return true;
default:
gcc_unreachable ();
@@ -2935,7 +2932,7 @@ aggregate_type_contains_array_p (tree type, bool self_referential)
/* Return true if TYPE is a type with variable size or a padding type with a
field of variable size or a record that has a field with such a type. */
-static bool
+bool
type_has_variable_size (tree type)
{
tree field;
@@ -3037,7 +3034,7 @@ create_field_decl (tree name, tree type, tree record_type, tree size, tree pos,
|| (!pos && type_has_variable_size (type))
|| (!pos
&& AGGREGATE_TYPE_P (type)
- && aggregate_type_contains_array_p (type, false))))
+ && aggregate_type_contains_array_p (type))))
SET_DECL_ALIGN (field_decl, BITS_PER_UNIT);
/* Bump the alignment if need be, either for bitfield/packing purposes or