Add unsized_fn_params feature

This commit is contained in:
Santiago Pastorino
2020-10-16 17:46:59 -03:00
parent 2a71e45411
commit 708fc3b1a2
46 changed files with 165 additions and 86 deletions

View File

@@ -607,6 +607,9 @@ declare_features! (
/// Allow anonymous constants from an inline `const` block /// Allow anonymous constants from an inline `const` block
(active, inline_const, "1.49.0", Some(76001), None), (active, inline_const, "1.49.0", Some(76001), None),
/// Allows unsized fn parameters.
(active, unsized_fn_params, "1.49.0", Some(48055), None),
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// feature-group-end: actual feature gates // feature-group-end: actual feature gates
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------

View File

@@ -1456,7 +1456,9 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
} }
self.check_rvalue(body, rv, location); self.check_rvalue(body, rv, location);
if !self.tcx().features().unsized_locals { if !(self.tcx().features().unsized_locals
|| self.tcx().features().unsized_fn_params)
{
let trait_ref = ty::TraitRef { let trait_ref = ty::TraitRef {
def_id: tcx.require_lang_item(LangItem::Sized, Some(self.last_span)), def_id: tcx.require_lang_item(LangItem::Sized, Some(self.last_span)),
substs: tcx.mk_substs_trait(place_ty, &[]), substs: tcx.mk_substs_trait(place_ty, &[]),
@@ -1717,9 +1719,9 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
); );
} }
// When `#![feature(unsized_locals)]` is not enabled, // When `unsized_fn_params` or `unsized_locals` is not enabled,
// this check is done at `check_local`. // this check is done at `check_local`.
if self.tcx().features().unsized_locals { if self.tcx().features().unsized_locals || self.tcx().features().unsized_fn_params {
let span = term.source_info.span; let span = term.source_info.span;
self.ensure_place_sized(dest_ty, span); self.ensure_place_sized(dest_ty, span);
} }
@@ -1880,9 +1882,9 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
LocalKind::Var | LocalKind::Temp => {} LocalKind::Var | LocalKind::Temp => {}
} }
// When `#![feature(unsized_locals)]` is enabled, only function calls // When `unsized_fn_params` or `unsized_locals` is enabled, only function calls
// and nullary ops are checked in `check_call_dest`. // and nullary ops are checked in `check_call_dest`.
if !self.tcx().features().unsized_locals { if !(self.tcx().features().unsized_locals || self.tcx().features().unsized_fn_params) {
let span = local_decl.source_info.span; let span = local_decl.source_info.span;
let ty = local_decl.ty; let ty = local_decl.ty;
self.ensure_place_sized(ty, span); self.ensure_place_sized(ty, span);
@@ -2024,7 +2026,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
Rvalue::NullaryOp(_, ty) => { Rvalue::NullaryOp(_, ty) => {
// Even with unsized locals cannot box an unsized value. // Even with unsized locals cannot box an unsized value.
if self.tcx().features().unsized_locals { if self.tcx().features().unsized_locals || self.tcx().features().unsized_fn_params {
let span = body.source_info(location).span; let span = body.source_info(location).span;
self.ensure_place_sized(ty, span); self.ensure_place_sized(ty, span);
} }

View File

@@ -165,7 +165,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
let tcx = this.hir.tcx(); let tcx = this.hir.tcx();
if tcx.features().unsized_locals { if tcx.features().unsized_fn_params {
let ty = expr.ty; let ty = expr.ty;
let span = expr.span; let span = expr.span;
let param_env = this.hir.param_env; let param_env = this.hir.param_env;

View File

@@ -1161,6 +1161,7 @@ symbols! {
unsafe_cell, unsafe_cell,
unsafe_no_drop_flag, unsafe_no_drop_flag,
unsize, unsize,
unsized_fn_params,
unsized_locals, unsized_locals,
unsized_tuple_coercion, unsized_tuple_coercion,
unstable, unstable,

View File

@@ -1845,9 +1845,9 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
err.note("all function arguments must have a statically known size"); err.note("all function arguments must have a statically known size");
} }
if tcx.sess.opts.unstable_features.is_nightly_build() if tcx.sess.opts.unstable_features.is_nightly_build()
&& !self.tcx.features().unsized_locals && !self.tcx.features().unsized_fn_params
{ {
err.help("unsized locals are gated as an unstable feature"); err.help("unsized fn params are gated as an unstable feature");
} }
} }
ObligationCauseCode::SizedReturnType => { ObligationCauseCode::SizedReturnType => {

View File

@@ -105,7 +105,7 @@ pub(super) fn check_fn<'a, 'tcx>(
let outer_def_id = tcx.closure_base_def_id(hir.local_def_id(fn_id).to_def_id()).expect_local(); let outer_def_id = tcx.closure_base_def_id(hir.local_def_id(fn_id).to_def_id()).expect_local();
let outer_hir_id = hir.local_def_id_to_hir_id(outer_def_id); let outer_hir_id = hir.local_def_id_to_hir_id(outer_def_id);
GatherLocalsVisitor::new(&fcx, outer_hir_id).visit_body(body); GatherLocalsVisitor::new(&fcx, outer_hir_id, false).visit_body(body);
// C-variadic fns also have a `VaList` input that's not listed in `fn_sig` // C-variadic fns also have a `VaList` input that's not listed in `fn_sig`
// (as it's created inside the body itself, not passed in from outside). // (as it's created inside the body itself, not passed in from outside).
@@ -131,7 +131,7 @@ pub(super) fn check_fn<'a, 'tcx>(
// The check for a non-trivial pattern is a hack to avoid duplicate warnings // The check for a non-trivial pattern is a hack to avoid duplicate warnings
// for simple cases like `fn foo(x: Trait)`, // 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`. // where we would error once on the parameter as a whole, and once on the binding `x`.
if param.pat.simple_ident().is_none() && !tcx.features().unsized_locals { if param.pat.simple_ident().is_none() && !tcx.features().unsized_fn_params {
fcx.require_type_is_sized(param_ty, param.pat.span, traits::SizedArgumentType(ty_span)); fcx.require_type_is_sized(param_ty, param.pat.span, traits::SizedArgumentType(ty_span));
} }

View File

@@ -476,7 +476,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
if let ty::FnDef(..) = ty.kind() { if let ty::FnDef(..) = ty.kind() {
let fn_sig = ty.fn_sig(tcx); let fn_sig = ty.fn_sig(tcx);
if !tcx.features().unsized_locals { if !tcx.features().unsized_fn_params {
// We want to remove some Sized bounds from std functions, // We want to remove some Sized bounds from std functions,
// but don't want to expose the removal to stable Rust. // but don't want to expose the removal to stable Rust.
// i.e., we don't want to allow // i.e., we don't want to allow

View File

@@ -10,11 +10,19 @@ use rustc_trait_selection::traits;
pub(super) struct GatherLocalsVisitor<'a, 'tcx> { pub(super) struct GatherLocalsVisitor<'a, 'tcx> {
fcx: &'a FnCtxt<'a, 'tcx>, fcx: &'a FnCtxt<'a, 'tcx>,
parent_id: hir::HirId, parent_id: hir::HirId,
// params are special cases of pats, but we want to handle them as
// *distinct* cases. so track when we are hitting a pat *within* an fn
// param.
within_fn_param: bool,
} }
impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> { impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> {
pub(super) fn new(fcx: &'a FnCtxt<'a, 'tcx>, parent_id: hir::HirId) -> Self { pub(super) fn new(
Self { fcx, parent_id } fcx: &'a FnCtxt<'a, 'tcx>,
parent_id: hir::HirId,
within_fn_param: bool,
) -> Self {
Self { fcx, parent_id, within_fn_param }
} }
fn assign(&mut self, span: Span, nid: hir::HirId, ty_opt: Option<LocalTy<'tcx>>) -> Ty<'tcx> { fn assign(&mut self, span: Span, nid: hir::HirId, ty_opt: Option<LocalTy<'tcx>>) -> Ty<'tcx> {
@@ -88,13 +96,29 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> {
intravisit::walk_local(self, local); intravisit::walk_local(self, local);
} }
fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) {
self.within_fn_param = true;
intravisit::walk_param(self, param);
self.within_fn_param = false;
}
// Add pattern bindings. // Add pattern bindings.
fn visit_pat(&mut self, p: &'tcx hir::Pat<'tcx>) { fn visit_pat(&mut self, p: &'tcx hir::Pat<'tcx>) {
if let PatKind::Binding(_, _, ident, _) = p.kind { if let PatKind::Binding(_, _, ident, _) = p.kind {
let var_ty = self.assign(p.span, p.hir_id, None); let var_ty = self.assign(p.span, p.hir_id, None);
if !self.fcx.tcx.features().unsized_locals { if self.within_fn_param {
self.fcx.require_type_is_sized(var_ty, p.span, traits::VariableType(p.hir_id)); if !self.fcx.tcx.features().unsized_fn_params {
self.fcx.require_type_is_sized(
var_ty,
p.span,
traits::SizedArgumentType(Some(p.span)),
);
}
} else {
if !self.fcx.tcx.features().unsized_locals {
self.fcx.require_type_is_sized(var_ty, p.span, traits::VariableType(p.hir_id));
}
} }
debug!( debug!(

View File

@@ -553,7 +553,7 @@ fn typeck_with_fallback<'tcx>(
}; };
// Gather locals in statics (because of block expressions). // Gather locals in statics (because of block expressions).
GatherLocalsVisitor::new(&fcx, id).visit_body(body); GatherLocalsVisitor::new(&fcx, id, false).visit_body(body);
fcx.check_expr_coercable_to_type(&body.value, revealed_ty, None); fcx.check_expr_coercable_to_type(&body.value, revealed_ty, None);

View File

@@ -130,7 +130,8 @@
#![feature(unicode_internals)] #![feature(unicode_internals)]
#![feature(unsafe_block_in_unsafe_fn)] #![feature(unsafe_block_in_unsafe_fn)]
#![feature(unsize)] #![feature(unsize)]
#![feature(unsized_locals)] #![cfg_attr(not(bootstrap), feature(unsized_fn_params))]
#![cfg_attr(bootstrap, feature(unsized_locals))]
#![feature(allocator_internals)] #![feature(allocator_internals)]
#![feature(slice_partition_dedup)] #![feature(slice_partition_dedup)]
#![feature(maybe_uninit_extra, maybe_uninit_slice, maybe_uninit_uninit_array)] #![feature(maybe_uninit_extra, maybe_uninit_slice, maybe_uninit_uninit_array)]

View File

@@ -133,6 +133,7 @@
#![feature(try_blocks)] #![feature(try_blocks)]
#![feature(unboxed_closures)] #![feature(unboxed_closures)]
#![feature(unsized_locals)] #![feature(unsized_locals)]
#![cfg_attr(not(bootstrap), feature(unsized_fn_params))]
#![cfg_attr(bootstrap, feature(untagged_unions))] #![cfg_attr(bootstrap, feature(untagged_unions))]
#![feature(unwind_attributes)] #![feature(unwind_attributes)]
#![feature(variant_count)] #![feature(variant_count)]

View File

@@ -1,4 +1,5 @@
#![feature(unsized_locals)] #![allow(incomplete_features)]
#![feature(unsized_locals, unsized_fn_params)]
use std::fmt; use std::fmt;
@@ -45,11 +46,7 @@ fn main() {
{ {
let x: fmt::Display = *gen_foo(); let x: fmt::Display = *gen_foo();
let x = if true { let x = if true { x } else { *gen_foo() };
x
} else {
*gen_foo()
};
foo(x); foo(x);
} }
} }

View File

@@ -18,7 +18,7 @@ LL | async fn frob(self) {}
| |
= help: within `Foo`, the trait `Sized` is not implemented for `str` = help: within `Foo`, the trait `Sized` is not implemented for `str`
= note: required because it appears within the type `Foo` = note: required because it appears within the type `Foo`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | async fn frob(&self) {} LL | async fn frob(&self) {}

View File

@@ -16,7 +16,7 @@ LL | (&|_| ()) as &dyn for<'x> Fn(<u32 as T<'x>>::V);
| ^ doesn't have a size known at compile-time | ^ doesn't have a size known at compile-time
| |
= help: the trait `Sized` is not implemented for `<u32 as T<'_>>::V` = help: the trait `Sized` is not implemented for `<u32 as T<'_>>::V`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: consider further restricting the associated type help: consider further restricting the associated type
| |
LL | fn main() where <u32 as T<'_>>::V: Sized { LL | fn main() where <u32 as T<'_>>::V: Sized {

View File

@@ -6,11 +6,11 @@ LL | fn f(p: Path) { }
| |
= help: within `Path`, the trait `Sized` is not implemented for `[u8]` = help: within `Path`, the trait `Sized` is not implemented for `[u8]`
= note: required because it appears within the type `Path` = note: required because it appears within the type `Path`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | fn f(p: &Path) { } LL | fn f(&p: Path) { }
| ^ | ^
error[E0277]: the trait bound `i32: Foo` is not satisfied error[E0277]: the trait bound `i32: Foo` is not satisfied
--> $DIR/E0277.rs:17:15 --> $DIR/E0277.rs:17:15

View File

@@ -0,0 +1,26 @@
#[repr(align(256))]
#[allow(dead_code)]
struct A {
v: u8,
}
trait Foo {
fn foo(&self);
}
impl Foo for A {
fn foo(&self) {
assert_eq!(self as *const A as usize % 256, 0);
}
}
fn foo(x: dyn Foo) {
//~^ ERROR: the size for values of type `(dyn Foo + 'static)` cannot be known at compilation time [E0277]
x.foo()
}
fn main() {
let x: Box<dyn Foo> = Box::new(A { v: 22 });
foo(*x);
//~^ ERROR: the size for values of type `(dyn Foo + 'static)` cannot be known at compilation time [E0277]
}

View File

@@ -0,0 +1,26 @@
error[E0277]: the size for values of type `(dyn Foo + 'static)` cannot be known at compilation time
--> $DIR/feature-gate-unsized_fn_params.rs:17:8
|
LL | fn foo(x: dyn Foo) {
| ^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `(dyn Foo + 'static)`
= help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size
|
LL | fn foo(&x: dyn Foo) {
| ^
error[E0277]: the size for values of type `(dyn Foo + 'static)` cannot be known at compilation time
--> $DIR/feature-gate-unsized_fn_params.rs:24:5
|
LL | foo(*x);
| ^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `(dyn Foo + 'static)`
= note: all function arguments must have a statically known size
= help: unsized fn params are gated as an unstable feature
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0277`.

View File

@@ -5,11 +5,11 @@ LL | fn f(f: dyn FnOnce()) {}
| ^ doesn't have a size known at compile-time | ^ doesn't have a size known at compile-time
| |
= help: the trait `Sized` is not implemented for `(dyn FnOnce() + 'static)` = help: the trait `Sized` is not implemented for `(dyn FnOnce() + 'static)`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | fn f(f: &dyn FnOnce()) {} LL | fn f(&f: dyn FnOnce()) {}
| ^ | ^
error: aborting due to previous error error: aborting due to previous error

View File

@@ -1,6 +1,6 @@
// run-pass // run-pass
#![feature(unsized_locals)] #![feature(unsized_fn_params)]
#![allow(dead_code)] #![allow(dead_code)]
#[repr(align(256))] #[repr(align(256))]
struct A { struct A {

View File

@@ -15,7 +15,7 @@ LL | (|| Box::new(*(&[0][..])))();
| |
= help: the trait `Sized` is not implemented for `[{integer}]` = help: the trait `Sized` is not implemented for `[{integer}]`
= note: all function arguments must have a statically known size = note: all function arguments must have a statically known size
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View File

@@ -4,7 +4,7 @@ error[E0277]: the size for values of type `Self` cannot be known at compilation
LL | fn foo(self) -> &'static i32 { LL | fn foo(self) -> &'static i32 {
| ^^^^ doesn't have a size known at compile-time | ^^^^ doesn't have a size known at compile-time
| |
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: consider further restricting `Self` help: consider further restricting `Self`
| |
LL | fn foo(self) -> &'static i32 where Self: Sized { LL | fn foo(self) -> &'static i32 where Self: Sized {

View File

@@ -6,7 +6,7 @@ LL | &X(*Y)
| |
= help: the trait `Sized` is not implemented for `[u8]` = help: the trait `Sized` is not implemented for `[u8]`
= note: all function arguments must have a statically known size = note: all function arguments must have a statically known size
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
error: aborting due to previous error error: aborting due to previous error

View File

@@ -5,7 +5,7 @@ LL | fn _test(ref _p: str) {}
| ^^^^^^ doesn't have a size known at compile-time | ^^^^^^ doesn't have a size known at compile-time
| |
= help: the trait `Sized` is not implemented for `str` = help: the trait `Sized` is not implemented for `str`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | fn _test(ref _p: &str) {} LL | fn _test(ref _p: &str) {}

View File

@@ -5,7 +5,7 @@ LL | pub fn example(ref s: str) {}
| ^^^^^ doesn't have a size known at compile-time | ^^^^^ doesn't have a size known at compile-time
| |
= help: the trait `Sized` is not implemented for `str` = help: the trait `Sized` is not implemented for `str`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | pub fn example(ref s: &str) {} LL | pub fn example(ref s: &str) {}

View File

@@ -5,7 +5,7 @@ LL | fn baz(_: Self::Target) where Self: Deref {}
| ^ doesn't have a size known at compile-time | ^ doesn't have a size known at compile-time
| |
= help: the trait `Sized` is not implemented for `<Self as Deref>::Target` = help: the trait `Sized` is not implemented for `<Self as Deref>::Target`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: consider further restricting the associated type help: consider further restricting the associated type
| |
LL | fn baz(_: Self::Target) where Self: Deref, <Self as Deref>::Target: Sized {} LL | fn baz(_: Self::Target) where Self: Deref, <Self as Deref>::Target: Sized {}
@@ -22,7 +22,7 @@ LL | pub fn f(_: dyn ToString) {}
| ^ doesn't have a size known at compile-time | ^ doesn't have a size known at compile-time
| |
= help: the trait `Sized` is not implemented for `(dyn ToString + 'static)` = help: the trait `Sized` is not implemented for `(dyn ToString + 'static)`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | pub fn f(_: &dyn ToString) {} LL | pub fn f(_: &dyn ToString) {}

View File

@@ -5,11 +5,11 @@ LL | fn new_struct(r: dyn A + 'static)
| ^ doesn't have a size known at compile-time | ^ doesn't have a size known at compile-time
| |
= help: the trait `Sized` is not implemented for `(dyn A + 'static)` = help: the trait `Sized` is not implemented for `(dyn A + 'static)`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | fn new_struct(r: &dyn A + 'static) LL | fn new_struct(&r: dyn A + 'static)
| ^ | ^
error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time
--> $DIR/issue-5883.rs:8:8 --> $DIR/issue-5883.rs:8:8

View File

@@ -1,4 +1,4 @@
#![feature(arbitrary_self_types, coerce_unsized, dispatch_from_dyn, unsize, unsized_locals)] #![feature(arbitrary_self_types, coerce_unsized, dispatch_from_dyn, unsize, unsized_locals, unsized_fn_params)]
// This tests a few edge-cases around `arbitrary_self_types`. Most specifically, // This tests a few edge-cases around `arbitrary_self_types`. Most specifically,
// it checks that the `ObjectCandidate` you get from method matching can't // it checks that the `ObjectCandidate` you get from method matching can't

View File

@@ -5,11 +5,11 @@ LL | fn foo(_x: K) {}
| ^^ doesn't have a size known at compile-time | ^^ doesn't have a size known at compile-time
| |
= help: the trait `Sized` is not implemented for `(dyn I + 'static)` = help: the trait `Sized` is not implemented for `(dyn I + 'static)`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | fn foo(_x: &K) {} LL | fn foo(&_x: K) {}
| ^ | ^
error: aborting due to previous error error: aborting due to previous error

View File

@@ -6,11 +6,11 @@ LL | fn f(p: Path) { }
| |
= help: within `Path`, the trait `Sized` is not implemented for `[u8]` = help: within `Path`, the trait `Sized` is not implemented for `[u8]`
= note: required because it appears within the type `Path` = note: required because it appears within the type `Path`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | fn f(p: &Path) { } LL | fn f(&p: Path) { }
| ^ | ^
error: aborting due to previous error error: aborting due to previous error

View File

@@ -13,11 +13,11 @@ LL | fn foo(_x: Foo + Send) {
| ^^ doesn't have a size known at compile-time | ^^ doesn't have a size known at compile-time
| |
= help: the trait `Sized` is not implemented for `(dyn Foo + Send + 'static)` = help: the trait `Sized` is not implemented for `(dyn Foo + Send + 'static)`
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | fn foo(_x: &Foo + Send) { LL | fn foo(&_x: Foo + Send) {
| ^ | ^
error: aborting due to previous error; 1 warning emitted error: aborting due to previous error; 1 warning emitted

View File

@@ -1,6 +1,6 @@
// run-pass // run-pass
#![feature(unsized_locals)] #![feature(unsized_locals, unsized_fn_params)]
pub trait Foo { pub trait Foo {
fn foo(self) -> String; fn foo(self) -> String;
@@ -24,7 +24,6 @@ impl Foo for dyn FnMut() -> String {
} }
} }
fn main() { fn main() {
let x = *(Box::new(['h', 'e', 'l', 'l', 'o']) as Box<[char]>); let x = *(Box::new(['h', 'e', 'l', 'l', 'o']) as Box<[char]>);
assert_eq!(&x.foo() as &str, "hello"); assert_eq!(&x.foo() as &str, "hello");

View File

@@ -1,3 +1,3 @@
#![feature(unsized_locals)] #![feature(unsized_locals, unsized_fn_params)]
pub fn udrop<T: ?Sized>(_x: T) {} pub fn udrop<T: ?Sized>(_x: T) {}

View File

@@ -1,4 +1,4 @@
#![feature(unsized_locals)] #![feature(unsized_locals, unsized_fn_params)]
pub trait Foo { pub trait Foo {
fn foo(self) -> String; fn foo(self) -> String;

View File

@@ -1,6 +1,6 @@
// run-pass // run-pass
#![feature(unsized_locals)] #![feature(unsized_locals, unsized_fn_params)]
pub trait Foo { pub trait Foo {
fn foo(self) -> String { fn foo(self) -> String {
@@ -12,7 +12,6 @@ struct A;
impl Foo for A {} impl Foo for A {}
fn main() { fn main() {
let x = *(Box::new(A) as Box<dyn Foo>); let x = *(Box::new(A) as Box<dyn Foo>);
assert_eq!(x.foo(), format!("hello")); assert_eq!(x.foo(), format!("hello"));

View File

@@ -1,4 +1,4 @@
#![feature(unsized_locals)] #![feature(unsized_locals, unsized_fn_params)]
pub trait Foo { pub trait Foo {
fn foo(self) -> String; fn foo(self) -> String;

View File

@@ -4,9 +4,9 @@ error[E0277]: the size for values of type `[i32]` cannot be known at compilation
LL | let _x: fn(_) -> Test = Test; LL | let _x: fn(_) -> Test = Test;
| ^^^^ doesn't have a size known at compile-time | ^^^^ doesn't have a size known at compile-time
| |
= help: within `Test`, the trait `Sized` is not implemented for `[i32]` = help: the trait `Sized` is not implemented for `[i32]`
= note: required because it appears within the type `Test` = note: all function arguments must have a statically known size
= note: the return type of a function must have a statically known size = help: unsized fn params are gated as an unstable feature
error: aborting due to previous error error: aborting due to previous error

View File

@@ -6,7 +6,7 @@ LL | let _x: fn(_) -> Test = Test;
| |
= help: the trait `Sized` is not implemented for `[i32]` = help: the trait `Sized` is not implemented for `[i32]`
= note: all function arguments must have a statically known size = note: all function arguments must have a statically known size
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
error: aborting due to previous error error: aborting due to previous error

View File

@@ -1,4 +1,4 @@
#![feature(unsized_locals)] #![feature(unsized_locals, unsized_fn_params)]
fn main() { fn main() {
struct A<X: ?Sized>(X); struct A<X: ?Sized>(X);

View File

@@ -6,7 +6,7 @@ LL | A as fn(str) -> A<str>;
| |
= help: the trait `Sized` is not implemented for `str` = help: the trait `Sized` is not implemented for `str`
= note: all function arguments must have a statically known size = note: all function arguments must have a statically known size
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
error: aborting due to previous error error: aborting due to previous error

View File

@@ -1,6 +1,6 @@
// run-pass // run-pass
#![allow(unused_braces, unused_parens)] #![allow(unused_braces, unused_parens)]
#![feature(unsized_tuple_coercion, unsized_locals)] #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)]
struct A<X: ?Sized>(X); struct A<X: ?Sized>(X);
@@ -24,12 +24,8 @@ fn main() {
udrop::<[u8]>(loop { udrop::<[u8]>(loop {
break *foo(); break *foo();
}); });
udrop::<[u8]>(if true { udrop::<[u8]>(if true { *foo() } else { *foo() });
*foo() udrop::<[u8]>({ *foo() });
} else {
*foo()
});
udrop::<[u8]>({*foo()});
udrop::<[u8]>((*foo())); udrop::<[u8]>((*foo()));
udrop::<[u8]>((*tfoo()).1); udrop::<[u8]>((*tfoo()).1);
*afoo() + 42; *afoo() + 42;

View File

@@ -1,4 +1,4 @@
#![feature(unsized_tuple_coercion, unsized_locals)] #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)]
struct A<X: ?Sized>(X); struct A<X: ?Sized>(X);

View File

@@ -1,4 +1,4 @@
#![feature(unsized_tuple_coercion, unsized_locals)] #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)]
struct A<X: ?Sized>(X); struct A<X: ?Sized>(X);

View File

@@ -6,7 +6,7 @@ LL | udrop as fn([u8]);
| |
= help: the trait `Sized` is not implemented for `[u8]` = help: the trait `Sized` is not implemented for `[u8]`
= note: all function arguments must have a statically known size = note: all function arguments must have a statically known size
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
error: aborting due to previous error error: aborting due to previous error

View File

@@ -5,7 +5,7 @@
// Tightening the bound now could be a breaking change. Although no crater // Tightening the bound now could be a breaking change. Although no crater
// regression were observed (https://github.com/rust-lang/rust/pull/59527), // regression were observed (https://github.com/rust-lang/rust/pull/59527),
// let's be conservative and just add a test for this. // let's be conservative and just add a test for this.
#![feature(unsized_locals)] #![feature(unsized_locals, unsized_fn_params)]
use std::ops; use std::ops;
@@ -13,11 +13,15 @@ pub struct A;
impl ops::Index<str> for A { impl ops::Index<str> for A {
type Output = (); type Output = ();
fn index(&self, _: str) -> &Self::Output { panic!() } fn index(&self, _: str) -> &Self::Output {
panic!()
}
} }
impl ops::IndexMut<str> for A { impl ops::IndexMut<str> for A {
fn index_mut(&mut self, _: str) -> &mut Self::Output { panic!() } fn index_mut(&mut self, _: str) -> &mut Self::Output {
panic!()
}
} }
fn main() {} fn main() {}

View File

@@ -1,6 +1,6 @@
// run-pass // run-pass
#![feature(unsized_locals)] #![feature(unsized_locals, unsized_fn_params)]
pub fn f0(_f: dyn FnOnce()) {} pub fn f0(_f: dyn FnOnce()) {}
pub fn f1(_s: str) {} pub fn f1(_s: str) {}

View File

@@ -132,11 +132,11 @@ LL | fn g1<X: ?Sized>(x: X) {}
| | | |
| this type parameter needs to be `Sized` | this type parameter needs to be `Sized`
| |
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | fn g1<X: ?Sized>(x: &X) {} LL | fn g1<X: ?Sized>(&x: X) {}
| ^ | ^
error[E0277]: the size for values of type `X` cannot be known at compilation time error[E0277]: the size for values of type `X` cannot be known at compilation time
--> $DIR/unsized6.rs:40:22 --> $DIR/unsized6.rs:40:22
@@ -146,11 +146,11 @@ LL | fn g2<X: ?Sized + T>(x: X) {}
| | | |
| this type parameter needs to be `Sized` | this type parameter needs to be `Sized`
| |
= help: unsized locals are gated as an unstable feature = help: unsized fn params are gated as an unstable feature
help: function arguments must have a statically known size, borrowed types always have a known size help: function arguments must have a statically known size, borrowed types always have a known size
| |
LL | fn g2<X: ?Sized + T>(x: &X) {} LL | fn g2<X: ?Sized + T>(&x: X) {}
| ^ | ^
error: aborting due to 13 previous errors error: aborting due to 13 previous errors