aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-05-05 15:59:54 +0000
committerGitHub <noreply@github.com>2022-05-05 15:59:54 +0000
commitc936fd32559244c7c71137a743a22cb8af9edac8 (patch)
treeddb5eb411683a12aa9996566605566f4a5c6b3a6 /gcc/rust/backend
parentaf031b081fcd26f9fcb3e4a561f5a3d98158e163 (diff)
parentf5bceb679420b999aa63c1b34dd0e0075cf9c5fd (diff)
downloadgcc-c936fd32559244c7c71137a743a22cb8af9edac8.zip
gcc-c936fd32559244c7c71137a743a22cb8af9edac8.tar.gz
gcc-c936fd32559244c7c71137a743a22cb8af9edac8.tar.bz2
Merge #1217
1217: Fix size used in unsized adjustments r=philberty a=philberty 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 Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc/rust/backend')
-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);