diff options
author | Philip Herron <herron.philip@googlemail.com> | 2023-04-20 11:12:29 +0100 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:34:15 +0100 |
commit | 255d22ea90eabb7d419bf15cfdeb5a7635fc20af (patch) | |
tree | 33108d62c4d466528ed4c46d5c39c7c1349f2f97 /gcc | |
parent | 6182a284960a850bc5520337f51799d015538c67 (diff) | |
download | gcc-255d22ea90eabb7d419bf15cfdeb5a7635fc20af.zip gcc-255d22ea90eabb7d419bf15cfdeb5a7635fc20af.tar.gz gcc-255d22ea90eabb7d419bf15cfdeb5a7635fc20af.tar.bz2 |
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>
Diffstat (limited to 'gcc')
-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 3dafcd2..2eec75d 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 2ff320d..031d20f 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 (); |