mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-21 17:52:12 +03:00
a0e620a9bb
Hand-written Debug implementation for `TypeTest`
This adds a hand-written debug format for `TypeTest`s that at least was helpful for me when debugging because I always struggle to remember which component is which. It formats a type test using the Unicode turnstile symbol (for "computes") to illustrate that the test encodes a typing rule that, if it holds, produces a conclusion.
The format is: `TypeTest from {originating span} {bound} ⊢ T: 'lower_bound`, where `T` is the generic type being tested and `lower_bound` is the lower bound. Bounds are formatted as you would expect, but where the region for `'lower_bound` is included in the outlives constraints for context. I resisted the urge to turn `ALL [A, ..., Z]` into `[A ∧ ... ∧ Z]` etc.
## What it looks like
Here's an example of a simple type test from the test suite that says that some type `I/#0` will be lower-bounded (outlive) `?4` iff `'?1: '?4`:
Before:
```
$ RUSTC_LOG="rustc_borrowck::region_infer=debug" rustc +stage1 tests/ui/associated-types/associated-types-eq-3.rs
...
DEBUG rustc_borrowck::region_infer type tests: [
TypeTest {
generic_kind: I/#0,
lower_bound: '?4,
span: tests/ui/associated-types/associated-types-eq-3.rs:21:18: 21:25 (#0),
verify_bound: OutlivedBy(
'?1,
),
},
TypeTest {
generic_kind: I/#0,
lower_bound: '?4,
span: tests/ui/associated-types/associated-types-eq-3.rs:21:18: 21:25 (#0),
verify_bound: OutlivedBy(
'?1,
),
},
]
...
```
After:
```
$ RUSTC_LOG="rustc_borrowck::region_infer=debug" rustc +stage1 tests/ui/associated-types/associated-types-eq-3.rs
...
DEBUG rustc_borrowck::region_infer type tests: [
TypeTest from tests/ui/associated-types/associated-types-eq-3.rs:21:18: 21:25 (#0)['?1: '?4] ⊢ I/#0: '?4,
TypeTest from tests/ui/associated-types/associated-types-eq-3.rs:21:18: 21:25 (#0)['?1: '?4] ⊢ I/#0: '?4,
]
...
```