Skip to content

Commit

Permalink
Use trait definition cycle detection for trait alias definitions, too
Browse files Browse the repository at this point in the history
  • Loading branch information
oli-obk committed Dec 20, 2024
1 parent 9625f7b commit 6348c8f
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 6 deletions.
2 changes: 1 addition & 1 deletion compiler/rustc_hir_analysis/src/collect/predicates_of.rs
Original file line number Diff line number Diff line change
Expand Up @@ -653,7 +653,7 @@ pub(super) fn implied_predicates_with_filter<'tcx>(
}
}
}
PredicateFilter::SelfAndAssociatedTypeBounds => {
PredicateFilter::All | PredicateFilter::SelfAndAssociatedTypeBounds => {
for &(pred, span) in implied_bounds {
debug!("superbound: {:?}", pred);
if let ty::ClauseKind::Trait(bound) = pred.kind().skip_binder()
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/infinite/infinite-trait-alias-recursion.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#![feature(trait_alias)]

trait T1 = T2;
//~^ ERROR cycle detected when computing the super predicates of `T1`
//~^ ERROR cycle detected when computing the implied predicates of `T1`

trait T2 = T3;

Expand Down
8 changes: 4 additions & 4 deletions tests/ui/infinite/infinite-trait-alias-recursion.stderr
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
error[E0391]: cycle detected when computing the super predicates of `T1`
error[E0391]: cycle detected when computing the implied predicates of `T1`
--> $DIR/infinite-trait-alias-recursion.rs:3:12
|
LL | trait T1 = T2;
| ^^
|
note: ...which requires computing the super predicates of `T2`...
note: ...which requires computing the implied predicates of `T2`...
--> $DIR/infinite-trait-alias-recursion.rs:6:12
|
LL | trait T2 = T3;
| ^^
note: ...which requires computing the super predicates of `T3`...
note: ...which requires computing the implied predicates of `T3`...
--> $DIR/infinite-trait-alias-recursion.rs:8:12
|
LL | trait T3 = T1 + T3;
| ^^
= note: ...which again requires computing the super predicates of `T1`, completing the cycle
= note: ...which again requires computing the implied predicates of `T1`, completing the cycle
= note: trait aliases cannot be recursive
note: cycle used when checking that `T1` is well-formed
--> $DIR/infinite-trait-alias-recursion.rs:3:1
Expand Down
11 changes: 11 additions & 0 deletions tests/ui/traits/alias/infinite_normalization.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
//! This test used to get stuck in an infinite
//! recursion during normalization.
//!
//! issue: /~https://github.com/rust-lang/rust/issues/133901
#![feature(trait_alias)]
fn foo<T: Baz<i32>>() {}
trait Baz<A> = Baz<Option<A>>;
//~^ ERROR: cycle detected when computing the implied predicates of `Baz`

fn main() {}
18 changes: 18 additions & 0 deletions tests/ui/traits/alias/infinite_normalization.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
error[E0391]: cycle detected when computing the implied predicates of `Baz`
--> $DIR/infinite_normalization.rs:8:16
|
LL | trait Baz<A> = Baz<Option<A>>;
| ^^^^^^^^^^^^^^
|
= note: ...which immediately requires computing the implied predicates of `Baz` again
= note: trait aliases cannot be recursive
note: cycle used when computing normalized predicates of `foo`
--> $DIR/infinite_normalization.rs:7:1
|
LL | fn foo<T: Baz<i32>>() {}
| ^^^^^^^^^^^^^^^^^^^^^
= note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0391`.

0 comments on commit 6348c8f

Please sign in to comment.