projecting to assoc type of supertrait that is implemented differently for trait object goes wrong #131891
Open
Description
opened on Oct 18, 2024
I tried this code: playground
#![feature(ptr_metadata)]
use std::ptr::Pointee;
trait Trait: Pointee {
fn meta(&self) -> Self::Metadata;
}
impl Trait for () {
fn meta(&self) {}
}
fn main() {
let d: &dyn Trait<Metadata = ()> = &();
let m = d.meta();
dbg!(m);
}
I expected to see this happen: The type of m
is ()
(or Trait
is dyn incompatible).
Instead, this happened: The type of m
is DynMetadata<dyn Trait<Metadata = ()>>
.
Presumably this affects all traits with #[rustc_deny_explicit_impl(implement_via_object = false)]
and associated types.
Miri does report UB for this code:
error: Undefined Behavior: calling a function with return type () passing return place of type std::ptr::DynMetadata<dyn Trait<Metadata = ()>>
--> src/main.rs:15:13
|
15 | let m = d.meta();
| ^^^^^^^^ calling a function with return type () passing return place of type std::ptr::DynMetadata<dyn Trait<Metadata = ()>>
|
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
= help: this means these two types are not *guaranteed* to be ABI-compatible across all targets
= help: if you think this code should be accepted anyway, please report an issue with Miri
= note: BACKTRACE:
= note: inside `main` at src/main.rs:15:13: 15:21
Meta
playground nightly
Build using the Nightly version: 1.84.0-nightly
(2024-10-17 3ed6e3cc69857129c1d3)
@rustbot label A-trait-objects A-associated-items T-types I-unsound requires-nightly -needs-triage
Metadata
Assignees
Labels
Area: Associated items (types, constants & functions)Area: trait objects, vtable layoutCategory: This is a bug.Issue: A soundness hole (worst kind of bug), see: https://en.wikipedia.org/wiki/SoundnessRelevant to the types team, which will review and decide on the PR/issue.This issue requires a nightly compiler in some way.
Activity