diff options
Diffstat (limited to 'gcc/ada/gcc-interface/utils2.c')
-rw-r--r-- | gcc/ada/gcc-interface/utils2.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index 44a05fb..c1bb74d 100644 --- a/gcc/ada/gcc-interface/utils2.c +++ b/gcc/ada/gcc-interface/utils2.c @@ -1383,8 +1383,11 @@ build_unary_op (enum tree_code op_code, tree result_type, tree operand) since the middle-end cannot handle it. But we don't it in the general case because it may introduce aliasing issues if the first operand is an indirect assignment and the second operand - the corresponding address, e.g. for an allocator. */ - if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE) + the corresponding address, e.g. for an allocator. However do + it for a return value to expose it for later recognition. */ + if (TREE_CODE (type) == UNCONSTRAINED_ARRAY_TYPE + || (TREE_CODE (TREE_OPERAND (operand, 1)) == VAR_DECL + && DECL_RETURN_VALUE_P (TREE_OPERAND (operand, 1)))) { result = build_unary_op (ADDR_EXPR, result_type, TREE_OPERAND (operand, 1)); |