mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Rollup merge of #112643 - compiler-errors:sized-obl-for-arg, r=wesleywiser
Always register sized obligation for argument Removes a "hack" that skips registering sized obligations for parameters that are simple identifiers. This doesn't seem to affect diagnostics because we're probably already being smart enough about deduplicating identical error messages anyways. Fixes #112608
This commit is contained in:
commit
27ae068de3
@ -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