Always register sized obligation for argument
This commit is contained in:
parent
6330daade9
commit
0d6da78b06
7 changed files with 57 additions and 22 deletions
|
@ -92,10 +92,7 @@ pub(super) fn check_fn<'a, 'tcx>(
|
||||||
fcx.check_pat_top(¶m.pat, param_ty, ty_span, None);
|
fcx.check_pat_top(¶m.pat, param_ty, ty_span, None);
|
||||||
|
|
||||||
// Check that argument is Sized.
|
// Check that argument is Sized.
|
||||||
// The check for a non-trivial pattern is a hack to avoid duplicate warnings
|
if !params_can_be_unsized {
|
||||||
// for simple cases like `fn foo(x: Trait)`,
|
|
||||||
// where we would error once on the parameter as a whole, and once on the binding `x`.
|
|
||||||
if param.pat.simple_ident().is_none() && !params_can_be_unsized {
|
|
||||||
fcx.require_type_is_sized(
|
fcx.require_type_is_sized(
|
||||||
param_ty,
|
param_ty,
|
||||||
param.pat.span,
|
param.pat.span,
|
||||||
|
|
11
tests/ui/closures/cannot-call-unsized-via-ptr-2.rs
Normal file
11
tests/ui/closures/cannot-call-unsized-via-ptr-2.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#![feature(unsized_fn_params)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// CoerceMany "LUB"
|
||||||
|
let f = if true { |_a| {} } else { |_b| {} };
|
||||||
|
//~^ 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
|
||||||
|
|
||||||
|
let slice: Box<[u8]> = Box::new([1; 8]);
|
||||||
|
f(*slice);
|
||||||
|
}
|
21
tests/ui/closures/cannot-call-unsized-via-ptr-2.stderr
Normal file
21
tests/ui/closures/cannot-call-unsized-via-ptr-2.stderr
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||||
|
--> $DIR/cannot-call-unsized-via-ptr-2.rs:5:24
|
||||||
|
|
|
||||||
|
LL | let f = if true { |_a| {} } else { |_b| {} };
|
||||||
|
| ^^ doesn't have a size known at compile-time
|
||||||
|
|
|
||||||
|
= help: the trait `Sized` is not implemented for `[u8]`
|
||||||
|
= note: all function arguments must have a statically known size
|
||||||
|
|
||||||
|
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||||
|
--> $DIR/cannot-call-unsized-via-ptr-2.rs:5:41
|
||||||
|
|
|
||||||
|
LL | let f = if true { |_a| {} } else { |_b| {} };
|
||||||
|
| ^^ doesn't have a size known at compile-time
|
||||||
|
|
|
||||||
|
= help: the trait `Sized` is not implemented for `[u8]`
|
||||||
|
= note: all function arguments must have a statically known size
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
10
tests/ui/closures/cannot-call-unsized-via-ptr.rs
Normal file
10
tests/ui/closures/cannot-call-unsized-via-ptr.rs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#![feature(unsized_fn_params)]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// Simple coercion
|
||||||
|
let f: fn([u8]) = |_result| {};
|
||||||
|
//~^ ERROR the size for values of type `[u8]` cannot be known at compilation time
|
||||||
|
|
||||||
|
let slice: Box<[u8]> = Box::new([1; 8]);
|
||||||
|
f(*slice);
|
||||||
|
}
|
12
tests/ui/closures/cannot-call-unsized-via-ptr.stderr
Normal file
12
tests/ui/closures/cannot-call-unsized-via-ptr.stderr
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
|
||||||
|
--> $DIR/cannot-call-unsized-via-ptr.rs:5:24
|
||||||
|
|
|
||||||
|
LL | let f: fn([u8]) = |_result| {};
|
||||||
|
| ^^^^^^^ doesn't have a size known at compile-time
|
||||||
|
|
|
||||||
|
= help: the trait `Sized` is not implemented for `[u8]`
|
||||||
|
= note: all function arguments must have a statically known size
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
|
@ -6,7 +6,7 @@ struct Struct {
|
||||||
|
|
||||||
fn new_struct(
|
fn new_struct(
|
||||||
r: dyn A + 'static //~ ERROR the size for values of type
|
r: dyn A + 'static //~ ERROR the size for values of type
|
||||||
) -> Struct { //~ ERROR the size for values of type
|
) -> Struct {
|
||||||
Struct { r: r }
|
Struct { r: r }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,22 +15,6 @@ help: function arguments must have a statically known size, borrowed types alway
|
||||||
LL | r: &dyn A + 'static
|
LL | r: &dyn A + 'static
|
||||||
| +
|
| +
|
||||||
|
|
||||||
error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time
|
error: aborting due to previous error
|
||||||
--> $DIR/issue-5883.rs:9:6
|
|
||||||
|
|
|
||||||
LL | ) -> Struct {
|
|
||||||
| ^^^^^^ doesn't have a size known at compile-time
|
|
||||||
LL | Struct { r: r }
|
|
||||||
| --------------- this returned value is of type `Struct`
|
|
||||||
|
|
|
||||||
= help: within `Struct`, the trait `Sized` is not implemented for `(dyn A + 'static)`
|
|
||||||
note: required because it appears within the type `Struct`
|
|
||||||
--> $DIR/issue-5883.rs:3:8
|
|
||||||
|
|
|
||||||
LL | struct Struct {
|
|
||||||
| ^^^^^^
|
|
||||||
= note: the return type of a function must have a statically known size
|
|
||||||
|
|
||||||
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 E0277`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue