[gcc r14-7304] gccrs: Make coercion sites autoderef cycle optional

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 17:20:59 GMT 2024


https://gcc.gnu.org/g:e67500111dbaf97b954a9733f3221ffa5413eb6e

commit r14-7304-ge67500111dbaf97b954a9733f3221ffa5413eb6e
Author: Philip Herron <herron.philip@googlemail.com>
Date:   Mon Feb 27 14:16:29 2023 +0000

    gccrs: Make coercion sites autoderef cycle optional
    
    Signed-off-by: Philip Herron <herron.philip@googlemail.com>
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-casts.cc (TypeCastRules::check): update to new interface
            * typecheck/rust-coercion.cc (TypeCoercionRules::Coerce): likewise
            (TypeCoercionRules::TryCoerce): likewise
            (TypeCoercionRules::TypeCoercionRules): likewise
            * typecheck/rust-coercion.h: likewise
            * typecheck/rust-type-util.cc (coercion_site): likewise

Diff:
---
 gcc/rust/typecheck/rust-casts.cc     |  3 ++-
 gcc/rust/typecheck/rust-coercion.cc  | 13 +++++++------
 gcc/rust/typecheck/rust-coercion.h   | 10 ++++++----
 gcc/rust/typecheck/rust-type-util.cc |  3 ++-
 4 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/gcc/rust/typecheck/rust-casts.cc b/gcc/rust/typecheck/rust-casts.cc
index df6bac37f2d..269d344e7db 100644
--- a/gcc/rust/typecheck/rust-casts.cc
+++ b/gcc/rust/typecheck/rust-casts.cc
@@ -39,7 +39,8 @@ TypeCastRules::check ()
 {
   // https://github.com/rust-lang/rust/blob/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/compiler/rustc_typeck/src/check/cast.rs#L565-L582
   auto possible_coercion
-    = TypeCoercionRules::TryCoerce (from.get_ty (), to.get_ty (), locus);
+    = TypeCoercionRules::TryCoerce (from.get_ty (), to.get_ty (), locus,
+				    true /*allow-autoderef*/);
   if (!possible_coercion.is_error ())
     return possible_coercion;
 
diff --git a/gcc/rust/typecheck/rust-coercion.cc b/gcc/rust/typecheck/rust-coercion.cc
index 24f60d84080..e35765fbd32 100644
--- a/gcc/rust/typecheck/rust-coercion.cc
+++ b/gcc/rust/typecheck/rust-coercion.cc
@@ -25,25 +25,26 @@ namespace Resolver {
 
 TypeCoercionRules::CoercionResult
 TypeCoercionRules::Coerce (TyTy::BaseType *receiver, TyTy::BaseType *expected,
-			   Location locus)
+			   Location locus, bool allow_autoderef)
 {
-  TypeCoercionRules resolver (expected, locus, true);
+  TypeCoercionRules resolver (expected, locus, true, allow_autoderef);
   bool ok = resolver.do_coercion (receiver);
   return ok ? resolver.try_result : CoercionResult::get_error ();
 }
 
 TypeCoercionRules::CoercionResult
 TypeCoercionRules::TryCoerce (TyTy::BaseType *receiver,
-			      TyTy::BaseType *expected, Location locus)
+			      TyTy::BaseType *expected, Location locus,
+			      bool allow_autoderef)
 {
-  TypeCoercionRules resolver (expected, locus, false);
+  TypeCoercionRules resolver (expected, locus, false, allow_autoderef);
   bool ok = resolver.do_coercion (receiver);
   return ok ? resolver.try_result : CoercionResult::get_error ();
 }
 
 TypeCoercionRules::TypeCoercionRules (TyTy::BaseType *expected, Location locus,
-				      bool emit_errors)
-  : AutoderefCycle (false), mappings (Analysis::Mappings::get ()),
+				      bool emit_errors, bool allow_autoderef)
+  : AutoderefCycle (!allow_autoderef), mappings (Analysis::Mappings::get ()),
     context (TypeCheckContext::get ()), expected (expected), locus (locus),
     try_result (CoercionResult::get_error ()), emit_errors (emit_errors)
 {}
diff --git a/gcc/rust/typecheck/rust-coercion.h b/gcc/rust/typecheck/rust-coercion.h
index 833f18e1332..2cb1d82e01b 100644
--- a/gcc/rust/typecheck/rust-coercion.h
+++ b/gcc/rust/typecheck/rust-coercion.h
@@ -42,10 +42,12 @@ public:
   };
 
   static CoercionResult Coerce (TyTy::BaseType *receiver,
-				TyTy::BaseType *expected, Location locus);
+				TyTy::BaseType *expected, Location locus,
+				bool allow_autoderef);
 
   static CoercionResult TryCoerce (TyTy::BaseType *receiver,
-				   TyTy::BaseType *expected, Location locus);
+				   TyTy::BaseType *expected, Location locus,
+				   bool allow_autoderef);
 
   CoercionResult coerce_unsafe_ptr (TyTy::BaseType *receiver,
 				    TyTy::PointerType *expected,
@@ -66,8 +68,8 @@ public:
   void object_unsafe_error (Location expr_locus, Location lhs, Location rhs);
 
 protected:
-  TypeCoercionRules (TyTy::BaseType *expected, Location locus,
-		     bool emit_errors);
+  TypeCoercionRules (TyTy::BaseType *expected, Location locus, bool emit_errors,
+		     bool allow_autoderef);
 
   bool select (const TyTy::BaseType &autoderefed) override;
 
diff --git a/gcc/rust/typecheck/rust-type-util.cc b/gcc/rust/typecheck/rust-type-util.cc
index 4d6b026c365..419dfe7246d 100644
--- a/gcc/rust/typecheck/rust-type-util.cc
+++ b/gcc/rust/typecheck/rust-type-util.cc
@@ -186,7 +186,8 @@ coercion_site (HirId id, TyTy::TyWithLocation lhs, TyTy::TyWithLocation rhs,
     return expr;
 
   // can we autoderef it?
-  auto result = TypeCoercionRules::Coerce (expr, expected, locus);
+  auto result = TypeCoercionRules::Coerce (expr, expected, locus,
+					   true /*allow-autodref*/);
 
   // the result needs to be unified
   TyTy::BaseType *receiver = expr;


More information about the Gcc-cvs mailing list