diff options
| author | lcnr <rust@lcnr.de> | 2025-02-10 14:45:24 +0100 |
|---|---|---|
| committer | lcnr <rust@lcnr.de> | 2025-02-28 12:16:47 +0100 |
| commit | 46faf4bed643172fd0e04b28d93a3288fa998e99 (patch) | |
| tree | 64cfe05e86f7d433cb8e097f33773fa62574964b /compiler/rustc_middle | |
| parent | cb08599451226d780b2490f1aa9b414fe9e36657 (diff) | |
| download | rust-46faf4bed643172fd0e04b28d93a3288fa998e99.tar.gz rust-46faf4bed643172fd0e04b28d93a3288fa998e99.zip | |
rework cycle handling
A cycle was previously coinductive if all steps were coinductive. Change this to instead considerm cycles to be coinductive if they step through at least one where-bound of an impl of a coinductive trait goal.
Diffstat (limited to 'compiler/rustc_middle')
| -rw-r--r-- | compiler/rustc_middle/src/ty/context.rs | 4 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/ty/predicate.rs | 6 |
2 files changed, 6 insertions, 4 deletions
diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs index 00993c40dea..38a3f722ca2 100644 --- a/compiler/rustc_middle/src/ty/context.rs +++ b/compiler/rustc_middle/src/ty/context.rs @@ -594,6 +594,10 @@ impl<'tcx> Interner for TyCtxt<'tcx> { self.trait_is_auto(trait_def_id) } + fn trait_is_coinductive(self, trait_def_id: DefId) -> bool { + self.trait_is_coinductive(trait_def_id) + } + fn trait_is_alias(self, trait_def_id: DefId) -> bool { self.trait_is_alias(trait_def_id) } diff --git a/compiler/rustc_middle/src/ty/predicate.rs b/compiler/rustc_middle/src/ty/predicate.rs index de6d30a89d4..089855bfb61 100644 --- a/compiler/rustc_middle/src/ty/predicate.rs +++ b/compiler/rustc_middle/src/ty/predicate.rs @@ -51,10 +51,6 @@ impl<'tcx> rustc_type_ir::inherent::Predicate<TyCtxt<'tcx>> for Predicate<'tcx> self.as_clause() } - fn is_coinductive(self, interner: TyCtxt<'tcx>) -> bool { - self.is_coinductive(interner) - } - fn allow_normalization(self) -> bool { self.allow_normalization() } @@ -119,6 +115,8 @@ impl<'tcx> Predicate<'tcx> { Some(tcx.mk_predicate(kind)) } + /// Only used by the old solver to decide whether a predicate is accepted + /// in a coinductive trait solver cycle. #[instrument(level = "debug", skip(tcx), ret)] pub fn is_coinductive(self, tcx: TyCtxt<'tcx>) -> bool { match self.kind().skip_binder() { |
