rust-lang / rust-lang/rust-analyzer
FP trait bound not satisfied
Open
Nobody has claimed this yet.
C-bug
- Dominant language
- Rust
- Stars
- 16.9k
- Forks
- 2.2k
- Avg merge
- 1d 12h
- Merged PRs (30d)
- 72
Description
// check-pass
#![allow(dead_code)]
trait ParseError {
type StreamError;
}
impl<T> ParseError for T {
type StreamError = ();
}
trait Stream {
type Item;
type Error: ParseError;
}
trait Parser
where
<Self as Parser>::PartialState: Default,
{
type PartialState;
fn parse_mode(_: &Self, _: Self::PartialState) {
loop {}
}
}
impl Stream for () {
type Item = ();
type Error = ();
}
impl Parser for () {
type PartialState = ();
}
struct AndThen<A, B>(core::marker::PhantomData<(A, B)>);
impl<A, B> Parser for AndThen<A, B>
where
A: Stream,
B: Into<<A::Error as ParseError>::StreamError>,
{
type PartialState = ();
}
fn expr<A>() -> impl Parser
where
A: Stream<Error = <A as Stream>::Item>,
{
AndThen::<A, ()>(core::marker::PhantomData)
}
fn parse_mode_impl<A>()
where
<A as Stream>::Error: ParseError,
A: Stream<Error = <A as Stream>::Item>,
{
Parser::parse_mode(&expr::<A>(), Default::default())
}
fn main() {}
this compiles with rustc but fails with rust-analyzer diagnostics .
at crate f, file /tmp/f/src/main.rs: Error RustcHardError("E0277") from LineCol { line: 58, col: 4 } to LineCol { line: 58, col: 22 }: the trait bound `<impl Parser as Parser>::PartialState: Default` is not satisfied
at crate f, file /tmp/f/src/main.rs: Error RustcHardError("E0277") from LineCol { line: 58, col: 37 } to LineCol { line: 58, col: 53 }: the trait bound `<impl Parser as Parser>::PartialState: Default` is not satisfied
diagnostic scan complete
Error: diagnostic error detected
Stack backtrace:
0: <anyhow::Error>::msg::<&str>
1: std::sys::backtrace::__rust_begin_short_backtrace::<<stdx::thread::Builder>::spawn<<rust_analyzer::cli::flags::Diagnostics>::run::{closure#0}, core::result::Result<(), anyhow::Error>>::{closure#0}, core::result::Result<(), anyhow::Error>>
2: <std::thread::lifecycle::spawn_unchecked<<stdx::thread::Builder>::spawn<<rust_analyzer::cli::flags::Diagnostics>::run::{closure#0}, core::result::Result<(), anyhow::Error>>::{closure#0}, core::result::Result<(), anyhow::Error>>::{closure#1} as core::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
3: <std::sys::thread::unix::Thread>::new::thread_start
4: <unknown>
5: <unknown>
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Reproduce the report from the Rust source in /tmp/f/src/main.rs by comparing rustc with rust-analyzer diagnostics .. Trace the trait-bound diagnostic for the opaque impl Parser return and verify that rust-analyzer no longer reports the spurious E0277 errors while retaining valid diagnostics.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- compilers, devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100