2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-21 10:30:34 +08:00

Fix small regression with -fdump-ada-spec

When the enumeration constants of an enumeration type are defined by
explicit values, the binding generated by -fdump-ada-spec does not use
an enumeration type on the Ada side, because the set of allowed values
in C/C++ is larger than the set of allowed values in Ada, but instead
use an integer subtype and defines a set of explicit constants, which
used to be of this subtype but were changed to the base type at some
point.  This reinstates the subtype for them.

gcc/c-family/
	* c-ada-spec.c (is_simple_enum): Minor tweaks.
	(dump_ada_enum_type): Add TYPE and PARENT parameters.  For non-simple
	enumeral types use again the type name for the enumeration constants.
	(dump_ada_node): Adjust call to dump_ada_enum_type.
	(dump_nested_type): Likewise.
This commit is contained in:
Eric Botcazou 2021-04-05 19:49:56 +02:00
parent f1d012911b
commit 7ebdef2076

@ -1932,8 +1932,8 @@ dump_ada_template (pretty_printer *buffer, tree t, int spc)
return num_inst > 0;
}
/* Return true if NODE is a simple enum types, that can be mapped to an
Ada enum type directly. */
/* Return true if NODE is a simple enumeral type that can be mapped to an
Ada enumeration type directly. */
static bool
is_simple_enum (tree node)
@ -1947,9 +1947,7 @@ is_simple_enum (tree node)
if (TREE_CODE (int_val) != INTEGER_CST)
int_val = DECL_INITIAL (int_val);
if (!tree_fits_shwi_p (int_val))
return false;
else if (tree_to_shwi (int_val) != count)
if (!tree_fits_shwi_p (int_val) || tree_to_shwi (int_val) != count)
return false;
count++;
@ -1958,11 +1956,12 @@ is_simple_enum (tree node)
return true;
}
/* Dump in BUFFER an enumeral type NODE in Ada syntax. SPC is the indentation
level. */
/* Dump in BUFFER the declaration of enumeral NODE of type TYPE in Ada syntax.
PARENT is the parent node of NODE. SPC is the indentation level. */
static void
dump_ada_enum_type (pretty_printer *buffer, tree node, int spc)
dump_ada_enum_type (pretty_printer *buffer, tree node, tree type, tree parent,
int spc)
{
if (is_simple_enum (node))
{
@ -1993,25 +1992,29 @@ dump_ada_enum_type (pretty_printer *buffer, tree node, int spc)
pp_string (buffer, "unsigned");
else
pp_string (buffer, "int");
for (tree value = TYPE_VALUES (node); value; value = TREE_CHAIN (value))
{
tree int_val = TREE_VALUE (value);
if (TREE_CODE (int_val) != INTEGER_CST)
int_val = DECL_INITIAL (int_val);
pp_semicolon (buffer);
newline_and_indent (buffer, spc);
pp_ada_tree_identifier (buffer, TREE_PURPOSE (value), node, false);
pp_string (buffer, " : constant ");
if (TYPE_UNSIGNED (node))
pp_string (buffer, "unsigned");
if (TYPE_NAME (node))
dump_ada_node (buffer, node, NULL_TREE, spc, false, true);
else if (type)
dump_ada_node (buffer, type, NULL_TREE, spc, false, true);
else
pp_string (buffer, "int");
dump_anonymous_type_name (buffer, node, parent);
pp_string (buffer, " := ");
dump_ada_node (buffer,
TREE_CODE (TREE_VALUE (value)) == INTEGER_CST
? TREE_VALUE (value)
: DECL_INITIAL (TREE_VALUE (value)),
node, spc, false, true);
dump_ada_node (buffer, int_val, node, spc, false, true);
}
}
}
@ -2098,7 +2101,7 @@ dump_ada_node (pretty_printer *buffer, tree node, tree type, int spc,
if (name_only)
dump_ada_node (buffer, TYPE_NAME (node), node, spc, false, true);
else
dump_ada_enum_type (buffer, node, spc);
dump_ada_enum_type (buffer, node, type, NULL_TREE, spc);
break;
case REAL_TYPE:
@ -2577,7 +2580,7 @@ dump_nested_type (pretty_printer *buffer, tree field, tree t, tree parent,
else
dump_anonymous_type_name (buffer, field_type, parent);
pp_string (buffer, " is ");
dump_ada_enum_type (buffer, field_type, spc);
dump_ada_enum_type (buffer, field_type, NULL_TREE, parent, spc);
pp_semicolon (buffer);
newline_and_indent (buffer, spc);
break;