aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/backend/rust-compile-base.cc
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-05-02 21:26:10 +0000
committerGitHub <noreply@github.com>2022-05-02 21:26:10 +0000
commitca722fe423bdd8c7895a40aac0410b2646917805 (patch)
tree52ca965213514c45d7143acff72d9d21f090b4e6 /gcc/rust/backend/rust-compile-base.cc
parent5aec7cbfa560440801dfd0b26e408ab6fb692ed6 (diff)
parent7e576d70b6a1065bf31c37380a8e39354d961cd6 (diff)
downloadgcc-ca722fe423bdd8c7895a40aac0410b2646917805.zip
gcc-ca722fe423bdd8c7895a40aac0410b2646917805.tar.gz
gcc-ca722fe423bdd8c7895a40aac0410b2646917805.tar.bz2
Merge #1197
1197: Support recursive coercion sites r=philberty a=philberty There are two changes are part of this PR one where we update the address_expression helper to take a ptrtype tree. Since the default build_address_expr_loc was automatically building a pointer type of the TREE_TYPE of the operand which is not correct since we sometimes want REFERENCE_TYPES instead of POINTER_TYPES. The 2nd commit enhances the coercion_site code to recursively walk the tree and their types to handle coercions to dyn traits or do array bounds checking etc. This gets rid of the get_root hack used and cleans up the code in general. Fixes #1146 Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc/rust/backend/rust-compile-base.cc')
-rw-r--r--gcc/rust/backend/rust-compile-base.cc5
1 files changed, 3 insertions, 2 deletions
diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc
index 49f31fc..6773ac6 100644
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -317,7 +317,7 @@ HIRCompileBase::mark_addressable (tree exp, Location locus)
}
tree
-HIRCompileBase::address_expression (tree expr, Location location)
+HIRCompileBase::address_expression (tree expr, tree ptrtype, Location location)
{
if (expr == error_mark_node)
return error_mark_node;
@@ -325,7 +325,8 @@ HIRCompileBase::address_expression (tree expr, Location location)
if (!mark_addressable (expr, location))
return error_mark_node;
- return build_fold_addr_expr_loc (location.gcc_location (), expr);
+ return build_fold_addr_expr_with_type_loc (location.gcc_location (), expr,
+ ptrtype);
}
std::vector<Bvariable *>