Commit 03b4b15e by Eric Botcazou Committed by Pierre-Marie de Rodat

[Ada] ICE on renaming of result of binary operation

2018-07-17  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

	* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Variable>: Deal with
	more rvalues in the expression of a renaming.

From-SVN: r262793
parent 69720717
2018-07-17 Eric Botcazou <ebotcazou@adacore.com> 2018-07-17 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Variable>: Deal with
more rvalues in the expression of a renaming.
2018-07-17 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/ada-tree.h (TYPE_RETURN_BY_DIRECT_REF_P): Define for * gcc-interface/ada-tree.h (TYPE_RETURN_BY_DIRECT_REF_P): Define for
METHOD_TYPE too. METHOD_TYPE too.
(TYPE_RETURN_UNCONSTRAINED_P): Likewise. (TYPE_RETURN_UNCONSTRAINED_P): Likewise.
......
...@@ -969,8 +969,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) ...@@ -969,8 +969,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
function call is a constant object. Therefore, it can be the function call is a constant object. Therefore, it can be the
inner object of a constant renaming and the renaming must be inner object of a constant renaming and the renaming must be
fully instantiated, i.e. it cannot be a reference to (part of) fully instantiated, i.e. it cannot be a reference to (part of)
an existing object. And treat other rvalues (addresses, null an existing object. And treat other rvalues the same way. */
expressions, constructors and literals) the same way. */
tree inner = gnu_expr; tree inner = gnu_expr;
while (handled_component_p (inner) || CONVERT_EXPR_P (inner)) while (handled_component_p (inner) || CONVERT_EXPR_P (inner))
inner = TREE_OPERAND (inner, 0); inner = TREE_OPERAND (inner, 0);
...@@ -981,11 +980,11 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) ...@@ -981,11 +980,11 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
inner = TREE_OPERAND (inner, 1); inner = TREE_OPERAND (inner, 1);
if ((TREE_CODE (inner) == CALL_EXPR if ((TREE_CODE (inner) == CALL_EXPR
&& !call_is_atomic_load (inner)) && !call_is_atomic_load (inner))
|| TREE_CODE (inner) == ADDR_EXPR
|| TREE_CODE (inner) == NULL_EXPR
|| TREE_CODE (inner) == PLUS_EXPR
|| TREE_CODE (inner) == CONSTRUCTOR || TREE_CODE (inner) == CONSTRUCTOR
|| CONSTANT_CLASS_P (inner) || CONSTANT_CLASS_P (inner)
|| COMPARISON_CLASS_P (inner)
|| BINARY_CLASS_P (inner)
|| EXPRESSION_CLASS_P (inner)
/* We need to detect the case where a temporary is created to /* We need to detect the case where a temporary is created to
hold the return value, since we cannot safely rename it at hold the return value, since we cannot safely rename it at
top level as it lives only in the elaboration routine. */ top level as it lives only in the elaboration routine. */
...@@ -1007,7 +1006,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition) ...@@ -1007,7 +1006,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
underlying object lives only in the elaboration routine. */ underlying object lives only in the elaboration routine. */
|| (TREE_CODE (inner) == INDIRECT_REF || (TREE_CODE (inner) == INDIRECT_REF
&& (inner && (inner
= remove_conversions (TREE_OPERAND (inner, 0), true)) = remove_conversions (TREE_OPERAND (inner, 0), true))
&& TREE_CODE (inner) == VAR_DECL && TREE_CODE (inner) == VAR_DECL
&& DECL_RETURN_VALUE_P (inner))) && DECL_RETURN_VALUE_P (inner)))
; ;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment