Skip to content

Weird rustc errors about expected types. #57713

@AmlingPalantir

Description

@AmlingPalantir

I tried this code:

https://github.com/AmlingPalantir/20190117-rustc-bug

I expected to see this happen:

Compiler error complains about return type, something like "expected
Bottom::Structo, found Bottom2::Structo".

Instead, this happened:

Compiler error seems to be trying to replace actual types (like
Bottom2::Structo) with visible aliases for them. In this case Bottom2::Structo
isn't actually visible to the code so this makes a kind of sense, but what
happens is ... bad.

It says "expected bottom::Structo because of return type" which makes sense
because the return type is left::Structo which is an alias for bottom::Structo
and bottom::Structo is visible.

But then it says "found left::Structo" which is less sensible. In particular,
the called function returns bottom2::Structo which is not visible. I assume
it's trying to find an alias and sees that left has imported bottom2::Structo
so it says left::Structo, but left actually imported it as Structo2 (so it's left::Structo2).

Meta

This was from a freshly rustup'd nightly as of today (20190117).

$ ~/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/rustc --version --verbose
rustc 1.33.0-nightly (ceb2512 2019-01-16)
binary: rustc
commit-hash: ceb2512
commit-date: 2019-01-16
host: x86_64-unknown-linux-gnu
release: 1.33.0-nightly
LLVM version: 8.0

Backtrace:

 error[E0308]: mismatched types
  --> top/src/lib.rs:6:5
   |
 5 | fn foo() -> left::Structo {
   |             ------------- expected `bottom::Structo` because of return type
 6 |     right::f()
   |     ^^^^^^^^^^ expected struct `bottom::Structo`, found struct `left::Structo`
   |
   = note: expected type `bottom::Structo`
              found type `left::Structo`

Activity

AmlingPalantir

AmlingPalantir commented on Jan 17, 2019

@AmlingPalantir
Author

This actually happened to me in real code, I've just stripped it way down. In the real case top was me, left was syn[::export], right was quote, bottom was proc_macro, bottom2 was proc_macro2, and Structo was TokenStream.

estebank

estebank commented on Jan 18, 2019

@estebank
Contributor

Pretty sure this is a duplicate of #56943, but the repro case is very helpful.

added
A-resolveArea: Name/path resolution done by `rustc_resolve` specifically
on Jan 18, 2019
AmlingPalantir

AmlingPalantir commented on Jan 18, 2019

@AmlingPalantir
Author

Yeah, you can get errors similar to that ("expected X, found a different X") if you remove the top -> bottom link in my example.

self-assigned this
on Jan 21, 2019
added a commit that references this issue on Jan 25, 2019
a9950f6
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

A-diagnosticsArea: Messages for errors, warnings, and lintsA-resolveArea: Name/path resolution done by `rustc_resolve` specifically

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

    Development

    Participants

    @davidtwco@estebank@AmlingPalantir

    Issue actions

      Weird rustc errors about expected types. · Issue #57713 · rust-lang/rust