diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-05-05 15:59:54 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-05 15:59:54 +0000 |
commit | c936fd32559244c7c71137a743a22cb8af9edac8 (patch) | |
tree | ddb5eb411683a12aa9996566605566f4a5c6b3a6 /gcc/rust/backend | |
parent | af031b081fcd26f9fcb3e4a561f5a3d98158e163 (diff) | |
parent | f5bceb679420b999aa63c1b34dd0e0075cf9c5fd (diff) | |
download | gcc-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.cc | 8 |
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); |