aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-05-04 13:48:03 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-05-05 11:43:40 +0100
commitf5bceb679420b999aa63c1b34dd0e0075cf9c5fd (patch)
treef6ad62677bccf0ee131b9a73db11d016149fce6e /gcc
parent285aabdd3b2d8ee7c158eee34241ba52a31b19d3 (diff)
downloadgcc-f5bceb679420b999aa63c1b34dd0e0075cf9c5fd.zip
gcc-f5bceb679420b999aa63c1b34dd0e0075cf9c5fd.tar.gz
gcc-f5bceb679420b999aa63c1b34dd0e0075cf9c5fd.tar.bz2
Fix size used in unsized adjustments
When we coerce from an array to a slice we take the full capacity of the array as the size to the FatPtr slice object but this was off by one. This The TYPE_MAX_VALUE is not the correct method of accessing this but instead it needs to take into account other values to get the correct HOST_WIDE_INT
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/backend/rust-compile-expr.cc8
1 files changed, 7 insertions, 1 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc
index 41f8c0a..1cf4e3d 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -1348,7 +1348,13 @@ HIRCompileBase::resolve_unsized_adjustment (Resolver::Adjustment &adjustment,
// fetch the size from the domain
tree domain = TYPE_DOMAIN (expr_type);
- tree size = TYPE_MAX_VALUE (domain);
+ unsigned HOST_WIDE_INT array_size
+ = wi::ext (wi::to_offset (TYPE_MAX_VALUE (domain))
+ - wi::to_offset (TYPE_MIN_VALUE (domain)) + 1,
+ TYPE_PRECISION (TREE_TYPE (domain)),
+ TYPE_SIGN (TREE_TYPE (domain)))
+ .to_uhwi ();
+ tree size = build_int_cst (size_type_node, array_size);
return ctx->get_backend ()->constructor_expression (fat_pointer, false,
{data, size}, -1, locus);