Rollup merge of #107769 - compiler-errors:pointer-like, r=eholk
Rename `PointerSized` to `PointerLike` The old name was unnecessarily vague. This PR renames a nightly language feature that I added, so I don't think it needs any additional approval, though anyone can feel free to speak up if you dislike the rename. It's still unsatisfying that we don't the user which of {size, alignment} is wrong, but this trait really is just a stepping stone for a more generalized mechanism to create `dyn*`, just meant for nightly testing, so I don't think it really deserves additional diagnostic machinery for now. Fixes #107696, cc ``@RalfJung`` r? ``@eholk``
This commit is contained in:
commit
fabefe3f31
20 changed files with 73 additions and 70 deletions
|
@ -126,7 +126,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||||
let vtable = self.get_vtable_ptr(src.layout.ty, data.principal())?;
|
let vtable = self.get_vtable_ptr(src.layout.ty, data.principal())?;
|
||||||
let vtable = Scalar::from_maybe_pointer(vtable, self);
|
let vtable = Scalar::from_maybe_pointer(vtable, self);
|
||||||
let data = self.read_immediate(src)?.to_scalar();
|
let data = self.read_immediate(src)?.to_scalar();
|
||||||
let _assert_pointer_sized = data.to_pointer(self)?;
|
let _assert_pointer_like = data.to_pointer(self)?;
|
||||||
let val = Immediate::ScalarPair(data, vtable);
|
let val = Immediate::ScalarPair(data, vtable);
|
||||||
self.write_immediate(val, dest)?;
|
self.write_immediate(val, dest)?;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -287,7 +287,7 @@ language_item_table! {
|
||||||
TryTraitBranch, sym::branch, branch_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
|
TryTraitBranch, sym::branch, branch_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
|
||||||
TryTraitFromYeet, sym::from_yeet, from_yeet_fn, Target::Fn, GenericRequirement::None;
|
TryTraitFromYeet, sym::from_yeet, from_yeet_fn, Target::Fn, GenericRequirement::None;
|
||||||
|
|
||||||
PointerSized, sym::pointer_sized, pointer_sized, Target::Trait, GenericRequirement::Exact(0);
|
PointerLike, sym::pointer_like, pointer_like, Target::Trait, GenericRequirement::Exact(0);
|
||||||
|
|
||||||
Poll, sym::Poll, poll, Target::Enum, GenericRequirement::None;
|
Poll, sym::Poll, poll, Target::Enum, GenericRequirement::None;
|
||||||
PollReady, sym::Ready, poll_ready_variant, Target::Variant, GenericRequirement::None;
|
PollReady, sym::Ready, poll_ready_variant, Target::Variant, GenericRequirement::None;
|
||||||
|
|
|
@ -765,7 +765,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
|
||||||
self.cause.clone(),
|
self.cause.clone(),
|
||||||
self.param_env,
|
self.param_env,
|
||||||
ty::Binder::dummy(
|
ty::Binder::dummy(
|
||||||
self.tcx.at(self.cause.span).mk_trait_ref(hir::LangItem::PointerSized, [a]),
|
self.tcx.at(self.cause.span).mk_trait_ref(hir::LangItem::PointerLike, [a]),
|
||||||
),
|
),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
|
@ -1084,7 +1084,7 @@ symbols! {
|
||||||
plugins,
|
plugins,
|
||||||
pointee_trait,
|
pointee_trait,
|
||||||
pointer,
|
pointer,
|
||||||
pointer_sized,
|
pointer_like,
|
||||||
poll,
|
poll,
|
||||||
position,
|
position,
|
||||||
post_dash_lto: "post-lto",
|
post_dash_lto: "post-lto",
|
||||||
|
|
|
@ -128,9 +128,9 @@ pub(super) trait GoalKind<'tcx>: TypeFoldable<'tcx> + Copy + Eq {
|
||||||
goal: Goal<'tcx, Self>,
|
goal: Goal<'tcx, Self>,
|
||||||
) -> QueryResult<'tcx>;
|
) -> QueryResult<'tcx>;
|
||||||
|
|
||||||
// A type is `PointerSized` if we can compute its layout, and that layout
|
// A type is `PointerLike` if we can compute its layout, and that layout
|
||||||
// matches the layout of `usize`.
|
// matches the layout of `usize`.
|
||||||
fn consider_builtin_pointer_sized_candidate(
|
fn consider_builtin_pointer_like_candidate(
|
||||||
ecx: &mut EvalCtxt<'_, 'tcx>,
|
ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||||
goal: Goal<'tcx, Self>,
|
goal: Goal<'tcx, Self>,
|
||||||
) -> QueryResult<'tcx>;
|
) -> QueryResult<'tcx>;
|
||||||
|
@ -312,8 +312,8 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
||||||
|| lang_items.clone_trait() == Some(trait_def_id)
|
|| lang_items.clone_trait() == Some(trait_def_id)
|
||||||
{
|
{
|
||||||
G::consider_builtin_copy_clone_candidate(self, goal)
|
G::consider_builtin_copy_clone_candidate(self, goal)
|
||||||
} else if lang_items.pointer_sized() == Some(trait_def_id) {
|
} else if lang_items.pointer_like() == Some(trait_def_id) {
|
||||||
G::consider_builtin_pointer_sized_candidate(self, goal)
|
G::consider_builtin_pointer_like_candidate(self, goal)
|
||||||
} else if let Some(kind) = self.tcx().fn_trait_kind_from_def_id(trait_def_id) {
|
} else if let Some(kind) = self.tcx().fn_trait_kind_from_def_id(trait_def_id) {
|
||||||
G::consider_builtin_fn_trait_candidates(self, goal, kind)
|
G::consider_builtin_fn_trait_candidates(self, goal, kind)
|
||||||
} else if lang_items.tuple_trait() == Some(trait_def_id) {
|
} else if lang_items.tuple_trait() == Some(trait_def_id) {
|
||||||
|
|
|
@ -370,11 +370,11 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> {
|
||||||
bug!("`Copy`/`Clone` does not have an associated type: {:?}", goal);
|
bug!("`Copy`/`Clone` does not have an associated type: {:?}", goal);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn consider_builtin_pointer_sized_candidate(
|
fn consider_builtin_pointer_like_candidate(
|
||||||
_ecx: &mut EvalCtxt<'_, 'tcx>,
|
_ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||||
goal: Goal<'tcx, Self>,
|
goal: Goal<'tcx, Self>,
|
||||||
) -> QueryResult<'tcx> {
|
) -> QueryResult<'tcx> {
|
||||||
bug!("`PointerSized` does not have an associated type: {:?}", goal);
|
bug!("`PointerLike` does not have an associated type: {:?}", goal);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn consider_builtin_fn_trait_candidates(
|
fn consider_builtin_fn_trait_candidates(
|
||||||
|
|
|
@ -131,7 +131,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn consider_builtin_pointer_sized_candidate(
|
fn consider_builtin_pointer_like_candidate(
|
||||||
ecx: &mut EvalCtxt<'_, 'tcx>,
|
ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||||
goal: Goal<'tcx, Self>,
|
goal: Goal<'tcx, Self>,
|
||||||
) -> QueryResult<'tcx> {
|
) -> QueryResult<'tcx> {
|
||||||
|
|
|
@ -94,7 +94,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
self.assemble_candidates_for_transmutability(obligation, &mut candidates);
|
self.assemble_candidates_for_transmutability(obligation, &mut candidates);
|
||||||
} else if lang_items.tuple_trait() == Some(def_id) {
|
} else if lang_items.tuple_trait() == Some(def_id) {
|
||||||
self.assemble_candidate_for_tuple(obligation, &mut candidates);
|
self.assemble_candidate_for_tuple(obligation, &mut candidates);
|
||||||
} else if lang_items.pointer_sized() == Some(def_id) {
|
} else if lang_items.pointer_like() == Some(def_id) {
|
||||||
self.assemble_candidate_for_ptr_sized(obligation, &mut candidates);
|
self.assemble_candidate_for_ptr_sized(obligation, &mut candidates);
|
||||||
} else {
|
} else {
|
||||||
if lang_items.clone_trait() == Some(def_id) {
|
if lang_items.clone_trait() == Some(def_id) {
|
||||||
|
|
|
@ -872,13 +872,14 @@ pub trait Destruct {}
|
||||||
pub trait Tuple {}
|
pub trait Tuple {}
|
||||||
|
|
||||||
/// A marker for things
|
/// A marker for things
|
||||||
#[unstable(feature = "pointer_sized_trait", issue = "none")]
|
#[unstable(feature = "pointer_like_trait", issue = "none")]
|
||||||
#[lang = "pointer_sized"]
|
#[cfg_attr(bootstrap, lang = "pointer_sized")]
|
||||||
|
#[cfg_attr(not(bootstrap), lang = "pointer_like")]
|
||||||
#[rustc_on_unimplemented(
|
#[rustc_on_unimplemented(
|
||||||
message = "`{Self}` needs to be a pointer-sized type",
|
message = "`{Self}` needs to have the same alignment and size as a pointer",
|
||||||
label = "`{Self}` needs to be a pointer-sized type"
|
label = "`{Self}` needs to be a pointer-like type"
|
||||||
)]
|
)]
|
||||||
pub trait PointerSized {}
|
pub trait PointerLike {}
|
||||||
|
|
||||||
/// Implementations of `Copy` for primitive types.
|
/// Implementations of `Copy` for primitive types.
|
||||||
///
|
///
|
||||||
|
|
|
@ -7,13 +7,13 @@ LL | #![feature(dyn_star)]
|
||||||
= note: see issue #102425 <https://github.com/rust-lang/rust/issues/102425> for more information
|
= note: see issue #102425 <https://github.com/rust-lang/rust/issues/102425> for more information
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
error[E0277]: `AlignedUsize` needs to be a pointer-sized type
|
error[E0277]: `AlignedUsize` needs to have the same alignment and size as a pointer
|
||||||
--> $DIR/align.rs:15:13
|
--> $DIR/align.rs:15:13
|
||||||
|
|
|
|
||||||
LL | let x = AlignedUsize(12) as dyn* Debug;
|
LL | let x = AlignedUsize(12) as dyn* Debug;
|
||||||
| ^^^^^^^^^^^^^^^^ `AlignedUsize` needs to be a pointer-sized type
|
| ^^^^^^^^^^^^^^^^ `AlignedUsize` needs to be a pointer-like type
|
||||||
|
|
|
|
||||||
= help: the trait `PointerSized` is not implemented for `AlignedUsize`
|
= help: the trait `PointerLike` is not implemented for `AlignedUsize`
|
||||||
|
|
||||||
error: aborting due to previous error; 1 warning emitted
|
error: aborting due to previous error; 1 warning emitted
|
||||||
|
|
||||||
|
|
|
@ -13,5 +13,5 @@ struct AlignedUsize(usize);
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = AlignedUsize(12) as dyn* Debug;
|
let x = AlignedUsize(12) as dyn* Debug;
|
||||||
//[over_aligned]~^ ERROR `AlignedUsize` needs to be a pointer-sized type
|
//[over_aligned]~^ ERROR `AlignedUsize` needs to have the same alignment and size as a pointer
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ fn dyn_debug(_: (dyn* Debug + '_)) {
|
||||||
|
|
||||||
fn polymorphic<T: Debug + ?Sized>(t: &T) {
|
fn polymorphic<T: Debug + ?Sized>(t: &T) {
|
||||||
dyn_debug(t);
|
dyn_debug(t);
|
||||||
//~^ ERROR `&T` needs to be a pointer-sized type
|
//~^ ERROR `&T` needs to have the same alignment and size as a pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
error[E0277]: `&T` needs to be a pointer-sized type
|
error[E0277]: `&T` needs to have the same alignment and size as a pointer
|
||||||
--> $DIR/check-size-at-cast-polymorphic-bad.rs:11:15
|
--> $DIR/check-size-at-cast-polymorphic-bad.rs:11:15
|
||||||
|
|
|
|
||||||
LL | dyn_debug(t);
|
LL | dyn_debug(t);
|
||||||
| ^ `&T` needs to be a pointer-sized type
|
| ^ `&T` needs to be a pointer-like type
|
||||||
|
|
|
|
||||||
= help: the trait `PointerSized` is not implemented for `&T`
|
= help: the trait `PointerLike` is not implemented for `&T`
|
||||||
help: consider introducing a `where` clause, but there might be an alternative better way to express this requirement
|
help: consider introducing a `where` clause, but there might be an alternative better way to express this requirement
|
||||||
|
|
|
|
||||||
LL | fn polymorphic<T: Debug + ?Sized>(t: &T) where &T: PointerSized {
|
LL | fn polymorphic<T: Debug + ?Sized>(t: &T) where &T: PointerLike {
|
||||||
| ++++++++++++++++++++++
|
| +++++++++++++++++++++
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,6 @@ use std::fmt::Debug;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let i = [1, 2, 3, 4] as dyn* Debug;
|
let i = [1, 2, 3, 4] as dyn* Debug;
|
||||||
//~^ ERROR `[i32; 4]` needs to be a pointer-sized type
|
//~^ ERROR `[i32; 4]` needs to have the same alignment and size as a pointer
|
||||||
dbg!(i);
|
dbg!(i);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
error[E0277]: `[i32; 4]` needs to be a pointer-sized type
|
error[E0277]: `[i32; 4]` needs to have the same alignment and size as a pointer
|
||||||
--> $DIR/check-size-at-cast.rs:7:13
|
--> $DIR/check-size-at-cast.rs:7:13
|
||||||
|
|
|
|
||||||
LL | let i = [1, 2, 3, 4] as dyn* Debug;
|
LL | let i = [1, 2, 3, 4] as dyn* Debug;
|
||||||
| ^^^^^^^^^^^^ `[i32; 4]` needs to be a pointer-sized type
|
| ^^^^^^^^^^^^ `[i32; 4]` needs to be a pointer-like type
|
||||||
|
|
|
|
||||||
= help: the trait `PointerSized` is not implemented for `[i32; 4]`
|
= help: the trait `PointerLike` is not implemented for `[i32; 4]`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -7,13 +7,13 @@ LL | #![feature(dyn_star, trait_upcasting)]
|
||||||
= note: see issue #102425 <https://github.com/rust-lang/rust/issues/102425> for more information
|
= note: see issue #102425 <https://github.com/rust-lang/rust/issues/102425> for more information
|
||||||
= note: `#[warn(incomplete_features)]` on by default
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
error[E0277]: `dyn* Foo` needs to be a pointer-sized type
|
error[E0277]: `dyn* Foo` needs to have the same alignment and size as a pointer
|
||||||
--> $DIR/upcast.rs:30:23
|
--> $DIR/upcast.rs:30:23
|
||||||
|
|
|
|
||||||
LL | let w: dyn* Bar = w;
|
LL | let w: dyn* Bar = w;
|
||||||
| ^ `dyn* Foo` needs to be a pointer-sized type
|
| ^ `dyn* Foo` needs to be a pointer-like type
|
||||||
|
|
|
|
||||||
= help: the trait `PointerSized` is not implemented for `dyn* Foo`
|
= help: the trait `PointerLike` is not implemented for `dyn* Foo`
|
||||||
|
|
||||||
error: aborting due to previous error; 1 warning emitted
|
error: aborting due to previous error; 1 warning emitted
|
||||||
|
|
||||||
|
|
14
tests/ui/traits/new-solver/pointer-like.rs
Normal file
14
tests/ui/traits/new-solver/pointer-like.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// compile-flags: -Ztrait-solver=next
|
||||||
|
|
||||||
|
#![feature(pointer_like_trait)]
|
||||||
|
|
||||||
|
use std::marker::PointerLike;
|
||||||
|
|
||||||
|
fn require_(_: impl PointerLike) {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
require_(1usize);
|
||||||
|
require_(1u16);
|
||||||
|
//~^ ERROR `u16` needs to have the same alignment and size as a pointer
|
||||||
|
require_(&1i16);
|
||||||
|
}
|
24
tests/ui/traits/new-solver/pointer-like.stderr
Normal file
24
tests/ui/traits/new-solver/pointer-like.stderr
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
error[E0277]: `u16` needs to have the same alignment and size as a pointer
|
||||||
|
--> $DIR/pointer-like.rs:11:14
|
||||||
|
|
|
||||||
|
LL | require_(1u16);
|
||||||
|
| -------- ^^^^ the trait `PointerLike` is not implemented for `u16`
|
||||||
|
| |
|
||||||
|
| required by a bound introduced by this call
|
||||||
|
|
|
||||||
|
= note: the trait bound `u16: PointerLike` is not satisfied
|
||||||
|
note: required by a bound in `require_`
|
||||||
|
--> $DIR/pointer-like.rs:7:21
|
||||||
|
|
|
||||||
|
LL | fn require_(_: impl PointerLike) {}
|
||||||
|
| ^^^^^^^^^^^ required by this bound in `require_`
|
||||||
|
help: consider borrowing here
|
||||||
|
|
|
||||||
|
LL | require_(&1u16);
|
||||||
|
| +
|
||||||
|
LL | require_(&mut 1u16);
|
||||||
|
| ++++
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
|
@ -1,12 +0,0 @@
|
||||||
#![feature(pointer_sized_trait)]
|
|
||||||
|
|
||||||
use std::marker::PointerSized;
|
|
||||||
|
|
||||||
fn require_pointer_sized(_: impl PointerSized) {}
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
require_pointer_sized(1usize);
|
|
||||||
require_pointer_sized(1u16);
|
|
||||||
//~^ ERROR `u16` needs to be a pointer-sized type
|
|
||||||
require_pointer_sized(&1i16);
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
error[E0277]: `u16` needs to be a pointer-sized type
|
|
||||||
--> $DIR/pointer-sized.rs:9:27
|
|
||||||
|
|
|
||||||
LL | require_pointer_sized(1u16);
|
|
||||||
| --------------------- ^^^^ the trait `PointerSized` is not implemented for `u16`
|
|
||||||
| |
|
|
||||||
| required by a bound introduced by this call
|
|
||||||
|
|
|
||||||
= note: the trait bound `u16: PointerSized` is not satisfied
|
|
||||||
note: required by a bound in `require_pointer_sized`
|
|
||||||
--> $DIR/pointer-sized.rs:5:34
|
|
||||||
|
|
|
||||||
LL | fn require_pointer_sized(_: impl PointerSized) {}
|
|
||||||
| ^^^^^^^^^^^^ required by this bound in `require_pointer_sized`
|
|
||||||
help: consider borrowing here
|
|
||||||
|
|
|
||||||
LL | require_pointer_sized(&1u16);
|
|
||||||
| +
|
|
||||||
LL | require_pointer_sized(&mut 1u16);
|
|
||||||
| ++++
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0277`.
|
|
Loading…
Add table
Add a link
Reference in a new issue