Skip to content

Commit

Permalink
Rollup merge of #112643 - compiler-errors:sized-obl-for-arg, r=wesley…
Browse files Browse the repository at this point in the history
…wiser

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
  • Loading branch information
matthiaskrgr authored Jun 23, 2023
2 parents ff59614 + 0d6da78 commit 27ae068
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 27ae068

Please sign in to comment.