Skip to content

Commit fa30123

Browse files
committed
Change coerce_unsize error handling
Error kind were split between error state and out bool parameter. gcc/rust/ChangeLog: * typecheck/rust-coercion.cc (TypeCoercionRules::do_coercion): Adapt call to new return type. (TypeCoercionRules::coerce_unsized): Change error handling. * typecheck/rust-coercion.h: Update function prototype and add new CoerceUnsizedError error type. Signed-off-by: Pierre-Emmanuel Patry <[email protected]>
1 parent 0c8add3 commit fa30123

File tree

2 files changed

+23
-20
lines changed

2 files changed

+23
-20
lines changed

gcc/rust/typecheck/rust-coercion.cc

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,14 @@ TypeCoercionRules::do_coercion (TyTy::BaseType *receiver)
103103
}
104104

105105
// unsize
106-
bool unsafe_error = false;
107-
CoercionResult unsize_coercion
108-
= coerce_unsized (receiver, expected, unsafe_error);
109-
bool valid_unsize_coercion = !unsize_coercion.is_error ();
110-
if (valid_unsize_coercion)
106+
tl::expected<CoercionResult, CoerceUnsizedError> unsize_coercion
107+
= coerce_unsized (receiver, expected);
108+
if (unsize_coercion)
111109
{
112-
try_result = unsize_coercion;
110+
try_result = unsize_coercion.value ();
113111
return true;
114112
}
115-
else if (unsafe_error)
113+
else if (unsize_coercion.error () == CoerceUnsizedError::Unsafe)
116114
{
117115
// location_t lhs = mappings.lookup_location (receiver->get_ref ());
118116
// location_t rhs = mappings.lookup_location (expected->get_ref ());
@@ -316,9 +314,10 @@ TypeCoercionRules::coerce_borrowed_pointer (TyTy::BaseType *receiver,
316314
// &[T; n] or &mut [T; n] -> &[T]
317315
// or &mut [T; n] -> &mut [T]
318316
// or &Concrete -> &Trait, etc.
319-
TypeCoercionRules::CoercionResult
317+
tl::expected<TypeCoercionRules::CoercionResult,
318+
TypeCoercionRules::CoerceUnsizedError>
320319
TypeCoercionRules::coerce_unsized (TyTy::BaseType *source,
321-
TyTy::BaseType *target, bool &unsafe_error)
320+
TyTy::BaseType *target)
322321
{
323322
rust_debug ("coerce_unsized(source={%s}, target={%s})",
324323
source->debug_str ().c_str (), target->debug_str ().c_str ());
@@ -342,11 +341,11 @@ TypeCoercionRules::coerce_unsized (TyTy::BaseType *source,
342341
Mutability to_mutbl = target_ref->mutability ();
343342
if (!coerceable_mutability (from_mutbl, to_mutbl))
344343
{
345-
unsafe_error = true;
346344
location_t lhs = mappings.lookup_location (source->get_ref ());
347345
location_t rhs = mappings.lookup_location (target->get_ref ());
348346
mismatched_mutability_error (locus, lhs, rhs);
349-
return TypeCoercionRules::CoercionResult::get_error ();
347+
return tl::unexpected<CoerceUnsizedError> (
348+
CoerceUnsizedError::Unsafe);
350349
}
351350

352351
ty_a = source_ref->get_base ();
@@ -367,11 +366,11 @@ TypeCoercionRules::coerce_unsized (TyTy::BaseType *source,
367366
Mutability to_mutbl = target_ref->mutability ();
368367
if (!coerceable_mutability (from_mutbl, to_mutbl))
369368
{
370-
unsafe_error = true;
371369
location_t lhs = mappings.lookup_location (source->get_ref ());
372370
location_t rhs = mappings.lookup_location (target->get_ref ());
373371
mismatched_mutability_error (locus, lhs, rhs);
374-
return TypeCoercionRules::CoercionResult::get_error ();
372+
return tl::unexpected<CoerceUnsizedError> (
373+
CoerceUnsizedError::Unsafe);
375374
}
376375

377376
ty_a = source_ref->get_base ();
@@ -399,10 +398,7 @@ TypeCoercionRules::coerce_unsized (TyTy::BaseType *source,
399398
{
400399
bool bounds_compatible = b->bounds_compatible (*a, locus, false);
401400
if (!bounds_compatible)
402-
{
403-
unsafe_error = true;
404-
return TypeCoercionRules::CoercionResult::get_error ();
405-
}
401+
return tl::unexpected<CoerceUnsizedError> (CoerceUnsizedError::Unsafe);
406402

407403
// return the unsize coercion
408404
TyTy::BaseType *result = b->clone ();
@@ -430,7 +426,7 @@ TypeCoercionRules::coerce_unsized (TyTy::BaseType *source,
430426
}
431427

432428
adjustments.clear ();
433-
return TypeCoercionRules::CoercionResult::get_error ();
429+
return tl::unexpected<CoerceUnsizedError> (CoerceUnsizedError::Regular);
434430
}
435431

436432
bool

gcc/rust/typecheck/rust-coercion.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,20 @@
2121

2222
#include "rust-autoderef.h"
2323
#include "rust-hir-type-check.h"
24+
#include "expected.h"
2425

2526
namespace Rust {
2627
namespace Resolver {
2728

2829
class TypeCoercionRules : protected AutoderefCycle
2930
{
3031
public:
32+
enum class CoerceUnsizedError
33+
{
34+
Regular,
35+
Unsafe
36+
};
37+
3138
struct CoercionResult
3239
{
3340
std::vector<Adjustment> adjustments;
@@ -59,8 +66,8 @@ class TypeCoercionRules : protected AutoderefCycle
5966
TyTy::ReferenceType *expected,
6067
Mutability mutability);
6168

62-
CoercionResult coerce_unsized (TyTy::BaseType *receiver,
63-
TyTy::BaseType *expected, bool &unsafe_error);
69+
tl::expected<CoercionResult, CoerceUnsizedError>
70+
coerce_unsized (TyTy::BaseType *receiver, TyTy::BaseType *expected);
6471

6572
static bool coerceable_mutability (Mutability from_mutbl,
6673
Mutability to_mutbl);

0 commit comments

Comments
 (0)