mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
trait_sel: MetaSized always holds temporarily
As a temporary measure while a proper fix for `tests/ui/sized-hierarchy/incomplete-inference-issue-143992.rs` is implemented, make `MetaSized` obligations always hold. In effect, temporarily reverting the `sized_hierarchy` feature. This is a small change that can be backported.
This commit is contained in:
@@ -378,6 +378,13 @@ pub fn sizedness_fast_path<'tcx>(tcx: TyCtxt<'tcx>, predicate: ty::Predicate<'tc
|
||||
_ => return false,
|
||||
};
|
||||
|
||||
// FIXME(sized_hierarchy): this temporarily reverts the `sized_hierarchy` feature
|
||||
// while a proper fix for `tests/ui/sized-hierarchy/incomplete-inference-issue-143992.rs`
|
||||
// is pending a proper fix
|
||||
if !tcx.features().sized_hierarchy() && matches!(sizedness, SizedTraitKind::MetaSized) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if trait_pred.self_ty().has_trivial_sizedness(tcx, sizedness) {
|
||||
debug!("fast path -- trivial sizedness");
|
||||
return true;
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
}
|
||||
|
||||
const _SIZE: usize = unsafe { size_of_val(&4 as *const i32 as *const Opaque) };
|
||||
//~^ ERROR the size for values of type `Opaque` cannot be known
|
||||
//~^ ERROR `extern type` does not have known layout
|
||||
const _ALIGN: usize = unsafe { align_of_val(&4 as *const i32 as *const Opaque) };
|
||||
//~^ ERROR the size for values of type `Opaque` cannot be known
|
||||
//~^ ERROR `extern type` does not have known layout
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -1,39 +1,15 @@
|
||||
error[E0277]: the size for values of type `Opaque` cannot be known
|
||||
--> $DIR/const-size_of_val-align_of_val-extern-type.rs:10:43
|
||||
error[E0080]: `extern type` does not have known layout
|
||||
--> $DIR/const-size_of_val-align_of_val-extern-type.rs:10:31
|
||||
|
|
||||
LL | const _SIZE: usize = unsafe { size_of_val(&4 as *const i32 as *const Opaque) };
|
||||
| ----------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `MetaSized` is not implemented for `Opaque`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: the trait bound `Opaque: MetaSized` is not satisfied
|
||||
note: required by a bound in `std::intrinsics::size_of_val`
|
||||
--> $SRC_DIR/core/src/intrinsics/mod.rs:LL:COL
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | const _SIZE: usize = unsafe { size_of_val(&(&4 as *const i32 as *const Opaque)) };
|
||||
| ++ +
|
||||
LL | const _SIZE: usize = unsafe { size_of_val(&mut (&4 as *const i32 as *const Opaque)) };
|
||||
| ++++++ +
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_SIZE` failed here
|
||||
|
||||
error[E0277]: the size for values of type `Opaque` cannot be known
|
||||
--> $DIR/const-size_of_val-align_of_val-extern-type.rs:12:45
|
||||
error[E0080]: `extern type` does not have known layout
|
||||
--> $DIR/const-size_of_val-align_of_val-extern-type.rs:12:32
|
||||
|
|
||||
LL | const _ALIGN: usize = unsafe { align_of_val(&4 as *const i32 as *const Opaque) };
|
||||
| ------------ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `MetaSized` is not implemented for `Opaque`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: the trait bound `Opaque: MetaSized` is not satisfied
|
||||
note: required by a bound in `std::intrinsics::align_of_val`
|
||||
--> $SRC_DIR/core/src/intrinsics/mod.rs:LL:COL
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | const _ALIGN: usize = unsafe { align_of_val(&(&4 as *const i32 as *const Opaque)) };
|
||||
| ++ +
|
||||
LL | const _ALIGN: usize = unsafe { align_of_val(&mut (&4 as *const i32 as *const Opaque)) };
|
||||
| ++++++ +
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_ALIGN` failed here
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
||||
+1
-3
@@ -1,4 +1,4 @@
|
||||
//@ check-fail
|
||||
//@ check-pass
|
||||
#![feature(extern_types)]
|
||||
|
||||
use std::mem::{align_of_val, size_of_val};
|
||||
@@ -11,7 +11,5 @@ fn main() {
|
||||
let x: &A = unsafe { &*(1usize as *const A) };
|
||||
|
||||
size_of_val(x);
|
||||
//~^ ERROR the size for values of type `A` cannot be known
|
||||
align_of_val(x);
|
||||
//~^ ERROR the size for values of type `A` cannot be known
|
||||
}
|
||||
|
||||
-39
@@ -1,39 +0,0 @@
|
||||
error[E0277]: the size for values of type `A` cannot be known
|
||||
--> $DIR/extern-types-size_of_val.rs:13:17
|
||||
|
|
||||
LL | size_of_val(x);
|
||||
| ----------- ^ the trait `MetaSized` is not implemented for `A`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: the trait bound `A: MetaSized` is not satisfied
|
||||
note: required by a bound in `std::mem::size_of_val`
|
||||
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | size_of_val(&x);
|
||||
| +
|
||||
LL | size_of_val(&mut x);
|
||||
| ++++
|
||||
|
||||
error[E0277]: the size for values of type `A` cannot be known
|
||||
--> $DIR/extern-types-size_of_val.rs:15:18
|
||||
|
|
||||
LL | align_of_val(x);
|
||||
| ------------ ^ the trait `MetaSized` is not implemented for `A`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: the trait bound `A: MetaSized` is not satisfied
|
||||
note: required by a bound in `std::mem::align_of_val`
|
||||
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | align_of_val(&x);
|
||||
| +
|
||||
LL | align_of_val(&mut x);
|
||||
| ++++
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
-2
@@ -27,9 +27,7 @@ fn main() {
|
||||
|
||||
assert_sized::<Bar<A>>();
|
||||
//~^ ERROR the size for values of type
|
||||
//~| ERROR the size for values of type
|
||||
|
||||
assert_sized::<Bar<Bar<A>>>();
|
||||
//~^ ERROR the size for values of type
|
||||
//~| ERROR the size for values of type
|
||||
}
|
||||
|
||||
+2
-28
@@ -59,21 +59,8 @@ help: consider relaxing the implicit `Sized` restriction
|
||||
LL | fn assert_sized<T: ?Sized>() {}
|
||||
| ++++++++
|
||||
|
||||
error[E0277]: the size for values of type `A` cannot be known
|
||||
--> $DIR/extern-types-unsized.rs:28:20
|
||||
|
|
||||
LL | assert_sized::<Bar<A>>();
|
||||
| ^^^^^^ doesn't have a known size
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `A`
|
||||
note: required by a bound in `Bar`
|
||||
--> $DIR/extern-types-unsized.rs:14:12
|
||||
|
|
||||
LL | struct Bar<T: ?Sized> {
|
||||
| ^ required by this bound in `Bar`
|
||||
|
||||
error[E0277]: the size for values of type `A` cannot be known at compilation time
|
||||
--> $DIR/extern-types-unsized.rs:32:20
|
||||
--> $DIR/extern-types-unsized.rs:31:20
|
||||
|
|
||||
LL | assert_sized::<Bar<Bar<A>>>();
|
||||
| ^^^^^^^^^^^ doesn't have a size known at compile-time
|
||||
@@ -94,19 +81,6 @@ help: consider relaxing the implicit `Sized` restriction
|
||||
LL | fn assert_sized<T: ?Sized>() {}
|
||||
| ++++++++
|
||||
|
||||
error[E0277]: the size for values of type `A` cannot be known
|
||||
--> $DIR/extern-types-unsized.rs:32:20
|
||||
|
|
||||
LL | assert_sized::<Bar<Bar<A>>>();
|
||||
| ^^^^^^^^^^^ doesn't have a known size
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `A`
|
||||
note: required by a bound in `Bar`
|
||||
--> $DIR/extern-types-unsized.rs:14:12
|
||||
|
|
||||
LL | struct Bar<T: ?Sized> {
|
||||
| ^ required by this bound in `Bar`
|
||||
|
||||
error: aborting due to 6 previous errors
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
||||
-4
@@ -7,14 +7,10 @@
|
||||
}
|
||||
|
||||
unsafe fn make_device() -> Box<Device> {
|
||||
//~^ ERROR the size for values of type `Device` cannot be known
|
||||
Box::from_raw(0 as *mut _)
|
||||
//~^ ERROR the size for values of type `Device` cannot be known
|
||||
//~| ERROR the size for values of type `Device` cannot be known
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let d: Device = unsafe { *make_device() };
|
||||
//~^ ERROR the size for values of type `Device` cannot be known
|
||||
//~| ERROR the size for values of type `Device` cannot be known
|
||||
}
|
||||
|
||||
+2
-50
@@ -1,43 +1,5 @@
|
||||
error[E0277]: the size for values of type `Device` cannot be known
|
||||
--> $DIR/unsized-extern-derefmove.rs:9:28
|
||||
|
|
||||
LL | unsafe fn make_device() -> Box<Device> {
|
||||
| ^^^^^^^^^^^ doesn't have a known size
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `Device`
|
||||
note: required by a bound in `Box`
|
||||
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
||||
|
||||
error[E0277]: the size for values of type `Device` cannot be known
|
||||
--> $DIR/unsized-extern-derefmove.rs:11:19
|
||||
|
|
||||
LL | Box::from_raw(0 as *mut _)
|
||||
| ------------- ^^^^^^^^^^^ the trait `MetaSized` is not implemented for `Device`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: the trait bound `Device: MetaSized` is not satisfied
|
||||
note: required by a bound in `Box::<T>::from_raw`
|
||||
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | Box::from_raw(&(0 as *mut _))
|
||||
| ++ +
|
||||
LL | Box::from_raw(&mut (0 as *mut _))
|
||||
| ++++++ +
|
||||
|
||||
error[E0277]: the size for values of type `Device` cannot be known
|
||||
--> $DIR/unsized-extern-derefmove.rs:11:5
|
||||
|
|
||||
LL | Box::from_raw(0 as *mut _)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a known size
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `Device`
|
||||
note: required by a bound in `Box`
|
||||
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
||||
|
||||
error[E0277]: the size for values of type `Device` cannot be known at compilation time
|
||||
--> $DIR/unsized-extern-derefmove.rs:17:9
|
||||
--> $DIR/unsized-extern-derefmove.rs:14:9
|
||||
|
|
||||
LL | let d: Device = unsafe { *make_device() };
|
||||
| ^ doesn't have a size known at compile-time
|
||||
@@ -49,16 +11,6 @@ help: consider borrowing here
|
||||
LL | let d: &Device = unsafe { *make_device() };
|
||||
| +
|
||||
|
||||
error[E0277]: the size for values of type `Device` cannot be known
|
||||
--> $DIR/unsized-extern-derefmove.rs:17:31
|
||||
|
|
||||
LL | let d: Device = unsafe { *make_device() };
|
||||
| ^^^^^^^^^^^^^ doesn't have a known size
|
||||
|
|
||||
= help: the trait `MetaSized` is not implemented for `Device`
|
||||
note: required by a bound in `Box`
|
||||
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
||||
@@ -17,4 +17,3 @@ impl<C: ?Sized> A for u8 { //~ ERROR: the type parameter `C` is not constrained
|
||||
#[rustc_layout(debug)]
|
||||
struct S([u8; <u8 as A>::B]);
|
||||
//~^ ERROR: the type has an unknown layout
|
||||
//~| ERROR: type annotations needed
|
||||
|
||||
@@ -4,19 +4,12 @@ error[E0207]: the type parameter `C` is not constrained by the impl trait, self
|
||||
LL | impl<C: ?Sized> A for u8 {
|
||||
| ^ unconstrained type parameter
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/unconstrained-param-ice-137308.rs:18:16
|
||||
|
|
||||
LL | struct S([u8; <u8 as A>::B]);
|
||||
| ^^ cannot infer type for type parameter `C`
|
||||
|
||||
error: the type has an unknown layout
|
||||
--> $DIR/unconstrained-param-ice-137308.rs:18:1
|
||||
|
|
||||
LL | struct S([u8; <u8 as A>::B]);
|
||||
| ^^^^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0207, E0282.
|
||||
For more information about an error, try `rustc --explain E0207`.
|
||||
For more information about this error, try `rustc --explain E0207`.
|
||||
|
||||
@@ -5,7 +5,7 @@ trait A {
|
||||
type X: ?Sized;
|
||||
}
|
||||
|
||||
fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>) //~ ERROR
|
||||
fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>)
|
||||
where
|
||||
for<'b> &'b T: A,
|
||||
<&'static T as A>::X: Sized
|
||||
|
||||
@@ -1,18 +1,3 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-50716.rs:8:27
|
||||
|
|
||||
LL | fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>)
|
||||
| ^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
|
||||
|
|
||||
= note: expected trait `<<&'a T as A>::X as MetaSized>`
|
||||
found trait `<<&'static T as A>::X as MetaSized>`
|
||||
note: the lifetime `'a` as defined here...
|
||||
--> $DIR/issue-50716.rs:8:8
|
||||
|
|
||||
LL | fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>)
|
||||
| ^^
|
||||
= note: ...does not necessarily outlive the static lifetime
|
||||
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/issue-50716.rs:13:14
|
||||
|
|
||||
@@ -22,6 +7,5 @@ LL | fn foo<'a, T: 'static>(s: Box<<&'a T as A>::X>)
|
||||
LL | let _x = *s;
|
||||
| ^^ proving this value is `Sized` requires that `'a` must outlive `'static`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/incomplete-inference-issue-143992.rs:27:28
|
||||
|
|
||||
LL | let _x = T::Assoc::new(());
|
||||
| ------------- ^^ expected `[u32; 1]`, found `()`
|
||||
| |
|
||||
| arguments to this function are incorrect
|
||||
|
|
||||
note: associated function defined here
|
||||
--> $DIR/incomplete-inference-issue-143992.rs:18:8
|
||||
|
|
||||
LL | fn new(r: R) -> R {
|
||||
| ^^^ ----
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
@@ -0,0 +1,29 @@
|
||||
//@ compile-flags: --crate-type=lib
|
||||
//@ revisions: current next
|
||||
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||
//@[current] check-pass
|
||||
//@[next] compile-flags: -Znext-solver
|
||||
//@[next] check-fail
|
||||
|
||||
// Test that we avoid incomplete inference when normalizing. Without this,
|
||||
// `Trait`'s implicit `MetaSized` supertrait requires proving `T::Assoc<_>: MetaSized`
|
||||
// before checking the `new` arguments, resulting in eagerly constraining the inference
|
||||
// var to `u32`. This is undesirable and would breaking code.
|
||||
|
||||
pub trait Trait {
|
||||
type Assoc<G>: OtherTrait<G>;
|
||||
}
|
||||
|
||||
pub trait OtherTrait<R> {
|
||||
fn new(r: R) -> R {
|
||||
r
|
||||
}
|
||||
}
|
||||
|
||||
pub fn function<T: Trait>()
|
||||
where
|
||||
T::Assoc<[u32; 1]>: Clone,
|
||||
{
|
||||
let _x = T::Assoc::new(());
|
||||
//[next]~^ ERROR mismatched types
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
error[E0275]: overflow evaluating the requirement `Element: MetaSized`
|
||||
--> $DIR/overflow.rs:16:16
|
||||
|
|
||||
LL | struct Element(<Box<Box<Element>> as ParseTokens>::Output);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: required for `Box<Element>` to implement `ParseTokens`
|
||||
--> $DIR/overflow.rs:12:31
|
||||
|
|
||||
LL | impl<T: ParseTokens + ?Sized> ParseTokens for Box<T> {
|
||||
| - ^^^^^^^^^^^ ^^^^^^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
= note: 1 redundant requirement hidden
|
||||
= note: required for `Box<Box<Element>>` to implement `ParseTokens`
|
||||
|
||||
error[E0275]: overflow evaluating the requirement `Box<Element>: ParseTokens`
|
||||
--> $DIR/overflow.rs:18:22
|
||||
|
|
||||
LL | impl ParseTokens for Element {
|
||||
| ^^^^^^^
|
||||
|
|
||||
note: required for `Box<Box<Element>>` to implement `ParseTokens`
|
||||
--> $DIR/overflow.rs:12:31
|
||||
|
|
||||
LL | impl<T: ParseTokens + ?Sized> ParseTokens for Box<T> {
|
||||
| ----------- ^^^^^^^^^^^ ^^^^^^
|
||||
| |
|
||||
| unsatisfied trait bound introduced here
|
||||
note: required because it appears within the type `Element`
|
||||
--> $DIR/overflow.rs:16:8
|
||||
|
|
||||
LL | struct Element(<Box<Box<Element>> as ParseTokens>::Output);
|
||||
| ^^^^^^^
|
||||
note: required by a bound in `ParseTokens`
|
||||
--> $DIR/overflow.rs:9:1
|
||||
|
|
||||
LL | / trait ParseTokens {
|
||||
LL | | type Output;
|
||||
LL | | }
|
||||
| |_^ required by this bound in `ParseTokens`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0275`.
|
||||
@@ -1,9 +1,13 @@
|
||||
//@ compile-flags: --crate-type=lib
|
||||
//@ revisions: current next
|
||||
//@ ignore-compare-mode-next-solver (explicit revisions)
|
||||
//@[current] check-pass
|
||||
//@[next] check-pass
|
||||
//@[next] compile-flags: -Znext-solver
|
||||
|
||||
// FIXME(sized_hierarchy): this is expected to fail in the old solver when there
|
||||
// isn't a temporary revert of the `sized_hierarchy` feature
|
||||
|
||||
use std::marker::PhantomData;
|
||||
|
||||
trait ParseTokens {
|
||||
@@ -14,8 +18,6 @@ impl<T: ParseTokens + ?Sized> ParseTokens for Box<T> {
|
||||
}
|
||||
|
||||
struct Element(<Box<Box<Element>> as ParseTokens>::Output);
|
||||
//[current]~^ ERROR overflow evaluating
|
||||
impl ParseTokens for Element {
|
||||
//[current]~^ ERROR overflow evaluating
|
||||
type Output = ();
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ fn call() {}
|
||||
|
||||
fn test() -> impl Sized {
|
||||
<() as Callable>::call()
|
||||
//~^ ERROR: type annotations needed
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
||||
@@ -4,13 +4,6 @@ error[E0207]: the type parameter `V` is not constrained by the impl trait, self
|
||||
LL | impl<V: ?Sized> Callable for () {
|
||||
| ^ unconstrained type parameter
|
||||
|
||||
error[E0282]: type annotations needed
|
||||
--> $DIR/resolve-impl-before-constrain-check.rs:17:6
|
||||
|
|
||||
LL | <() as Callable>::call()
|
||||
| ^^ cannot infer type for type parameter `V`
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0207, E0282.
|
||||
For more information about an error, try `rustc --explain E0207`.
|
||||
For more information about this error, try `rustc --explain E0207`.
|
||||
|
||||
Reference in New Issue
Block a user