Removes the attribute from `MetaSized` and `PointeeSized`, with a special case in the trait solvers for `MetaSized`. `dyn MetaSized` is a perfectly cromulent type, and seems to only have had #[rustc_do_not_implement_via_object] so the builtin object candidate does not overlap with the builtin MetaSized impl that all `dyn` types get. Resolves this with a special case by checking `is_sizedness_trait` where the trait solvers previously checked `implement_via_object`. `dyn PointeeSized` alone is rejected for other reasons (since `dyn PointeeSized` is considered to have no principal trait because `PointeeSized` is removed at an earlier stage of the compiler), but `(dyn PointeeSized + Send)` is valid and equivalent to `dyn Send`. Add suggestions from code review Update compiler/rustc_trait_selection/src/traits/dyn_compatibility.rs and tests Co-authored-by: lcnr <rust@lcnr.de>
17 lines
497 B
Rust
17 lines
497 B
Rust
#![feature(ptr_metadata)]
|
|
// Address issue #112737 -- ICE with dyn Pointee
|
|
extern crate core;
|
|
use core::ptr::Pointee;
|
|
|
|
fn unknown_sized_object_ptr_in(_: &(impl Pointee<Metadata = ()> + ?Sized)) {}
|
|
|
|
fn raw_pointer_in(x: &dyn Pointee<Metadata = ()>) {
|
|
//~^ ERROR the trait `Pointee` is not dyn compatible
|
|
unknown_sized_object_ptr_in(x)
|
|
//~^ ERROR the trait `Pointee` is not dyn compatible
|
|
}
|
|
|
|
fn main() {
|
|
raw_pointer_in(&42)
|
|
//~^ ERROR the trait `Pointee` is not dyn compatible
|
|
}
|