diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2021-10-01 14:46:52 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-01 14:46:52 -0700 |
| commit | 5ab1245303c26d3ae33b1adaa89fef2b8d9fb9ca (patch) | |
| tree | bbd7a3f43561a8f7c88d76fc9b162c4bf7620069 /src/test/ui/pattern/usefulness | |
| parent | b458ecf29dc65e3e62785a4e3fdacbec1f18188b (diff) | |
| parent | 68b76a48358e611e31de8e96c56b9e50862a960e (diff) | |
| download | rust-5ab1245303c26d3ae33b1adaa89fef2b8d9fb9ca.tar.gz rust-5ab1245303c26d3ae33b1adaa89fef2b8d9fb9ca.zip | |
Rollup merge of #89441 - Nadrieril:fix-89393, r=tmandry
Normalize after substituting via `field.ty()` Back in https://github.com/rust-lang/rust/issues/72476 I hadn't understood where the problem was coming from, and only worked around the issue. What happens is that calling `field.ty()` on a field of a generic struct substitutes the appropriate generics but doesn't normalize the resulting type. As a consumer of types I'm surprised that one would substitute without normalizing, feels like a footgun, so I added a comment. Fixes https://github.com/rust-lang/rust/issues/89393.
Diffstat (limited to 'src/test/ui/pattern/usefulness')
| -rw-r--r-- | src/test/ui/pattern/usefulness/issue-72476-and-89393-associated-type.rs | 56 | ||||
| -rw-r--r-- | src/test/ui/pattern/usefulness/issue-72476-associated-type.rs | 22 |
2 files changed, 56 insertions, 22 deletions
diff --git a/src/test/ui/pattern/usefulness/issue-72476-and-89393-associated-type.rs b/src/test/ui/pattern/usefulness/issue-72476-and-89393-associated-type.rs new file mode 100644 index 00000000000..058f4196798 --- /dev/null +++ b/src/test/ui/pattern/usefulness/issue-72476-and-89393-associated-type.rs @@ -0,0 +1,56 @@ +// check-pass + +// From https://github.com/rust-lang/rust/issues/72476 +// and https://github.com/rust-lang/rust/issues/89393 + +trait Trait { + type Projection; +} + +struct A; +impl Trait for A { + type Projection = bool; +} + +struct B; +impl Trait for B { + type Projection = (u32, u32); +} + +struct Next<T: Trait>(T::Projection); + +fn foo1(item: Next<A>) { + match item { + Next(true) => {} + Next(false) => {} + } +} + +fn foo2(x: <A as Trait>::Projection) { + match x { + true => {} + false => {} + } +} + +fn foo3(x: Next<B>) { + let Next((_, _)) = x; + match x { + Next((_, _)) => {} + } +} + +fn foo4(x: <B as Trait>::Projection) { + let (_, _) = x; + match x { + (_, _) => {} + } +} + +fn foo5<T: Trait>(x: <T as Trait>::Projection) { + match x { + _ => {} + } +} + +fn main() {} diff --git a/src/test/ui/pattern/usefulness/issue-72476-associated-type.rs b/src/test/ui/pattern/usefulness/issue-72476-associated-type.rs deleted file mode 100644 index 1e1d21433b7..00000000000 --- a/src/test/ui/pattern/usefulness/issue-72476-associated-type.rs +++ /dev/null @@ -1,22 +0,0 @@ -// check-pass - -// From https://github.com/rust-lang/rust/issues/72476 - -trait A { - type Projection; -} - -impl A for () { - type Projection = bool; -} - -struct Next<T: A>(T::Projection); - -fn f(item: Next<()>) { - match item { - Next(true) => {} - Next(false) => {} - } -} - -fn main() {} |
