aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2023-06-30 22:08:10 +0100
committerPhilip Herron <philip.herron@embecosm.com>2023-06-30 22:02:15 +0000
commitcfc51d46fcdb70bde84f030557c96866f3b18e23 (patch)
treef62306b5b14b97c3a7a419686d38f77695c3f244
parent251348f3c8bc218360877a3bb9f16d9d5c7a685f (diff)
downloadgcc-cfc51d46fcdb70bde84f030557c96866f3b18e23.zip
gcc-cfc51d46fcdb70bde84f030557c96866f3b18e23.tar.gz
gcc-cfc51d46fcdb70bde84f030557c96866f3b18e23.tar.bz2
gccrs: fix ICE with inserting autoderef mappings
We were using the call-expr id for the autoderef mappings but this doesn't work when the call expression itself is part of a coercion-site so this changes the code to use the call-expression function path expression for the id instead which will not be duplicated again. Addresses #2105 gcc/rust/ChangeLog: * backend/rust-compile-expr.cc (CompileExpr::generate_possible_fn_trait_call): use fnexpr * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::resolve_fn_trait_call): likewise Signed-off-by: Philip Herron <herron.philip@googlemail.com>
-rw-r--r--gcc/rust/backend/rust-compile-expr.cc3
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.cc3
2 files changed, 4 insertions, 2 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc
index fecd848..45edd47 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -2893,7 +2893,8 @@ CompileExpr::generate_possible_fn_trait_call (HIR::CallExpr &expr,
}
// need to apply any autoderef's to the self argument
- HirId autoderef_mappings_id = expr.get_mappings ().get_hirid ();
+ HIR::Expr *fnexpr = expr.get_fnexpr ();
+ HirId autoderef_mappings_id = fnexpr->get_mappings ().get_hirid ();
std::vector<Resolver::Adjustment> *adjustments = nullptr;
bool ok = ctx->get_tyctx ()->lookup_autoderef_mappings (autoderef_mappings_id,
&adjustments);
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
index d0b1ce6..04bda96 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
@@ -1910,7 +1910,8 @@ TypeCheckExpr::resolve_fn_trait_call (HIR::CallExpr &expr,
// store the adjustments for code-generation to know what to do which must be
// stored onto the receiver to so as we don't trigger duplicate deref mappings
// ICE when an argument is a method call
- HirId autoderef_mappings_id = expr.get_mappings ().get_hirid ();
+ HIR::Expr *fnexpr = expr.get_fnexpr ();
+ HirId autoderef_mappings_id = fnexpr->get_mappings ().get_hirid ();
context->insert_autoderef_mappings (autoderef_mappings_id,
std::move (candidate.adjustments));
context->insert_receiver (expr.get_mappings ().get_hirid (), receiver_tyty);