Skip to content

Two conflicting concrete types for the same opaque type #114597

Closed
@Nashenas88

Description

@Nashenas88

I tried this code:

https://cs.opensource.google/fuchsia/fuchsia/+/main:src/connectivity/network/netcfg/src/lib.rs;l=1762;drc=4a7d2eb6793e61c0021f8dd7dab35804590d36b6
The function beginning with the signature:

async fn create_device_stream(
        &self,
    ) -> Result<
        impl futures::Stream<Item = Result<devices::NetworkDeviceInstance, anyhow::Error>>,
        anyhow::Error,
    > { ... }

I expected to see this happen: Compiles successfully, as it did on previous releases.

Instead, this happened:

error: concrete type differs from previous defining opaque type use
    --> ../../src/connectivity/network/netcfg/src/lib.rs:1765:9
     |
1765 |         impl futures::Stream<Item = Result<devices::NetworkDeviceInstance, anyhow::Error>>,
     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |         |
     |         expected `TryFlattenUnordered<futures::stream::Fuse<TryFilterMap<futures::stream::ErrInto<Watcher, anyhow::Error>, [async block@../../src/connectivity/network/netcfg/src/lib.rs:1782:17: 1843:18], [closure@../../src/connectivity/network/netcfg/src/lib.rs:1780:29: 1780:82]>>>`, got `TryFlattenUnordered<futures::stream::Fuse<TryFilterMap<futures::stream::ErrInto<Watcher, anyhow::Error>, [async block@../../src/connectivity/network/netcfg/src/lib.rs:1782:17: 1843:18], [closure@../../src/connectivity/network/netcfg/src/lib.rs:1780:29: 1780:82]>>>`
     |         this expression supplies two conflicting concrete types for the same opaque type
error: aborting due to previous error

Recompiling with -Zverbose outputs:

error: concrete type differs from previous defining opaque type use
    --> ../../src/connectivity/network/netcfg/src/lib.rs:1765:9
     |
1765 |         impl futures::Stream<Item = Result<devices::NetworkDeviceInstance, anyhow::Error>>,
     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     |         |
     |         expected `TryFlattenUnordered<futures::stream::Fuse<TryFilterMap<futures::stream::ErrInto<Watcher, anyhow::Error>, [static NetCfg<ReEarlyBound(DefId(0:3068 ~ netcfg[7715]::{impl#13}::create_device_stream::{opaque#0}::'a), 2, 'a)>::create_device_stream::{closure#0}::{closure#2}::{closure#0} upvar_tys=(fuchsia_fs::directory::WatchEvent, PathBuf, InstallerProxy) for<Region(BrAnon(None)), Region(BrAnon(None)), Region(BrAnon(None)), Region(BrAnon(None))> {ResumeTy, fuchsia_fs::directory::WatchEvent, PathBuf, InstallerProxy, &ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrAnon(None) }) InstallerProxy, &ReLateBound(DebruijnIndex(0), BoundRegion { var: 1, kind: BrAnon(None) }) PathBuf, Opaque(DefId(0:2630 ~ netcfg[7715]::devices::{impl#4}::get_instance_stream::{opaque#0}), [ReLateBound(DebruijnIndex(0), BoundRegion { var: 2, kind: BrAnon(None) }), ReLateBound(DebruijnIndex(0), BoundRegion { var: 3, kind: BrAnon(None) })]), ()}], [NetCfg<ReEarlyBound(DefId(0:3068 ~ netcfg[7715]::{impl#13}::create_device_stream::{opaque#0}::'a), 2, 'a)>::create_device_stream::{closure#0}::{closure#2} closure_kind_ty=i16 closure_sig_as_fn_ptr_ty=extern "rust-call" fn((WatchMessage,)) -> [static NetCfg<ReEarlyBound(DefId(0:3068 ~ netcfg[7715]::{impl#13}::create_device_stream::{opaque#0}::'a), 2, 'a)>::create_device_stream::{closure#0}::{closure#2}::{closure#0} upvar_tys=(fuchsia_fs::directory::WatchEvent, PathBuf, InstallerProxy) for<Region(BrAnon(None)), Region(BrAnon(None)), Region(BrAnon(None)), Region(BrAnon(None))> {ResumeTy, fuchsia_fs::directory::WatchEvent, PathBuf, InstallerProxy, &ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrAnon(None) }) InstallerProxy, &ReLateBound(DebruijnIndex(0), BoundRegion { var: 1, kind: BrAnon(None) }) PathBuf, Opaque(DefId(0:2630 ~ netcfg[7715]::devices::{impl#4}::get_instance_stream::{opaque#0}), [ReLateBound(DebruijnIndex(0), BoundRegion { var: 2, kind: BrAnon(None) }), ReLateBound(DebruijnIndex(0), BoundRegion { var: 3, kind: BrAnon(None) })]), ()}] upvar_tys=(InstallerProxy)]>>>`, got `TryFlattenUnordered<futures::stream::Fuse<TryFilterMap<futures::stream::ErrInto<Watcher, anyhow::Error>, [static NetCfg<ReEarlyBound(DefId(0:626 ~ netcfg[7715]::{impl#13}::'a), 0, 'a)>::create_device_stream::{closure#0}::{closure#2}::{closure#0} upvar_tys=(fuchsia_fs::directory::WatchEvent, PathBuf, InstallerProxy) for<Region(BrAnon(None)), Region(BrAnon(None)), Region(BrAnon(None)), Region(BrAnon(None))> {ResumeTy, fuchsia_fs::directory::WatchEvent, PathBuf, InstallerProxy, &ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrAnon(None) }) InstallerProxy, &ReLateBound(DebruijnIndex(0), BoundRegion { var: 1, kind: BrAnon(None) }) PathBuf, Opaque(DefId(0:2630 ~ netcfg[7715]::devices::{impl#4}::get_instance_stream::{opaque#0}), [ReLateBound(DebruijnIndex(0), BoundRegion { var: 2, kind: BrAnon(None) }), ReLateBound(DebruijnIndex(0), BoundRegion { var: 3, kind: BrAnon(None) })]), ()}], [NetCfg<ReEarlyBound(DefId(0:626 ~ netcfg[7715]::{impl#13}::'a), 0, 'a)>::create_device_stream::{closure#0}::{closure#2} closure_kind_ty=i16 closure_sig_as_fn_ptr_ty=extern "rust-call" fn((WatchMessage,)) -> [static NetCfg<ReEarlyBound(DefId(0:626 ~ netcfg[7715]::{impl#13}::'a), 0, 'a)>::create_device_stream::{closure#0}::{closure#2}::{closure#0} upvar_tys=(fuchsia_fs::directory::WatchEvent, PathBuf, InstallerProxy) for<Region(BrAnon(None)), Region(BrAnon(None)), Region(BrAnon(None)), Region(BrAnon(None))> {ResumeTy, fuchsia_fs::directory::WatchEvent, PathBuf, InstallerProxy, &ReLateBound(DebruijnIndex(0), BoundRegion { var: 0, kind: BrAnon(None) }) InstallerProxy, &ReLateBound(DebruijnIndex(0), BoundRegion { var: 1, kind: BrAnon(None) }) PathBuf, Opaque(DefId(0:2630 ~ netcfg[7715]::devices::{impl#4}::get_instance_stream::{opaque#0}), [ReLateBound(DebruijnIndex(0), BoundRegion { var: 2, kind: BrAnon(None) }), ReLateBound(DebruijnIndex(0), BoundRegion { var: 3, kind: BrAnon(None) })]), ()}] upvar_tys=(InstallerProxy)]>>>`
     |         this expression supplies two conflicting concrete types for the same opaque type

error: aborting due to previous error

Which when diffed, shows a change only from instances of
NetCfg<ReEarlyBound(DefId(0:3068 ~ netcfg[7715]::{impl#13}::create_device_stream::{opaque#0}::'a), 2, 'a)> to
NetCfg<ReEarlyBound(DefId(0:626 ~ netcfg[7715]::{impl#13}::'a), 0, 'a)>.

Meta

Error output is from rustc commit 139b49b
Likely related to #113661, CC @oli-obk @lcnr

Metadata

Metadata

Labels

A-impl-traitArea: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.C-bugCategory: This is a bug.P-criticalCritical priorityT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.regression-from-stable-to-nightlyPerformance or correctness regression from stable to nightly.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions