This fixes an issue with nested structures and adds an Alignment clause to
counter the effect of the Pack aspect.
Tested on x86_64/Linux, applied on the mainline.
2020-11-28 Eric Botcazou <ebotca...@adacore.com>
c-family/
* c-ada-spec.c (dump_nested_type) <RECORD_TYPE>: Remove obsolete code.
(dump_ada_structure): Also deal with convention, unchecked union and
bit-field for nested types. In the latter case, print an Alignment
aspect along with the Pack aspect.
--
Eric Botcazou
diff --git a/gcc/c-family/c-ada-spec.c b/gcc/c-family/c-ada-spec.c
index 266a7fe0fa4..883036f4e5c 100644
--- a/gcc/c-family/c-ada-spec.c
+++ b/gcc/c-family/c-ada-spec.c
@@ -2598,16 +2598,6 @@ dump_nested_type (pretty_printer *buffer, tree field, tree t, tree parent,
pp_string (buffer, " is ");
dump_ada_structure (buffer, field_type, t, true, spc);
-
- pp_string (buffer, "with Convention => C_Pass_By_Copy");
-
- if (TREE_CODE (field_type) == UNION_TYPE)
- {
- pp_comma (buffer);
- newline_and_indent (buffer, spc + 5);
- pp_string (buffer, "Unchecked_Union => True");
- }
-
pp_semicolon (buffer);
newline_and_indent (buffer, spc);
break;
@@ -3318,10 +3308,7 @@ dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested,
newline_and_indent (buffer, spc);
/* We disregard the methods for anonymous nested types. */
- if (nested)
- return;
-
- if (has_nontrivial_methods (node))
+ if (has_nontrivial_methods (node) && !nested)
{
pp_string (buffer, "with Import => True,");
newline_and_indent (buffer, spc + 5);
@@ -3339,12 +3326,20 @@ dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested,
if (bitfield_used)
{
+ char buf[32];
pp_comma (buffer);
newline_and_indent (buffer, spc + 5);
pp_string (buffer, "Pack => True");
+ pp_comma (buffer);
+ newline_and_indent (buffer, spc + 5);
+ sprintf (buf, "Alignment => %d", TYPE_ALIGN (node) / BITS_PER_UNIT);
+ pp_string (buffer, buf);
bitfield_used = false;
}
+ if (nested)
+ return;
+
need_semicolon = !dump_ada_methods (buffer, node, spc);
/* Print the static fields of the structure, if any. */