aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2023-03-03 18:42:21 +0000
committerPhilip Herron <philip.herron@embecosm.com>2023-03-03 19:21:12 +0000
commit6540653bc29778a5473746bc7463c75204e07c23 (patch)
tree63639196f347a39ddbdd6b0d03dd1e6efa2b7211 /gcc
parenta4c851df0358389970ffe3ce1ad495954729fc5f (diff)
downloadgcc-6540653bc29778a5473746bc7463c75204e07c23.zip
gcc-6540653bc29778a5473746bc7463c75204e07c23.tar.gz
gcc-6540653bc29778a5473746bc7463c75204e07c23.tar.bz2
gccrs: Take advantage of our new unify_and to inject inference
Wen computing higher ranked trait bounds where there are multiple type params and ones which are not bound entirely on the impl-type we need to inject inference variables as required to compute the types. The inference variables we inject are missing the callbacks that we can compute the bounds properly so this is the first part of the fix. Addresses #1893 Signed-off-by: Philip Herron <herron.philip@googlemail.com> gcc/rust/ChangeLog: * typecheck/rust-hir-trait-resolve.cc: use unify_and infer
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-hir-trait-resolve.cc16
1 files changed, 10 insertions, 6 deletions
diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
index 5a4d966..632a60a 100644
--- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc
+++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc
@@ -497,10 +497,12 @@ AssociatedImplTrait::setup_associated_types (
// the type correctly as our receiver may be generic and we are inferring its
// generic arguments and this Self might be the concrete version or vice
// versa.
- auto result = unify_site (get_impl_block ()->get_mappings ().get_hirid (),
- TyTy::TyWithLocation (receiver),
- TyTy::TyWithLocation (impl_self_infer),
- impl_predicate.get_locus ());
+ auto result = unify_site_and (get_impl_block ()->get_mappings ().get_hirid (),
+ TyTy::TyWithLocation (receiver),
+ TyTy::TyWithLocation (impl_self_infer),
+ impl_predicate.get_locus (),
+ true /*emit-errors*/, true /*commit-if-ok*/,
+ true /*infer*/, true /*cleanup-on-fail*/);
rust_assert (result->get_kind () != TyTy::TypeKind::ERROR);
TyTy::BaseType *self_result = result;
@@ -525,8 +527,10 @@ AssociatedImplTrait::setup_associated_types (
TyTy::BaseType *b = hrtb_bound_arguments.at (i);
result
- = unify_site (a->get_ref (), TyTy::TyWithLocation (a),
- TyTy::TyWithLocation (b), impl_predicate.get_locus ());
+ = unify_site_and (a->get_ref (), TyTy::TyWithLocation (a),
+ TyTy::TyWithLocation (b), impl_predicate.get_locus (),
+ true /*emit-errors*/, true /*commit-if-ok*/,
+ true /*infer*/, true /*cleanup-on-fail*/);
rust_assert (result->get_kind () != TyTy::TypeKind::ERROR);
}