Skip to content

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

@dnbln

Description

@dnbln

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

Metadata

Metadata

Assignees

Labels

A-auto-traitsArea: auto traits (e.g., `auto trait Send {}`)A-synthetic-implsArea: Synthetic impls, used by rustdoc to document auto traits and traits with blanket implsC-bugCategory: This is a bug.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️T-rustdocRelevant to the rustdoc team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions