mirror of git://gcc.gnu.org/git/gcc.git
* gcc-interface/trans.c (Case_Statement_to_gnu): Revert latest change.
From-SVN: r209415
This commit is contained in:
parent
4b3f982994
commit
f51b85728a
|
|
@ -12,8 +12,6 @@
|
||||||
(lvalue_required_p) <N_Object_Renaming_Declaration>: Always return 1.
|
(lvalue_required_p) <N_Object_Renaming_Declaration>: Always return 1.
|
||||||
(Identifier_to_gnu): Reference the renamed object of constant renaming
|
(Identifier_to_gnu): Reference the renamed object of constant renaming
|
||||||
pointers directly.
|
pointers directly.
|
||||||
(Case_Statement_to_gnu): Do not re-fold the bounds of integer types.
|
|
||||||
Assert that the case values are constant.
|
|
||||||
* gcc-interface/utils.c (invalidate_global_renaming_pointers): Do not
|
* gcc-interface/utils.c (invalidate_global_renaming_pointers): Do not
|
||||||
invalidate constant renaming pointers.
|
invalidate constant renaming pointers.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2400,11 +2400,9 @@ Case_Statement_to_gnu (Node_Id gnat_node)
|
||||||
/* First compile all the different case choices for the current WHEN
|
/* First compile all the different case choices for the current WHEN
|
||||||
alternative. */
|
alternative. */
|
||||||
for (gnat_choice = First (Discrete_Choices (gnat_when));
|
for (gnat_choice = First (Discrete_Choices (gnat_when));
|
||||||
Present (gnat_choice);
|
Present (gnat_choice); gnat_choice = Next (gnat_choice))
|
||||||
gnat_choice = Next (gnat_choice))
|
|
||||||
{
|
{
|
||||||
tree gnu_low = NULL_TREE, gnu_high = NULL_TREE;
|
tree gnu_low = NULL_TREE, gnu_high = NULL_TREE;
|
||||||
tree label = create_artificial_label (input_location);
|
|
||||||
|
|
||||||
switch (Nkind (gnat_choice))
|
switch (Nkind (gnat_choice))
|
||||||
{
|
{
|
||||||
|
|
@ -2428,8 +2426,8 @@ Case_Statement_to_gnu (Node_Id gnat_node)
|
||||||
{
|
{
|
||||||
tree gnu_type = get_unpadded_type (Entity (gnat_choice));
|
tree gnu_type = get_unpadded_type (Entity (gnat_choice));
|
||||||
|
|
||||||
gnu_low = TYPE_MIN_VALUE (gnu_type);
|
gnu_low = fold (TYPE_MIN_VALUE (gnu_type));
|
||||||
gnu_high = TYPE_MAX_VALUE (gnu_type);
|
gnu_high = fold (TYPE_MAX_VALUE (gnu_type));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2447,13 +2445,20 @@ Case_Statement_to_gnu (Node_Id gnat_node)
|
||||||
gcc_unreachable ();
|
gcc_unreachable ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Everything should be folded into constants at this point. */
|
/* If the case value is a subtype that raises Constraint_Error at
|
||||||
gcc_assert (!gnu_low || TREE_CODE (gnu_low) == INTEGER_CST);
|
run time because of a wrong bound, then gnu_low or gnu_high is
|
||||||
gcc_assert (!gnu_high || TREE_CODE (gnu_high) == INTEGER_CST);
|
not translated into an INTEGER_CST. In such a case, we need
|
||||||
|
to ensure that the when statement is not added in the tree,
|
||||||
add_stmt_with_node (build_case_label (gnu_low, gnu_high, label),
|
otherwise it will crash the gimplifier. */
|
||||||
gnat_choice);
|
if ((!gnu_low || TREE_CODE (gnu_low) == INTEGER_CST)
|
||||||
choices_added_p = true;
|
&& (!gnu_high || TREE_CODE (gnu_high) == INTEGER_CST))
|
||||||
|
{
|
||||||
|
add_stmt_with_node (build_case_label
|
||||||
|
(gnu_low, gnu_high,
|
||||||
|
create_artificial_label (input_location)),
|
||||||
|
gnat_choice);
|
||||||
|
choices_added_p = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This construct doesn't define a scope so we shouldn't push a binding
|
/* This construct doesn't define a scope so we shouldn't push a binding
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue