]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Make coercion sites autoderef cycle optional
authorPhilip Herron <herron.philip@googlemail.com>
Mon, 27 Feb 2023 14:16:29 +0000 (14:16 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:19:00 +0000 (18:19 +0100)
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

gcc/rust/typecheck/rust-casts.cc
gcc/rust/typecheck/rust-coercion.cc
gcc/rust/typecheck/rust-coercion.h
gcc/rust/typecheck/rust-type-util.cc

index df6bac37f2d821fc232427c6233078725a8ead61..269d344e7db07b511c9d26f31a2f3ca10e503681 100644 (file)
@@ -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;
 
index 24f60d84080a54d3d38591c6331506819baa4f32..e35765fbd322d225a2a8918116a1416e5537ac9f 100644 (file)
@@ -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)
 {}
index 833f18e133237db511c1ed835a6e3fff876e29d0..2cb1d82e01b78952246dbf81881e2af0a7d9f0ec 100644 (file)
@@ -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;
 
index 4d6b026c36537b4a69e34323d25d81649e3f1485..419dfe7246d6cde19381325254b4ece43552ecf7 100644 (file)
@@ -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;