Repository: rust
Issue: Incorrect "expected associated type, found tuple" error in trait implementation
Labels: A-associated-items,C-bug,A-lazy-normalization

<!--
Thank you for filing a bug report! 🐛 Please provide a short summary of the bug,
along with any information you feel relevant to replicating the bug.
-->

When generically implementing a trait with an associated type (along with some other specific circumstances), there is an error which essentially says that type A doesn't equal type A.

Minimized:

```rust
trait Protocol {
    type Address;
    fn connect(source_address: Self::Address)
    where
        Self: SupportedConfiguration;
}

impl<P> Protocol for Udp<P> {
    type Address = (usize, usize);

    fn connect((_source_address, _source_port): Self::Address)
    where
        Self: SupportedConfiguration,
    {
    }
}

trait SupportedConfiguration: Protocol {}
impl<P> SupportedConfiguration for Udp<P> {}

struct Udp<P> {
    inner_protocol: P,
}
```

Error message:
```
error[E0308]: mismatched types
  --> src/lib.rs:11:16
   |
11 |     fn connect((_source_address, _source_port): Self::Address)
   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  ------------- expected due to this
   |                |
   |                expected associated type, found tuple
   |
   = note: expected associated type `<Udp<P> as Protocol>::Address`
                        found tuple `(_, _)`
   = help: consider constraining the associated type `<Udp<P> as Protocol>::Address` to `(_, _)` or calling a method that returns `<Udp<P> as Protocol>::Address`
   = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
```

Changing line 11 by expanding the associated type like so produces a new error:
```rust
    fn connect((_source_address, _source_port): (usize, usize))
```
```
error[E0053]: method `connect` has an incompatible type for trait
  --> src/lib.rs:11:49
   |
3  |     fn connect(source_address: Self::Address)
   |                                ------------- type in trait
...
9  |     type Address = (usize, usize);
   |     ------------------------------ expected this associated type
10 | 
11 |     fn connect((_source_address, _source_port): (usize, usize))
   |                                                 ^^^^^^^^^^^^^^
   |                                                 |
   |                                                 expected associated type, found tuple
   |                                                 help: change the parameter type to match the trait: `<Udp<P> as Protocol>::Address`
   |
   = note: expected fn pointer `fn(<Udp<P> as Protocol>::Address)`
              found fn pointer `fn((usize, usize))`
```

### Meta
<!--
If you're using the stable version of the compiler, you should also check if the
bug also exists in the beta or nightly versions.
-->

This error appears in stable and nightly.

`rustc --version --verbose`:
```
rustc 1.53.0 (53cb7b09b 2021-06-17)
binary: rustc
commit-hash: 53cb7b09b00cbea8754ffb78e7e3cb521cb8af4b
commit-date: 2021-06-17
host: x86_64-unknown-linux-gnu
release: 1.53.0
LLVM version: 12.0.1
```

`rustc +nightly --version --verbose`:
```
rustc 1.55.0-nightly (798baebde 2021-07-02)
binary: rustc
commit-hash: 798baebde1fe77e5a660490ec64e727a5d79970d
commit-date: 2021-07-02
host: x86_64-unknown-linux-gnu
release: 1.55.0-nightly
LLVM version: 12.0.1
```