diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-04-20 11:12:29 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-04-27 22:18:22 +0000 |
commit | ca1f50ba61be3fe9774cbd0783c8ab6f6b51e5b2 (patch) | |
tree | 71ad2888066aa0d0a96ae8a7b8a570034b3f59ff | |
parent | 5dfcde3b497c0eedb697ab8eb10a4b366e43ec1d (diff) | |
download | gcc-ca1f50ba61be3fe9774cbd0783c8ab6f6b51e5b2.tar.gz |
gccrs: resolve the associated_predicate when mapping Fn traits
This is required to solve #2105
gcc/rust/ChangeLog:
* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::resolve_fn_trait_call):
return the assoicated predicate
* typecheck/rust-hir-type-check-expr.h: update prototype
Signed-off-by: Philip Herron <herron.philip@googlemail.com>
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-expr.cc | 14 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-expr.h | 4 |
2 files changed, 12 insertions, 6 deletions
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc index 704ca2b9e5b..8d2e89ba0d7 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc @@ -1784,7 +1784,7 @@ TypeCheckExpr::resolve_operator_overload ( HIR::PathIdentSegment TypeCheckExpr::resolve_possible_fn_trait_call_method_name ( - const TyTy::BaseType &receiver) + TyTy::BaseType &receiver, TyTy::TypeBoundPredicate *associated_predicate) { // Question // do we need to probe possible bounds here? I think not, i think when we @@ -1793,7 +1793,7 @@ TypeCheckExpr::resolve_possible_fn_trait_call_method_name ( // FIXME // the logic to map the FnTrait to their respective call trait-item is // duplicated over in the backend/rust-compile-expr.cc - for (const auto &bound : receiver.get_specified_bounds ()) + for (auto &bound : receiver.get_specified_bounds ()) { bool found_fn = bound.get_name ().compare ("Fn") == 0; bool found_fn_mut = bound.get_name ().compare ("FnMut") == 0; @@ -1801,19 +1801,23 @@ TypeCheckExpr::resolve_possible_fn_trait_call_method_name ( if (found_fn) { + *associated_predicate = bound; return HIR::PathIdentSegment ("call"); } else if (found_fn_mut) { + *associated_predicate = bound; return HIR::PathIdentSegment ("call_mut"); } else if (found_fn_once) { + *associated_predicate = bound; return HIR::PathIdentSegment ("call_once"); } } // nothing + *associated_predicate = TyTy::TypeBoundPredicate::error (); return HIR::PathIdentSegment (""); } @@ -1823,9 +1827,11 @@ TypeCheckExpr::resolve_fn_trait_call (HIR::CallExpr &expr, TyTy::BaseType **result) { // we turn this into a method call expr + auto associated_predicate = TyTy::TypeBoundPredicate::error (); HIR::PathIdentSegment method_name - = resolve_possible_fn_trait_call_method_name (*receiver_tyty); - if (method_name.is_error ()) + = resolve_possible_fn_trait_call_method_name (*receiver_tyty, + &associated_predicate); + if (method_name.is_error () || associated_predicate.is_error ()) return false; auto candidates = MethodResolver::Probe (receiver_tyty, method_name); diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h index 5be9bcdb3f1..1a9591f1d49 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-expr.h +++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h @@ -97,8 +97,8 @@ protected: TyTy::BaseType *function_tyty, TyTy::BaseType **result); - HIR::PathIdentSegment - resolve_possible_fn_trait_call_method_name (const TyTy::BaseType &receiver); + HIR::PathIdentSegment resolve_possible_fn_trait_call_method_name ( + TyTy::BaseType &receiver, TyTy::TypeBoundPredicate *associated_predicate); private: TypeCheckExpr (); |