diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-08-05 09:33:52 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-05 09:33:52 +0000 |
commit | e77bc10ba13af4e193bbda5f43006d11d9bccb45 (patch) | |
tree | 16f963fce89d43f130ac9a104ff23fd60f90db0d /gcc/rust/backend/rust-compile-intrinsic.cc | |
parent | bc65cac0e79c9799fa62635df295e73b14501660 (diff) | |
parent | 7022b9dd107e534896d8383f6bc4ce70b4726cc9 (diff) | |
download | gcc-e77bc10ba13af4e193bbda5f43006d11d9bccb45.zip gcc-e77bc10ba13af4e193bbda5f43006d11d9bccb45.tar.gz gcc-e77bc10ba13af4e193bbda5f43006d11d9bccb45.tar.bz2 |
Merge #1433
1433: Fix bad transmute for aggregate types r=philberty a=philberty
This changes the CONVERT_EXPR to use the same ```*(foo*)&bar``` style cast from
the c front-end to handle the case of:
```
int a[1];
int b = (int)a;
```
Which is converted into:
```
int b = *(int*)&a;
```
which the constant folders can turn directly into int b = a[0];
Fixes #1432
Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc/rust/backend/rust-compile-intrinsic.cc')
-rw-r--r-- | gcc/rust/backend/rust-compile-intrinsic.cc | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/gcc/rust/backend/rust-compile-intrinsic.cc b/gcc/rust/backend/rust-compile-intrinsic.cc index 65eddfa..88d7923 100644 --- a/gcc/rust/backend/rust-compile-intrinsic.cc +++ b/gcc/rust/backend/rust-compile-intrinsic.cc @@ -545,8 +545,22 @@ transmute_intrinsic_handler (Context *ctx, TyTy::BaseType *fntype_tyty) tree result_expr = error_mark_node; if (AGGREGATE_TYPE_P (TREE_TYPE (convert_me_expr))) { - result_expr = fold_build1_loc (Location ().gcc_location (), CONVERT_EXPR, - result_type_tree, convert_me_expr); + // Return *(orig_type*)&decl. */ + // tree t = build_fold_addr_expr_loc (location.gcc_location (), this->t_); + // t = fold_build1_loc (location.gcc_location (), NOP_EXPR, + // build_pointer_type (this->orig_type_), t); + // return build_fold_indirect_ref_loc (location.gcc_location (), t); + + // result_expr = fold_build1_loc (Location ().gcc_location (), + // CONVERT_EXPR, + // result_type_tree, convert_me_expr); + + tree t = build_fold_addr_expr_loc (Location ().gcc_location (), + convert_me_expr); + t = fold_build1_loc (Location ().gcc_location (), NOP_EXPR, + build_pointer_type (target_type_expr), t); + result_expr + = build_fold_indirect_ref_loc (Location ().gcc_location (), t); } else { |