From b235734c763af862a2606225d7aefd9990847edd Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 22 Sep 2007 13:04:20 +0000 Subject: [PATCH] utils2.c (build_unary_op): Propagate the TYPE_REF_CAN_ALIAS_ALL flag to the result. * utils2.c (build_unary_op) [INDIRECT_REF]: Propagate the TYPE_REF_CAN_ALIAS_ALL flag to the result. From-SVN: r128669 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/utils2.c | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index bd2560cfcac..7913e4a37be 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2007-09-22 Eric Botcazou + + * utils2.c (build_unary_op) [INDIRECT_REF]: Propagate + the TYPE_REF_CAN_ALIAS_ALL flag to the result. + 2007-09-21 Olivier Hainque * utils.c (type_for_nonaliased_component_p): Return false for diff --git a/gcc/ada/utils2.c b/gcc/ada/utils2.c index a89545920a6..350358f719b 100644 --- a/gcc/ada/utils2.c +++ b/gcc/ada/utils2.c @@ -1078,6 +1078,25 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand) GCC wants pointer types for function addresses. */ if (!result_type) result_type = build_pointer_type (type); + + /* If the underlying object can alias everything, propagate the + property since we are effectively retrieving the object. */ + if (POINTER_TYPE_P (TREE_TYPE (result)) + && TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (result))) + { + if (TREE_CODE (result_type) == POINTER_TYPE + && !TYPE_REF_CAN_ALIAS_ALL (result_type)) + result_type + = build_pointer_type_for_mode (TREE_TYPE (result_type), + TYPE_MODE (result_type), + true); + else if (TREE_CODE (result_type) == REFERENCE_TYPE + && !TYPE_REF_CAN_ALIAS_ALL (result_type)) + result_type + = build_reference_type_for_mode (TREE_TYPE (result_type), + TYPE_MODE (result_type), + true); + } break; case NULL_EXPR: -- 2.30.2