Skip to content

Commit

Permalink
Always register sized obligation for argument
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Jun 15, 2023
1 parent 6330daa commit 0d6da78
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 22 deletions.
5 changes: 1 addition & 4 deletions compiler/rustc_hir_typeck/src/check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,7 @@ pub(super) fn check_fn<'a, 'tcx>(
fcx.check_pat_top(&param.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,
Expand Down
11 changes: 11 additions & 0 deletions tests/ui/closures/cannot-call-unsized-via-ptr-2.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 21 additions & 0 deletions tests/ui/closures/cannot-call-unsized-via-ptr-2.stderr
Original file line number Diff line number Diff line change
@@ -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 changes: 10 additions & 0 deletions tests/ui/closures/cannot-call-unsized-via-ptr.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 12 additions & 0 deletions tests/ui/closures/cannot-call-unsized-via-ptr.stderr
Original file line number Diff line number Diff line change
@@ -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`.
2 changes: 1 addition & 1 deletion tests/ui/issues/issue-5883.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
}

Expand Down
18 changes: 1 addition & 17 deletions tests/ui/issues/issue-5883.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`.

0 comments on commit 0d6da78

Please sign in to comment.