]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: resolve the associated_predicate when mapping Fn traits
authorPhilip Herron <herron.philip@googlemail.com>
Thu, 20 Apr 2023 10:12:29 +0000 (11:12 +0100)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:34:15 +0000 (18:34 +0100)
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>
gcc/rust/typecheck/rust-hir-type-check-expr.cc
gcc/rust/typecheck/rust-hir-type-check-expr.h

index 3dafcd219c239d1dd63cf89f89197df8be135564..2eec75db3ca8e328a7c0b3a20dea20a4dcaa9171 100644 (file)
@@ -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);
index 2ff320d6b7bb88a6f17cf1e69995d4bf32e1f854..031d20fe9e0afa9ccafa2bb0c77748837e6bc6b2 100644 (file)
@@ -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 ();