diff --git a/compiler/rustc_trait_selection/src/traits/select/mod.rs b/compiler/rustc_trait_selection/src/traits/select/mod.rs index a4499d438c1b5..bbcc6e1eebdc8 100644 --- a/compiler/rustc_trait_selection/src/traits/select/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/select/mod.rs @@ -2116,9 +2116,7 @@ impl<'tcx> SelectionContext<'_, 'tcx> { ty::Str | ty::Slice(_) | ty::Dynamic(..) | ty::Foreign(..) => None, - ty::Tuple(tys) => Where( - obligation.predicate.rebind(tys.last().map_or_else(Vec::new, |&last| vec![last])), - ), + ty::Tuple(tys) => Where(obligation.predicate.rebind(tys.to_vec())), ty::Adt(def, args) => { let sized_crit = def.sized_constraint(self.tcx()); diff --git a/tests/ui/dst/dst-bad-deep-2.rs b/tests/ui/dst/dst-bad-deep-2.rs index e587399135d32..85275aecc61f3 100644 --- a/tests/ui/dst/dst-bad-deep-2.rs +++ b/tests/ui/dst/dst-bad-deep-2.rs @@ -9,5 +9,5 @@ pub fn main() { let f: ([isize; 3],) = ([5, 6, 7],); let g: &([isize],) = &f; let h: &(([isize],),) = &(*g,); - //~^ ERROR the size for values of type + //~^ ERROR the size for values of type `[isize]` cannot be known at compilation time } diff --git a/tests/ui/layout/issue-84108.rs b/tests/ui/layout/issue-84108.rs index 44d6ac8db72f0..425da65b9905a 100644 --- a/tests/ui/layout/issue-84108.rs +++ b/tests/ui/layout/issue-84108.rs @@ -11,4 +11,5 @@ const BAR: (&Path, [u8], usize) = ("hello", [], 42); static BAZ: ([u8], usize) = ([], 0); //~^ ERROR the size for values of type `[u8]` cannot be known at compilation time +//~| ERROR the size for values of type `[u8]` cannot be known at compilation time //~| ERROR mismatched types diff --git a/tests/ui/layout/issue-84108.stderr b/tests/ui/layout/issue-84108.stderr index 58bddb069fc7d..6889f16664784 100644 --- a/tests/ui/layout/issue-84108.stderr +++ b/tests/ui/layout/issue-84108.stderr @@ -29,6 +29,16 @@ LL | static BAZ: ([u8], usize) = ([], 0); = help: the trait `Sized` is not implemented for `[u8]` = note: only the last element of a tuple may have a dynamically sized type +error[E0277]: the size for values of type `[u8]` cannot be known at compilation time + --> $DIR/issue-84108.rs:12:29 + | +LL | static BAZ: ([u8], usize) = ([], 0); + | ^^^^^^^ doesn't have a size known at compile-time + | + = help: within `([u8], usize)`, the trait `Sized` is not implemented for `[u8]`, which is required by `([u8], usize): Sized` + = note: required because it appears within the type `([u8], usize)` + = note: constant expressions must have a statically known size + error[E0308]: mismatched types --> $DIR/issue-84108.rs:12:30 | @@ -38,7 +48,7 @@ LL | static BAZ: ([u8], usize) = ([], 0); = note: expected slice `[u8]` found array `[_; 0]` -error: aborting due to 4 previous errors +error: aborting due to 5 previous errors Some errors have detailed explanations: E0277, E0308, E0412. For more information about an error, try `rustc --explain E0277`. diff --git a/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.rs b/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.rs new file mode 100644 index 0000000000000..c3a2ab82adc6a --- /dev/null +++ b/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.rs @@ -0,0 +1,16 @@ +// Regression test for #121443 +// Checks that no ICE occurs upon encountering +// a tuple with unsized element that is not +// the last element + +type Fn = dyn FnOnce() -> u8; + +const TEST: Fn = some_fn; +//~^ ERROR cannot find value `some_fn` in this scope +//~| ERROR the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time +//~| ERROR the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time +const TEST2: (Fn, u8) = (TEST, 0); +//~^ ERROR the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time +//~| ERROR the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time + +fn main() {} diff --git a/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.stderr b/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.stderr new file mode 100644 index 0000000000000..4cd30c8a5d421 --- /dev/null +++ b/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.stderr @@ -0,0 +1,46 @@ +error[E0425]: cannot find value `some_fn` in this scope + --> $DIR/ice-unsized-tuple-const-issue-121443.rs:8:18 + | +LL | const TEST: Fn = some_fn; + | ^^^^^^^ not found in this scope + +error[E0277]: the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time + --> $DIR/ice-unsized-tuple-const-issue-121443.rs:8:13 + | +LL | const TEST: Fn = some_fn; + | ^^ doesn't have a size known at compile-time + | + = help: the trait `Sized` is not implemented for `(dyn FnOnce() -> u8 + 'static)` + +error[E0277]: the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time + --> $DIR/ice-unsized-tuple-const-issue-121443.rs:8:18 + | +LL | const TEST: Fn = some_fn; + | ^^^^^^^ doesn't have a size known at compile-time + | + = help: the trait `Sized` is not implemented for `(dyn FnOnce() -> u8 + 'static)` + = note: constant expressions must have a statically known size + +error[E0277]: the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time + --> $DIR/ice-unsized-tuple-const-issue-121443.rs:12:14 + | +LL | const TEST2: (Fn, u8) = (TEST, 0); + | ^^^^^^^^ doesn't have a size known at compile-time + | + = help: the trait `Sized` is not implemented for `(dyn FnOnce() -> u8 + 'static)` + = note: only the last element of a tuple may have a dynamically sized type + +error[E0277]: the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time + --> $DIR/ice-unsized-tuple-const-issue-121443.rs:12:25 + | +LL | const TEST2: (Fn, u8) = (TEST, 0); + | ^^^^^^^^^ doesn't have a size known at compile-time + | + = help: within `((dyn FnOnce() -> u8 + 'static), u8)`, the trait `Sized` is not implemented for `(dyn FnOnce() -> u8 + 'static)`, which is required by `((dyn FnOnce() -> u8 + 'static), u8): Sized` + = note: required because it appears within the type `((dyn FnOnce() -> u8 + 'static), u8)` + = note: constant expressions must have a statically known size + +error: aborting due to 5 previous errors + +Some errors have detailed explanations: E0277, E0425. +For more information about an error, try `rustc --explain E0277`. diff --git a/tests/ui/trait-bounds/unsized-bound.stderr b/tests/ui/trait-bounds/unsized-bound.stderr index c8049ebee1173..470d1d946923f 100644 --- a/tests/ui/trait-bounds/unsized-bound.stderr +++ b/tests/ui/trait-bounds/unsized-bound.stderr @@ -1,10 +1,10 @@ -error[E0277]: the size for values of type `B` cannot be known at compilation time +error[E0277]: the size for values of type `A` cannot be known at compilation time --> $DIR/unsized-bound.rs:2:30 | LL | impl Trait<(A, B)> for (A, B) where A: ?Sized, B: ?Sized, {} - | - ^^^^^^ doesn't have a size known at compile-time - | | - | this type parameter needs to be `Sized` + | - ^^^^^^ doesn't have a size known at compile-time + | | + | this type parameter needs to be `Sized` | = note: required because it appears within the type `(A, B)` note: required by an implicit `Sized` bound in `Trait` @@ -15,35 +15,42 @@ LL | trait Trait {} help: consider removing the `?Sized` bound to make the type parameter `Sized` | LL - impl Trait<(A, B)> for (A, B) where A: ?Sized, B: ?Sized, {} -LL + impl Trait<(A, B)> for (A, B) where A: ?Sized, {} +LL + impl Trait<(A, B)> for (A, B) where B: ?Sized, {} | help: consider relaxing the implicit `Sized` restriction | LL | trait Trait {} | ++++++++ -error[E0277]: the size for values of type `A` cannot be known at compilation time +error[E0277]: the size for values of type `B` cannot be known at compilation time --> $DIR/unsized-bound.rs:2:30 | LL | impl Trait<(A, B)> for (A, B) where A: ?Sized, B: ?Sized, {} - | - ^^^^^^ doesn't have a size known at compile-time - | | - | this type parameter needs to be `Sized` + | - ^^^^^^ doesn't have a size known at compile-time + | | + | this type parameter needs to be `Sized` | - = note: only the last element of a tuple may have a dynamically sized type + = note: required because it appears within the type `(A, B)` +note: required by an implicit `Sized` bound in `Trait` + --> $DIR/unsized-bound.rs:1:13 + | +LL | trait Trait {} + | ^ required by the implicit `Sized` requirement on this type parameter in `Trait` help: consider removing the `?Sized` bound to make the type parameter `Sized` | LL - impl Trait<(A, B)> for (A, B) where A: ?Sized, B: ?Sized, {} -LL + impl Trait<(A, B)> for (A, B) where B: ?Sized, {} +LL + impl Trait<(A, B)> for (A, B) where A: ?Sized, {} | +help: consider relaxing the implicit `Sized` restriction + | +LL | trait Trait {} + | ++++++++ -error[E0277]: the size for values of type `C` cannot be known at compilation time +error[E0277]: the size for values of type `A` cannot be known at compilation time --> $DIR/unsized-bound.rs:5:52 | LL | impl Trait<(A, B, C)> for (A, B, C) where A: ?Sized, {} - | - ^^^^^^^^^ doesn't have a size known at compile-time - | | - | this type parameter needs to be `Sized` + | - this type parameter needs to be `Sized` ^^^^^^^^^ doesn't have a size known at compile-time | = note: required because it appears within the type `(A, B, C)` note: required by an implicit `Sized` bound in `Trait` @@ -54,46 +61,66 @@ LL | trait Trait {} help: consider removing the `?Sized` bound to make the type parameter `Sized` | LL - impl Trait<(A, B, C)> for (A, B, C) where A: ?Sized, {} -LL + impl Trait<(A, B, C)> for (A, B, C) where A: ?Sized, {} +LL + impl Trait<(A, B, C)> for (A, B, C) {} | help: consider relaxing the implicit `Sized` restriction | LL | trait Trait {} | ++++++++ -error[E0277]: the size for values of type `A` cannot be known at compilation time +error[E0277]: the size for values of type `B` cannot be known at compilation time --> $DIR/unsized-bound.rs:5:52 | LL | impl Trait<(A, B, C)> for (A, B, C) where A: ?Sized, {} - | - this type parameter needs to be `Sized` ^^^^^^^^^ doesn't have a size known at compile-time + | - this type parameter needs to be `Sized` ^^^^^^^^^ doesn't have a size known at compile-time + | + = note: required because it appears within the type `(A, B, C)` +note: required by an implicit `Sized` bound in `Trait` + --> $DIR/unsized-bound.rs:1:13 | - = note: only the last element of a tuple may have a dynamically sized type +LL | trait Trait {} + | ^ required by the implicit `Sized` requirement on this type parameter in `Trait` help: consider removing the `?Sized` bound to make the type parameter `Sized` | LL - impl Trait<(A, B, C)> for (A, B, C) where A: ?Sized, {} -LL + impl Trait<(A, B, C)> for (A, B, C) {} +LL + impl Trait<(A, B, C)> for (A, B, C) where A: ?Sized, {} + | +help: consider relaxing the implicit `Sized` restriction | +LL | trait Trait {} + | ++++++++ -error[E0277]: the size for values of type `B` cannot be known at compilation time +error[E0277]: the size for values of type `C` cannot be known at compilation time --> $DIR/unsized-bound.rs:5:52 | LL | impl Trait<(A, B, C)> for (A, B, C) where A: ?Sized, {} - | - this type parameter needs to be `Sized` ^^^^^^^^^ doesn't have a size known at compile-time + | - ^^^^^^^^^ doesn't have a size known at compile-time + | | + | this type parameter needs to be `Sized` + | + = note: required because it appears within the type `(A, B, C)` +note: required by an implicit `Sized` bound in `Trait` + --> $DIR/unsized-bound.rs:1:13 | - = note: only the last element of a tuple may have a dynamically sized type +LL | trait Trait {} + | ^ required by the implicit `Sized` requirement on this type parameter in `Trait` help: consider removing the `?Sized` bound to make the type parameter `Sized` | LL - impl Trait<(A, B, C)> for (A, B, C) where A: ?Sized, {} -LL + impl Trait<(A, B, C)> for (A, B, C) where A: ?Sized, {} +LL + impl Trait<(A, B, C)> for (A, B, C) where A: ?Sized, {} | +help: consider relaxing the implicit `Sized` restriction + | +LL | trait Trait {} + | ++++++++ -error[E0277]: the size for values of type `B` cannot be known at compilation time +error[E0277]: the size for values of type `A` cannot be known at compilation time --> $DIR/unsized-bound.rs:10:47 | LL | impl Trait2<(A, B)> for (A, B) {} - | - ^^^^^^ doesn't have a size known at compile-time - | | - | this type parameter needs to be `Sized` + | - ^^^^^^ doesn't have a size known at compile-time + | | + | this type parameter needs to be `Sized` | = note: required because it appears within the type `(A, B)` note: required by an implicit `Sized` bound in `Trait2` @@ -104,27 +131,36 @@ LL | trait Trait2 {} help: consider removing the `?Sized` bound to make the type parameter `Sized` | LL - impl Trait2<(A, B)> for (A, B) {} -LL + impl Trait2<(A, B)> for (A, B) {} +LL + impl Trait2<(A, B)> for (A, B) {} | help: consider relaxing the implicit `Sized` restriction | LL | trait Trait2 {} | ++++++++ -error[E0277]: the size for values of type `A` cannot be known at compilation time +error[E0277]: the size for values of type `B` cannot be known at compilation time --> $DIR/unsized-bound.rs:10:47 | LL | impl Trait2<(A, B)> for (A, B) {} - | - ^^^^^^ doesn't have a size known at compile-time - | | - | this type parameter needs to be `Sized` + | - ^^^^^^ doesn't have a size known at compile-time + | | + | this type parameter needs to be `Sized` | - = note: only the last element of a tuple may have a dynamically sized type + = note: required because it appears within the type `(A, B)` +note: required by an implicit `Sized` bound in `Trait2` + --> $DIR/unsized-bound.rs:9:14 + | +LL | trait Trait2 {} + | ^ required by the implicit `Sized` requirement on this type parameter in `Trait2` help: consider removing the `?Sized` bound to make the type parameter `Sized` | LL - impl Trait2<(A, B)> for (A, B) {} -LL + impl Trait2<(A, B)> for (A, B) {} +LL + impl Trait2<(A, B)> for (A, B) {} + | +help: consider relaxing the implicit `Sized` restriction | +LL | trait Trait2 {} + | ++++++++ error[E0277]: the size for values of type `A` cannot be known at compilation time --> $DIR/unsized-bound.rs:14:23 diff --git a/tests/ui/unsized/unsized3.rs b/tests/ui/unsized/unsized3.rs index af76aca2c2958..99e4109446e17 100644 --- a/tests/ui/unsized/unsized3.rs +++ b/tests/ui/unsized/unsized3.rs @@ -39,6 +39,7 @@ fn f8(x1: &S, x2: &S) { fn f9(x1: Box>) { f5(&(*x1, 34)); //~^ ERROR the size for values of type + //~| ERROR the size for values of type } fn f10(x1: Box>) { diff --git a/tests/ui/unsized/unsized3.stderr b/tests/ui/unsized/unsized3.stderr index c7a145b1c5171..92513e595a562 100644 --- a/tests/ui/unsized/unsized3.stderr +++ b/tests/ui/unsized/unsized3.stderr @@ -75,19 +75,20 @@ LL | fn f5(x: &Y) {} | ++++++++ error[E0277]: the size for values of type `X` cannot be known at compilation time - --> $DIR/unsized3.rs:40:5 + --> $DIR/unsized3.rs:40:9 | LL | fn f9(x1: Box>) { | - this type parameter needs to be `Sized` LL | f5(&(*x1, 34)); - | ^^ doesn't have a size known at compile-time + | ^^^^^^^^^ doesn't have a size known at compile-time | note: required because it appears within the type `S` --> $DIR/unsized3.rs:28:8 | LL | struct S { | ^ - = note: only the last element of a tuple may have a dynamically sized type + = note: required because it appears within the type `(S, {integer})` + = note: tuples must have a statically known size to be initialized help: consider removing the `?Sized` bound to make the type parameter `Sized` | LL - fn f9(x1: Box>) { @@ -95,7 +96,38 @@ LL + fn f9(x1: Box>) { | error[E0277]: the size for values of type `X` cannot be known at compilation time - --> $DIR/unsized3.rs:45:9 + --> $DIR/unsized3.rs:40:8 + | +LL | fn f9(x1: Box>) { + | - this type parameter needs to be `Sized` +LL | f5(&(*x1, 34)); + | -- ^^^^^^^^^^ doesn't have a size known at compile-time + | | + | required by a bound introduced by this call + | +note: required because it appears within the type `S` + --> $DIR/unsized3.rs:28:8 + | +LL | struct S { + | ^ + = note: required because it appears within the type `(S, {integer})` +note: required by an implicit `Sized` bound in `f5` + --> $DIR/unsized3.rs:24:7 + | +LL | fn f5(x: &Y) {} + | ^ required by the implicit `Sized` requirement on this type parameter in `f5` +help: consider removing the `?Sized` bound to make the type parameter `Sized` + | +LL - fn f9(x1: Box>) { +LL + fn f9(x1: Box>) { + | +help: consider relaxing the implicit `Sized` restriction + | +LL | fn f5(x: &Y) {} + | ++++++++ + +error[E0277]: the size for values of type `X` cannot be known at compilation time + --> $DIR/unsized3.rs:46:9 | LL | fn f10(x1: Box>) { | - this type parameter needs to be `Sized` @@ -116,7 +148,7 @@ LL + fn f10(x1: Box>) { | error[E0277]: the size for values of type `X` cannot be known at compilation time - --> $DIR/unsized3.rs:45:8 + --> $DIR/unsized3.rs:46:8 | LL | fn f10(x1: Box>) { | - this type parameter needs to be `Sized` @@ -146,6 +178,6 @@ help: consider relaxing the implicit `Sized` restriction LL | fn f5(x: &Y) {} | ++++++++ -error: aborting due to 6 previous errors +error: aborting due to 7 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/tests/ui/unsized/unsized6.rs b/tests/ui/unsized/unsized6.rs index 79133554d5472..fc772f50b1ae1 100644 --- a/tests/ui/unsized/unsized6.rs +++ b/tests/ui/unsized/unsized6.rs @@ -25,6 +25,7 @@ fn f3(x1: Box, x2: Box, x3: Box) { //~^ ERROR the size for values of type let (y, z) = (*x3, 4); //~^ ERROR the size for values of type + //~| ERROR the size for values of type } fn f4(x1: Box, x2: Box, x3: Box) { let y: X = *x1; @@ -33,6 +34,7 @@ fn f4(x1: Box, x2: Box, x3: Box) { //~^ ERROR the size for values of type let (y, z) = (*x3, 4); //~^ ERROR the size for values of type + //~| ERROR the size for values of type } fn g1(x: X) {} diff --git a/tests/ui/unsized/unsized6.stderr b/tests/ui/unsized/unsized6.stderr index 56e7f60f9ff08..dbea064595e57 100644 --- a/tests/ui/unsized/unsized6.stderr +++ b/tests/ui/unsized/unsized6.stderr @@ -124,6 +124,23 @@ LL - fn f3(x1: Box, x2: Box, x3: Box) { LL + fn f3(x1: Box, x2: Box, x3: Box) { | +error[E0277]: the size for values of type `X` cannot be known at compilation time + --> $DIR/unsized6.rs:26:18 + | +LL | fn f3(x1: Box, x2: Box, x3: Box) { + | - this type parameter needs to be `Sized` +... +LL | let (y, z) = (*x3, 4); + | ^^^^^^^^ doesn't have a size known at compile-time + | + = note: required because it appears within the type `(X, {integer})` + = note: tuples must have a statically known size to be initialized +help: consider removing the `?Sized` bound to make the type parameter `Sized` + | +LL - fn f3(x1: Box, x2: Box, x3: Box) { +LL + fn f3(x1: Box, x2: Box, x3: Box) { + | + error[E0277]: the size for values of type `X` cannot be known at compilation time --> $DIR/unsized6.rs:26:10 | @@ -142,7 +159,7 @@ LL + fn f3(x1: Box, x2: Box, x3: Box) { | error[E0277]: the size for values of type `X` cannot be known at compilation time - --> $DIR/unsized6.rs:30:9 + --> $DIR/unsized6.rs:31:9 | LL | fn f4(x1: Box, x2: Box, x3: Box) { | - this type parameter needs to be `Sized` @@ -162,7 +179,7 @@ LL | let y: &X = *x1; | + error[E0277]: the size for values of type `X` cannot be known at compilation time - --> $DIR/unsized6.rs:32:9 + --> $DIR/unsized6.rs:33:9 | LL | fn f4(x1: Box, x2: Box, x3: Box) { | - this type parameter needs to be `Sized` @@ -179,7 +196,24 @@ LL + fn f4(x1: Box, x2: Box, x3: Box) { | error[E0277]: the size for values of type `X` cannot be known at compilation time - --> $DIR/unsized6.rs:34:10 + --> $DIR/unsized6.rs:35:18 + | +LL | fn f4(x1: Box, x2: Box, x3: Box) { + | - this type parameter needs to be `Sized` +... +LL | let (y, z) = (*x3, 4); + | ^^^^^^^^ doesn't have a size known at compile-time + | + = note: required because it appears within the type `(X, {integer})` + = note: tuples must have a statically known size to be initialized +help: consider removing the `?Sized` bound to make the type parameter `Sized` + | +LL - fn f4(x1: Box, x2: Box, x3: Box) { +LL + fn f4(x1: Box, x2: Box, x3: Box) { + | + +error[E0277]: the size for values of type `X` cannot be known at compilation time + --> $DIR/unsized6.rs:35:10 | LL | fn f4(x1: Box, x2: Box, x3: Box) { | - this type parameter needs to be `Sized` @@ -196,7 +230,7 @@ LL + fn f4(x1: Box, x2: Box, x3: Box) { | error[E0277]: the size for values of type `X` cannot be known at compilation time - --> $DIR/unsized6.rs:38:18 + --> $DIR/unsized6.rs:40:18 | LL | fn g1(x: X) {} | - ^ doesn't have a size known at compile-time @@ -215,7 +249,7 @@ LL | fn g1(x: &X) {} | + error[E0277]: the size for values of type `X` cannot be known at compilation time - --> $DIR/unsized6.rs:40:22 + --> $DIR/unsized6.rs:42:22 | LL | fn g2(x: X) {} | - ^ doesn't have a size known at compile-time @@ -233,6 +267,6 @@ help: function arguments must have a statically known size, borrowed types alway LL | fn g2(x: &X) {} | + -error: aborting due to 13 previous errors +error: aborting due to 15 previous errors For more information about this error, try `rustc --explain E0277`.