mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Always register sized obligation for argument
This commit is contained in:
parent
6330daade9
commit
0d6da78b06
@ -92,10 +92,7 @@ pub(super) fn check_fn<'a, 'tcx>(
|
||||
fcx.check_pat_top(¶m.pat, param_ty, ty_span, None);
|
||||
|
||||
// Check that argument is Sized.
|
||||
// The check for a non-trivial pattern is a hack to avoid duplicate warnings
|
||||
// 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 {
|
||||
if !params_can_be_unsized {
|
||||
fcx.require_type_is_sized(
|
||||
param_ty,
|
||||
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(
|
||||
r: dyn A + 'static //~ ERROR the size for values of type
|
||||
) -> Struct { //~ ERROR the size for values of type
|
||||
) -> Struct {
|
||||
Struct { r: r }
|
||||
}
|
||||
|
||||
|
@ -15,22 +15,6 @@ help: function arguments must have a statically known size, borrowed types alway
|
||||
LL | r: &dyn A + 'static
|
||||
| +
|
||||
|
||||
error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time
|
||||
--> $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
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
Loading…
Reference in New Issue
Block a user