rust-lang / rust-lang/rust

rustdoc: ICE: synthetic auto trait impls: `unable to fulfill trait` due to ambiguity

Open
#144,918 3 comments 0 reactions 1 assignee View on GitHub

@fmease is already working on this.

Since Aug 4, 2025.

A-auto-traits A-synthetic-impls C-bug I-ICE S-has-mcve T-rustdoc
Dominant language
Rust
Stars
119k
Forks
16.1k
PR merge metrics
PR metrics pending

Description

Code
// pin-project=1.1.10, pin-project-internal=1.1.10
use std::marker;
use std::path::PathBuf;
use std::pin::Pin;
use std::task::Context;
use std::task::Poll;

use pin_project::pin_project;

pub enum Error {}

pub type Result<T> = std::result::Result<T, Error>;

pub trait ReadFromAsync: Sized {
    type Future: Future<Output = Result<Self>> + Send + 'static
    where
        Self: 'static;

    fn read_from_async(path: PathBuf) -> Self::Future;
}

pub trait WriteToAsync {
    type Future<'a>: Future<Output = Result<()>> + Send + 'a
    where
        Self: 'a;
    fn write_to_async<'a>(&'a self, path: PathBuf) -> Self::Future<'a>;
}

pub trait WriteToAsyncOwned<'a>: Sized {
    type Future: Future<Output = Result<()>> + Send + 'a;

    fn write_to_async_owned(self, path: PathBuf) -> Self::Future;
}

#[derive(Debug, Clone, Hash)]
pub struct DeferredRead<T>(pub PathBuf, marker::PhantomData<T>);

#[pin_project(project_replace = DeferredReadWriteFutureProj)]
pub enum DeferredReadWriteFuture<'a, T>
where
    T: ReadFromAsync + WriteToAsyncOwned<'a> + Send + 'static,
    <T as ReadFromAsync>::Future: Future<Output = Result<T>> + Unpin,
    <T as WriteToAsyncOwned<'a>>::Future: Future<Output = Result<()>> + Unpin,
{
    A {
        v: marker::PhantomData<T>,
        l: marker::PhantomData<&'a ()>,
    },
}

impl<'a, T> Future for DeferredReadWriteFuture<'a, T>
where
    T: ReadFromAsync + WriteToAsyncOwned<'a> + Send + 'static,
    <T as ReadFromAsync>::Future: Future<Output = Result<T>> + Unpin,
    <T as WriteToAsyncOwned<'a>>::Future: Future<Output = Result<()>> + Unpin,
{
    type Output = Result<()>;

    fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {
        todo!()
    }
}

impl<T> WriteToAsync for DeferredRead<T>
where
    T: ReadFromAsync + for<'a> WriteToAsyncOwned<'a> + Send + 'static,
    <T as ReadFromAsync>::Future: Future<Output = Result<T>> + Unpin,
    for<'a> <T as WriteToAsyncOwned<'a>>::Future: Future<Output = Result<()>> + Unpin,
{
    type Future<'a>
        = DeferredReadWriteFuture<'a, T>
    where
        Self: 'a;

    fn write_to_async(&self, _path: PathBuf) -> Self::Future<'_> {
        todo!()
    }
}

#[pin_project(project_replace = DeferredReadOrOwnWriteFutureProj)]
pub enum DeferredReadOrOwnWriteFuture<'a, T>
where
    T: ReadFromAsync + WriteToAsync + for<'b> WriteToAsyncOwned<'b> + Send + 'static,
    <T as ReadFromAsync>::Future: Future<Output = Result<T>> + Unpin,
    <T as WriteToAsync>::Future<'a>: Future<Output = Result<()>> + Unpin,
    for<'b> <T as WriteToAsyncOwned<'b>>::Future: Future<Output = Result<()>> + Unpin,
{
    Deferred {
        inner: <DeferredRead<T> as WriteToAsync>::Future<'a>,
    },
}

Meta

rustc --version --verbose:

rustc 1.91.0-nightly (f34ba774c 2025-08-03)
binary: rustc
commit-hash: f34ba774c78ea32b7c40598b8ad23e75cdac42a6
commit-date: 2025-08-03
host: x86_64-apple-darwin
release: 1.91.0-nightly
LLVM version: 20.1.8
Error output
thread 'rustc' panicked at /rustc/f34ba774c78ea32b7c40598b8ad23e75cdac42a6/compiler/rustc_trait_selection/src/traits/auto_trait.rs:160:13:
Unable to fulfill trait DefId(2:38164 ~ core[8961]::marker::Unpin) for 'DeferredReadOrOwnWriteFutureProj<'a/#0, T/#1>': [Ambiguity, Ambiguity]
stack backtrace:
   0:        0x115edd5a7 - std::backtrace::Backtrace::create::hb36e8c917a03cafd
   1:        0x115edd4f5 - std::backtrace::Backtrace::force_capture::h228c11e9e01224f1
   2:        0x1139860c7 - rustc_driver_impl[a9a40758cd2cdef9]::install_ice_hook::{closure#1}
   3:        0x115efc01d - std::panicking::rust_panic_with_hook::h3af81ec44450c854
   4:        0x115efbc08 - std::panicking::begin_panic_handler::{{closure}}::h26b000b63eb9d24c
   5:        0x115ef6b29 - std::sys::backtrace::__rust_end_short_backtrace::ha9f22b08fa18ae35
   6:        0x115efb864 - __rustc[46d736129294a9b7]::rust_begin_unwind
   7:        0x1191fba6f - core::panicking::panic_fmt::hdf5da01566eeee99
   8:        0x10617988d - <rustc_trait_selection[9a62322ed5ac551a]::traits::auto_trait::AutoTraitFinder>::find_auto_trait_generics::<rustdoc[e1c355f1fc2c8f11]::clean::types::Generics, rustdoc[e1c355f1fc2c8f11]::clean::auto_trait::synthesize_auto_trait_impl::{closure#0}>
   9:        0x106549b93 - rustdoc[e1c355f1fc2c8f11]::clean::auto_trait::synthesize_auto_trait_impl
  10:        0x1063edb7b - rustdoc[e1c355f1fc2c8f11]::clean::utils::synthesize_auto_trait_and_blanket_impls
  11:        0x10651e990 - <rustdoc[e1c355f1fc2c8f11]::passes::collect_trait_impls::SyntheticImplCollector as rustdoc[e1c355f1fc2c8f11]::visit::DocVisitor>::visit_item
  12:        0x10651e8bc - <rustdoc[e1c355f1fc2c8f11]::passes::collect_trait_impls::SyntheticImplCollector as rustdoc[e1c355f1fc2c8f11]::visit::DocVisitor>::visit_item
  13:        0x10651a47b - rustdoc[e1c355f1fc2c8f11]::passes::collect_trait_impls::collect_trait_impls
  14:        0x1064219a2 - rustdoc[e1c355f1fc2c8f11]::core::run_global_ctxt
  15:        0x106546485 - rustdoc[e1c355f1fc2c8f11]::main_args::{closure#2}::{closure#0}
  16:        0x1062b3d1b - rustc_interface[25c42c93eb8740f1]::interface::run_compiler::<(), rustdoc[e1c355f1fc2c8f11]::main_args::{closure#2}>::{closure#1}
  17:        0x106235f68 - std[44cc8fe43e69011]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[25c42c93eb8740f1]::util::run_in_thread_with_globals<rustc_interface[25c42c93eb8740f1]::util::run_in_thread_pool_with_globals<rustc_interface[25c42c93eb8740f1]::interface::run_compiler<(), rustdoc[e1c355f1fc2c8f11]::main_args::{closure#2}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
  18:        0x1062c27a2 - <<std[44cc8fe43e69011]::thread::Builder>::spawn_unchecked_<rustc_interface[25c42c93eb8740f1]::util::run_in_thread_with_globals<rustc_interface[25c42c93eb8740f1]::util::run_in_thread_pool_with_globals<rustc_interface[25c42c93eb8740f1]::interface::run_compiler<(), rustdoc[e1c355f1fc2c8f11]::main_args::{closure#2}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core[8961e4dbb286a9de]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  19:        0x115effc4f - std::sys::pal::unix::thread::Thread::new::thread_start::h877171adda2286a6
  20:     0x7ff808d881d3 - __pthread_start


rustc version: 1.91.0-nightly (f34ba774c 2025-08-03)
platform: x86_64-apple-darwin

query stack during panic:
end of query stack
Backtrace

thread 'rustc' panicked at /rustc/f34ba774c78ea32b7c40598b8ad23e75cdac42a6/compiler/rustc_trait_selection/src/traits/auto_trait.rs:160:13:
Unable to fulfill trait DefId(2:38164 ~ core[8961]::marker::Unpin) for 'DeferredReadOrOwnWriteFutureProj<'a/#0, T/#1>': [Ambiguity, Ambiguity]
stack backtrace:
   0:        0x115ef667f - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::ha0bb7b1a958de3ae
   1:        0x112b630c3 - core::fmt::write::h0af842998b44df14
   2:        0x115eea772 - std::io::Write::write_fmt::h8d0c2db09535a547
   3:        0x115ef64d2 - std::sys::backtrace::BacktraceLock::print::h0796a4708d3a2a65
   4:        0x115efb644 - std::panicking::default_hook::{{closure}}::h6345b3d99db094c0
   5:        0x115efb1b7 - std::panicking::default_hook::hea3406d0c10d38e4
   6:        0x113985e7d - rustc_driver_impl[a9a40758cd2cdef9]::install_ice_hook::{closure#1}
   7:        0x115efc01d - std::panicking::rust_panic_with_hook::h3af81ec44450c854
   8:        0x115efbc08 - std::panicking::begin_panic_handler::{{closure}}::h26b000b63eb9d24c
   9:        0x115ef6b29 - std::sys::backtrace::__rust_end_short_backtrace::ha9f22b08fa18ae35
  10:        0x115efb864 - __rustc[46d736129294a9b7]::rust_begin_unwind
  11:        0x1191fba6f - core::panicking::panic_fmt::hdf5da01566eeee99
  12:        0x10617988d - <rustc_trait_selection[9a62322ed5ac551a]::traits::auto_trait::AutoTraitFinder>::find_auto_trait_generics::<rustdoc[e1c355f1fc2c8f11]::clean::types::Generics, rustdoc[e1c355f1fc2c8f11]::clean::auto_trait::synthesize_auto_trait_impl::{closure#0}>
  13:        0x106549b93 - rustdoc[e1c355f1fc2c8f11]::clean::auto_trait::synthesize_auto_trait_impl
  14:        0x1063edb7b - rustdoc[e1c355f1fc2c8f11]::clean::utils::synthesize_auto_trait_and_blanket_impls
  15:        0x10651e990 - <rustdoc[e1c355f1fc2c8f11]::passes::collect_trait_impls::SyntheticImplCollector as rustdoc[e1c355f1fc2c8f11]::visit::DocVisitor>::visit_item
  16:        0x10651e8bc - <rustdoc[e1c355f1fc2c8f11]::passes::collect_trait_impls::SyntheticImplCollector as rustdoc[e1c355f1fc2c8f11]::visit::DocVisitor>::visit_item
  17:        0x10651a47b - rustdoc[e1c355f1fc2c8f11]::passes::collect_trait_impls::collect_trait_impls
  18:        0x1064219a2 - rustdoc[e1c355f1fc2c8f11]::core::run_global_ctxt
  19:        0x106546485 - rustdoc[e1c355f1fc2c8f11]::main_args::{closure#2}::{closure#0}
  20:        0x1062b3d1b - rustc_interface[25c42c93eb8740f1]::interface::run_compiler::<(), rustdoc[e1c355f1fc2c8f11]::main_args::{closure#2}>::{closure#1}
  21:        0x106235f68 - std[44cc8fe43e69011]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[25c42c93eb8740f1]::util::run_in_thread_with_globals<rustc_interface[25c42c93eb8740f1]::util::run_in_thread_pool_with_globals<rustc_interface[25c42c93eb8740f1]::interface::run_compiler<(), rustdoc[e1c355f1fc2c8f11]::main_args::{closure#2}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
  22:        0x1062c27a2 - <<std[44cc8fe43e69011]::thread::Builder>::spawn_unchecked_<rustc_interface[25c42c93eb8740f1]::util::run_in_thread_with_globals<rustc_interface[25c42c93eb8740f1]::util::run_in_thread_pool_with_globals<rustc_interface[25c42c93eb8740f1]::interface::run_compiler<(), rustdoc[e1c355f1fc2c8f11]::main_args::{closure#2}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core[8961e4dbb286a9de]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  23:        0x115effc4f - std::sys::pal::unix::thread::Thread::new::thread_start::h877171adda2286a6
  24:     0x7ff808d881d3 - __pthread_start

error: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-rustdoc&template=ice.md

note: please make sure that you have updated to the latest nightly

note: please attach the file at `/Users/dinu/proj/narxia/rustc-ice-2025-08-04T17_16_00-36115.txt` to your bug report

note: compiler flags: --crate-type lib

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
end of query stack

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.