diff options
| author | Michael Goulet <michael@errs.io> | 2024-05-17 11:14:36 -0400 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2024-05-17 12:51:21 -0400 |
| commit | fa829feb2f7a3fee5890f3acf57b66029b123d18 (patch) | |
| tree | dbceb6f0bd3f0579eeef2ee3c8d14cd0efd770ff /compiler/rustc_trait_selection/src/traits | |
| parent | ddba1dc97e83f22165b36dd6158477c49bbbd019 (diff) | |
Only make GAT ambiguous in match_projection_projections considering shallow resolvability
Diffstat (limited to 'compiler/rustc_trait_selection/src/traits')
| -rw-r--r-- | compiler/rustc_trait_selection/src/traits/select/mod.rs | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/select/mod.rs b/compiler/rustc_trait_selection/src/traits/select/mod.rs index 6a0ad2d19c4..19affac7970 100644 --- a/compiler/rustc_trait_selection/src/traits/select/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/select/mod.rs @@ -1778,9 +1778,19 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { // If this type is a GAT, and of the GAT args resolve to something new, // that means that we must have newly inferred something about the GAT. // We should give up in that case. + // FIXME(generic-associated-types): This only detects one layer of inference, + // which is probably not what we actually want, but fixing it causes some ambiguity: + // <https://github.com/rust-lang/rust/issues/125196>. if !generics.own_params.is_empty() && obligation.predicate.args[generics.parent_count..].iter().any(|&p| { - p.has_non_region_infer() && self.infcx.resolve_vars_if_possible(p) != p + p.has_non_region_infer() + && match p.unpack() { + ty::GenericArgKind::Const(ct) => { + self.infcx.shallow_resolve_const(ct) != ct + } + ty::GenericArgKind::Type(ty) => self.infcx.shallow_resolve(ty) != ty, + ty::GenericArgKind::Lifetime(_) => false, + } }) { ProjectionMatchesProjection::Ambiguous |
