aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2023-02-27 14:16:29 +0000
committerPhilip Herron <philip.herron@embecosm.com>2023-02-28 20:38:35 +0000
commite164f32df23b309963bf17bf725cd8fcae58d2d5 (patch)
tree717ea25813706c59a8288591a713eb99b5f05323 /gcc
parentbd4556fb65c64396fc6a429bc03b58932dc3c263 (diff)
downloadgcc-e164f32df23b309963bf17bf725cd8fcae58d2d5.zip
gcc-e164f32df23b309963bf17bf725cd8fcae58d2d5.tar.gz
gcc-e164f32df23b309963bf17bf725cd8fcae58d2d5.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-casts.cc3
-rw-r--r--gcc/rust/typecheck/rust-coercion.cc13
-rw-r--r--gcc/rust/typecheck/rust-coercion.h10
-rw-r--r--gcc/rust/typecheck/rust-type-util.cc3
4 files changed, 17 insertions, 12 deletions
diff --git a/gcc/rust/typecheck/rust-casts.cc b/gcc/rust/typecheck/rust-casts.cc
index 987542e..0ecb50f 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 fdc8bdd..7a3f51a 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 d0fc0f9..69442e5 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 ff7c805..da9a724 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;