diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-06-30 22:08:10 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-06-30 22:02:15 +0000 |
commit | cfc51d46fcdb70bde84f030557c96866f3b18e23 (patch) | |
tree | f62306b5b14b97c3a7a419686d38f77695c3f244 | |
parent | 251348f3c8bc218360877a3bb9f16d9d5c7a685f (diff) | |
download | gcc-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.cc | 3 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-expr.cc | 3 |
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); |