mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
Fix object safety checks for new RPITITs
This commit is contained in:
parent
fa421ec454
commit
8b9344acc3
@ -13,7 +13,6 @@ use super::{elaborate_predicates, elaborate_trait_ref};
|
|||||||
use crate::infer::TyCtxtInferExt;
|
use crate::infer::TyCtxtInferExt;
|
||||||
use crate::traits::query::evaluate_obligation::InferCtxtExt;
|
use crate::traits::query::evaluate_obligation::InferCtxtExt;
|
||||||
use crate::traits::{self, Obligation, ObligationCause};
|
use crate::traits::{self, Obligation, ObligationCause};
|
||||||
use hir::def::DefKind;
|
|
||||||
use rustc_errors::{DelayDm, FatalError, MultiSpan};
|
use rustc_errors::{DelayDm, FatalError, MultiSpan};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
@ -855,7 +854,7 @@ fn contains_illegal_self_type_reference<'tcx, T: TypeVisitable<TyCtxt<'tcx>>>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ty::Alias(ty::Projection, ref data)
|
ty::Alias(ty::Projection, ref data)
|
||||||
if self.tcx.def_kind(data.def_id) == DefKind::ImplTraitPlaceholder =>
|
if self.tcx.is_impl_trait_in_trait(data.def_id) =>
|
||||||
{
|
{
|
||||||
// We'll deny these later in their own pass
|
// We'll deny these later in their own pass
|
||||||
ControlFlow::Continue(())
|
ControlFlow::Continue(())
|
||||||
@ -922,7 +921,7 @@ pub fn contains_illegal_impl_trait_in_trait<'tcx>(
|
|||||||
ty.skip_binder().walk().find_map(|arg| {
|
ty.skip_binder().walk().find_map(|arg| {
|
||||||
if let ty::GenericArgKind::Type(ty) = arg.unpack()
|
if let ty::GenericArgKind::Type(ty) = arg.unpack()
|
||||||
&& let ty::Alias(ty::Projection, proj) = ty.kind()
|
&& let ty::Alias(ty::Projection, proj) = ty.kind()
|
||||||
&& tcx.def_kind(proj.def_id) == DefKind::ImplTraitPlaceholder
|
&& tcx.is_impl_trait_in_trait(proj.def_id)
|
||||||
{
|
{
|
||||||
Some(MethodViolationCode::ReferencesImplTraitInTrait(tcx.def_span(proj.def_id)))
|
Some(MethodViolationCode::ReferencesImplTraitInTrait(tcx.def_span(proj.def_id)))
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,11 +1,26 @@
|
|||||||
error[E0038]: the trait `Foo` cannot be made into an object
|
error[E0038]: the trait `Foo` cannot be made into an object
|
||||||
--> $DIR/object-safety.rs:17:33
|
--> $DIR/object-safety.rs:20:33
|
||||||
|
|
|
|
||||||
LL | let i = Box::new(42_u32) as Box<dyn Foo>;
|
LL | let i = Box::new(42_u32) as Box<dyn Foo>;
|
||||||
| ^^^^^^^^^^^^ `Foo` cannot be made into an object
|
| ^^^^^^^^^^^^ `Foo` cannot be made into an object
|
||||||
|
|
|
|
||||||
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||||
--> $DIR/object-safety.rs:7:22
|
--> $DIR/object-safety.rs:10:22
|
||||||
|
|
|
||||||
|
LL | trait Foo {
|
||||||
|
| --- this trait cannot be made into an object...
|
||||||
|
LL | fn baz(&self) -> impl Debug;
|
||||||
|
| ^^^^^^^^^^ ...because method `baz` references an `impl Trait` type in its return type
|
||||||
|
= help: consider moving `baz` to another trait
|
||||||
|
|
||||||
|
error[E0038]: the trait `Foo` cannot be made into an object
|
||||||
|
--> $DIR/object-safety.rs:23:13
|
||||||
|
|
|
||||||
|
LL | let s = i.baz();
|
||||||
|
| ^^^^^^^ `Foo` cannot be made into an object
|
||||||
|
|
|
||||||
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||||
|
--> $DIR/object-safety.rs:10:22
|
||||||
|
|
|
|
||||||
LL | trait Foo {
|
LL | trait Foo {
|
||||||
| --- this trait cannot be made into an object...
|
| --- this trait cannot be made into an object...
|
||||||
@ -16,26 +31,11 @@ LL | fn baz(&self) -> impl Debug;
|
|||||||
error[E0038]: the trait `Foo` cannot be made into an object
|
error[E0038]: the trait `Foo` cannot be made into an object
|
||||||
--> $DIR/object-safety.rs:20:13
|
--> $DIR/object-safety.rs:20:13
|
||||||
|
|
|
|
||||||
LL | let s = i.baz();
|
|
||||||
| ^^^^^^^ `Foo` cannot be made into an object
|
|
||||||
|
|
|
||||||
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
|
||||||
--> $DIR/object-safety.rs:7:22
|
|
||||||
|
|
|
||||||
LL | trait Foo {
|
|
||||||
| --- this trait cannot be made into an object...
|
|
||||||
LL | fn baz(&self) -> impl Debug;
|
|
||||||
| ^^^^^^^^^^ ...because method `baz` references an `impl Trait` type in its return type
|
|
||||||
= help: consider moving `baz` to another trait
|
|
||||||
|
|
||||||
error[E0038]: the trait `Foo` cannot be made into an object
|
|
||||||
--> $DIR/object-safety.rs:17:13
|
|
||||||
|
|
|
||||||
LL | let i = Box::new(42_u32) as Box<dyn Foo>;
|
LL | let i = Box::new(42_u32) as Box<dyn Foo>;
|
||||||
| ^^^^^^^^^^^^^^^^ `Foo` cannot be made into an object
|
| ^^^^^^^^^^^^^^^^ `Foo` cannot be made into an object
|
||||||
|
|
|
|
||||||
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||||
--> $DIR/object-safety.rs:7:22
|
--> $DIR/object-safety.rs:10:22
|
||||||
|
|
|
|
||||||
LL | trait Foo {
|
LL | trait Foo {
|
||||||
| --- this trait cannot be made into an object...
|
| --- this trait cannot be made into an object...
|
50
tests/ui/impl-trait/in-trait/object-safety.next.stderr
Normal file
50
tests/ui/impl-trait/in-trait/object-safety.next.stderr
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
error[E0038]: the trait `Foo` cannot be made into an object
|
||||||
|
--> $DIR/object-safety.rs:20:33
|
||||||
|
|
|
||||||
|
LL | let i = Box::new(42_u32) as Box<dyn Foo>;
|
||||||
|
| ^^^^^^^^^^^^ `Foo` cannot be made into an object
|
||||||
|
|
|
||||||
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||||
|
--> $DIR/object-safety.rs:10:22
|
||||||
|
|
|
||||||
|
LL | trait Foo {
|
||||||
|
| --- this trait cannot be made into an object...
|
||||||
|
LL | fn baz(&self) -> impl Debug;
|
||||||
|
| ^^^^^^^^^^ ...because method `baz` references an `impl Trait` type in its return type
|
||||||
|
= help: consider moving `baz` to another trait
|
||||||
|
|
||||||
|
error[E0038]: the trait `Foo` cannot be made into an object
|
||||||
|
--> $DIR/object-safety.rs:23:13
|
||||||
|
|
|
||||||
|
LL | let s = i.baz();
|
||||||
|
| ^^^^^^^ `Foo` cannot be made into an object
|
||||||
|
|
|
||||||
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||||
|
--> $DIR/object-safety.rs:10:22
|
||||||
|
|
|
||||||
|
LL | trait Foo {
|
||||||
|
| --- this trait cannot be made into an object...
|
||||||
|
LL | fn baz(&self) -> impl Debug;
|
||||||
|
| ^^^^^^^^^^ ...because method `baz` references an `impl Trait` type in its return type
|
||||||
|
= help: consider moving `baz` to another trait
|
||||||
|
|
||||||
|
error[E0038]: the trait `Foo` cannot be made into an object
|
||||||
|
--> $DIR/object-safety.rs:20:13
|
||||||
|
|
|
||||||
|
LL | let i = Box::new(42_u32) as Box<dyn Foo>;
|
||||||
|
| ^^^^^^^^^^^^^^^^ `Foo` cannot be made into an object
|
||||||
|
|
|
||||||
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||||
|
--> $DIR/object-safety.rs:10:22
|
||||||
|
|
|
||||||
|
LL | trait Foo {
|
||||||
|
| --- this trait cannot be made into an object...
|
||||||
|
LL | fn baz(&self) -> impl Debug;
|
||||||
|
| ^^^^^^^^^^ ...because method `baz` references an `impl Trait` type in its return type
|
||||||
|
= help: consider moving `baz` to another trait
|
||||||
|
= note: required for `Box<u32>` to implement `CoerceUnsized<Box<dyn Foo>>`
|
||||||
|
= note: required by cast to type `Box<dyn Foo>`
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0038`.
|
@ -1,3 +1,6 @@
|
|||||||
|
// [next] compile-flags: -Zlower-impl-trait-in-trait-to-assoc-ty
|
||||||
|
// revisions: current next
|
||||||
|
|
||||||
#![feature(return_position_impl_trait_in_trait)]
|
#![feature(return_position_impl_trait_in_trait)]
|
||||||
#![allow(incomplete_features)]
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user