From 708fc3b1a2c6f9e6c83cfdba3e5e90855b054cd8 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 16 Oct 2020 17:46:59 -0300 Subject: [PATCH 01/22] Add unsized_fn_params feature --- compiler/rustc_feature/src/active.rs | 3 ++ .../src/borrow_check/type_check/mod.rs | 14 ++++---- .../src/build/expr/as_operand.rs | 2 +- compiler/rustc_span/src/symbol.rs | 1 + .../src/traits/error_reporting/suggestions.rs | 4 +-- compiler/rustc_typeck/src/check/check.rs | 4 +-- compiler/rustc_typeck/src/check/expr.rs | 2 +- .../rustc_typeck/src/check/gather_locals.rs | 32 ++++++++++++++++--- compiler/rustc_typeck/src/check/mod.rs | 2 +- library/alloc/src/lib.rs | 3 +- library/core/src/lib.rs | 1 + .../long-live-the-unsized-temporary.rs | 9 ++---- .../issue-72590-type-error-sized.stderr | 2 +- src/test/ui/closures/issue-41366.stderr | 2 +- src/test/ui/error-codes/E0277.stderr | 6 ++-- .../feature-gate-unsized_fn_params.rs | 26 +++++++++++++++ .../feature-gate-unsized_fn_params.stderr | 26 +++++++++++++++ .../feature-gate-unsized_locals.stderr | 6 ++-- src/test/ui/fn/dyn-fn-alignment.rs | 2 +- src/test/ui/issues/issue-17651.stderr | 2 +- src/test/ui/issues/issue-27078.stderr | 2 +- src/test/ui/issues/issue-30355.stderr | 2 +- src/test/ui/issues/issue-38954.stderr | 2 +- src/test/ui/issues/issue-41229-ref-str.stderr | 2 +- src/test/ui/issues/issue-42312.stderr | 4 +-- src/test/ui/issues/issue-5883.stderr | 6 ++-- ...-same-trait-object-with-separate-params.rs | 2 +- src/test/ui/resolve/issue-5035-2.stderr | 6 ++-- src/test/ui/suggestions/path-by-value.stderr | 6 ++-- .../trait-bounds-not-on-bare-trait.stderr | 6 ++-- src/test/ui/unsized-locals/autoderef.rs | 3 +- .../ui/unsized-locals/auxiliary/ufuncs.rs | 2 +- .../ui/unsized-locals/borrow-after-move.rs | 2 +- ...y-value-trait-object-safety-withdefault.rs | 3 +- src/test/ui/unsized-locals/double-move.rs | 2 +- .../issue-30276-feature-flagged.stderr | 6 ++-- src/test/ui/unsized-locals/issue-30276.stderr | 2 +- .../issue-50940-with-feature.rs | 2 +- src/test/ui/unsized-locals/issue-50940.stderr | 2 +- .../ui/unsized-locals/unsized-exprs-rpass.rs | 10 ++---- src/test/ui/unsized-locals/unsized-exprs.rs | 2 +- src/test/ui/unsized-locals/unsized-exprs2.rs | 2 +- .../ui/unsized-locals/unsized-exprs3.stderr | 2 +- src/test/ui/unsized-locals/unsized-index.rs | 10 ++++-- .../ui/unsized-locals/unsized-parameters.rs | 2 +- src/test/ui/unsized6.stderr | 12 +++---- 46 files changed, 165 insertions(+), 86 deletions(-) create mode 100644 src/test/ui/feature-gates/feature-gate-unsized_fn_params.rs create mode 100644 src/test/ui/feature-gates/feature-gate-unsized_fn_params.stderr diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs index f5c530c192aa0..8a5a1066b06c8 100644 --- a/compiler/rustc_feature/src/active.rs +++ b/compiler/rustc_feature/src/active.rs @@ -607,6 +607,9 @@ declare_features! ( /// Allow anonymous constants from an inline `const` block (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 // ------------------------------------------------------------------------- diff --git a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs index 4fc1c570e4602..1bd4440c9c823 100644 --- a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs +++ b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs @@ -1456,7 +1456,9 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } 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 { def_id: tcx.require_lang_item(LangItem::Sized, Some(self.last_span)), 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`. - if self.tcx().features().unsized_locals { + if self.tcx().features().unsized_locals || self.tcx().features().unsized_fn_params { let span = term.source_info.span; self.ensure_place_sized(dest_ty, span); } @@ -1880,9 +1882,9 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { 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`. - 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 ty = local_decl.ty; self.ensure_place_sized(ty, span); @@ -2024,7 +2026,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { Rvalue::NullaryOp(_, ty) => { // 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; self.ensure_place_sized(ty, span); } diff --git a/compiler/rustc_mir_build/src/build/expr/as_operand.rs b/compiler/rustc_mir_build/src/build/expr/as_operand.rs index aac93f313f4e1..cf075abc94bf5 100644 --- a/compiler/rustc_mir_build/src/build/expr/as_operand.rs +++ b/compiler/rustc_mir_build/src/build/expr/as_operand.rs @@ -165,7 +165,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let tcx = this.hir.tcx(); - if tcx.features().unsized_locals { + if tcx.features().unsized_fn_params { let ty = expr.ty; let span = expr.span; let param_env = this.hir.param_env; diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index 080afdcd2c036..beee162eaed2d 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -1161,6 +1161,7 @@ symbols! { unsafe_cell, unsafe_no_drop_flag, unsize, + unsized_fn_params, unsized_locals, unsized_tuple_coercion, unstable, diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs index fa837e04db35e..c0881befe2481 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs @@ -1845,9 +1845,9 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { err.note("all function arguments must have a statically known size"); } 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 => { diff --git a/compiler/rustc_typeck/src/check/check.rs b/compiler/rustc_typeck/src/check/check.rs index 8f2537404c5cc..40366003d4341 100644 --- a/compiler/rustc_typeck/src/check/check.rs +++ b/compiler/rustc_typeck/src/check/check.rs @@ -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_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` // (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 // 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() && !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)); } diff --git a/compiler/rustc_typeck/src/check/expr.rs b/compiler/rustc_typeck/src/check/expr.rs index b0417fca25310..5eba7be3b02dc 100644 --- a/compiler/rustc_typeck/src/check/expr.rs +++ b/compiler/rustc_typeck/src/check/expr.rs @@ -476,7 +476,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { if let ty::FnDef(..) = ty.kind() { 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, // but don't want to expose the removal to stable Rust. // i.e., we don't want to allow diff --git a/compiler/rustc_typeck/src/check/gather_locals.rs b/compiler/rustc_typeck/src/check/gather_locals.rs index 1d505cfa69804..d5e45c3b89f31 100644 --- a/compiler/rustc_typeck/src/check/gather_locals.rs +++ b/compiler/rustc_typeck/src/check/gather_locals.rs @@ -10,11 +10,19 @@ use rustc_trait_selection::traits; pub(super) struct GatherLocalsVisitor<'a, 'tcx> { fcx: &'a FnCtxt<'a, 'tcx>, 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> { - pub(super) fn new(fcx: &'a FnCtxt<'a, 'tcx>, parent_id: hir::HirId) -> Self { - Self { fcx, parent_id } + pub(super) fn new( + 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>) -> Ty<'tcx> { @@ -88,13 +96,29 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> { 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. fn visit_pat(&mut self, p: &'tcx hir::Pat<'tcx>) { if let PatKind::Binding(_, _, ident, _) = p.kind { let var_ty = self.assign(p.span, p.hir_id, None); - if !self.fcx.tcx.features().unsized_locals { - self.fcx.require_type_is_sized(var_ty, p.span, traits::VariableType(p.hir_id)); + if self.within_fn_param { + 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!( diff --git a/compiler/rustc_typeck/src/check/mod.rs b/compiler/rustc_typeck/src/check/mod.rs index 169ad0df3a5c9..4ec114b1f2c5e 100644 --- a/compiler/rustc_typeck/src/check/mod.rs +++ b/compiler/rustc_typeck/src/check/mod.rs @@ -553,7 +553,7 @@ fn typeck_with_fallback<'tcx>( }; // 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); diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs index 0fe15958076c5..405667e0b2aa6 100644 --- a/library/alloc/src/lib.rs +++ b/library/alloc/src/lib.rs @@ -130,7 +130,8 @@ #![feature(unicode_internals)] #![feature(unsafe_block_in_unsafe_fn)] #![feature(unsize)] -#![feature(unsized_locals)] +#![cfg_attr(not(bootstrap), feature(unsized_fn_params))] +#![cfg_attr(bootstrap, feature(unsized_locals))] #![feature(allocator_internals)] #![feature(slice_partition_dedup)] #![feature(maybe_uninit_extra, maybe_uninit_slice, maybe_uninit_uninit_array)] diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs index 6cb240d1730ed..6de766ffd5679 100644 --- a/library/core/src/lib.rs +++ b/library/core/src/lib.rs @@ -133,6 +133,7 @@ #![feature(try_blocks)] #![feature(unboxed_closures)] #![feature(unsized_locals)] +#![cfg_attr(not(bootstrap), feature(unsized_fn_params))] #![cfg_attr(bootstrap, feature(untagged_unions))] #![feature(unwind_attributes)] #![feature(variant_count)] diff --git a/src/test/run-pass-valgrind/unsized-locals/long-live-the-unsized-temporary.rs b/src/test/run-pass-valgrind/unsized-locals/long-live-the-unsized-temporary.rs index 2f275f88d963e..a7b9052617f0c 100644 --- a/src/test/run-pass-valgrind/unsized-locals/long-live-the-unsized-temporary.rs +++ b/src/test/run-pass-valgrind/unsized-locals/long-live-the-unsized-temporary.rs @@ -1,4 +1,5 @@ -#![feature(unsized_locals)] +#![allow(incomplete_features)] +#![feature(unsized_locals, unsized_fn_params)] use std::fmt; @@ -45,11 +46,7 @@ fn main() { { let x: fmt::Display = *gen_foo(); - let x = if true { - x - } else { - *gen_foo() - }; + let x = if true { x } else { *gen_foo() }; foo(x); } } diff --git a/src/test/ui/async-await/issue-72590-type-error-sized.stderr b/src/test/ui/async-await/issue-72590-type-error-sized.stderr index 785fe21dd3142..0f90a4c336c57 100644 --- a/src/test/ui/async-await/issue-72590-type-error-sized.stderr +++ b/src/test/ui/async-await/issue-72590-type-error-sized.stderr @@ -18,7 +18,7 @@ LL | async fn frob(self) {} | = help: within `Foo`, the trait `Sized` is not implemented for `str` = 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 | LL | async fn frob(&self) {} diff --git a/src/test/ui/closures/issue-41366.stderr b/src/test/ui/closures/issue-41366.stderr index 200d411b51194..72ef5b3b962c7 100644 --- a/src/test/ui/closures/issue-41366.stderr +++ b/src/test/ui/closures/issue-41366.stderr @@ -16,7 +16,7 @@ LL | (&|_| ()) as &dyn for<'x> Fn(>::V); | ^ doesn't have a size known at compile-time | = help: the trait `Sized` is not implemented for `>::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 | LL | fn main() where >::V: Sized { diff --git a/src/test/ui/error-codes/E0277.stderr b/src/test/ui/error-codes/E0277.stderr index c2e15007cf9d3..647e0c7d76ff2 100644 --- a/src/test/ui/error-codes/E0277.stderr +++ b/src/test/ui/error-codes/E0277.stderr @@ -6,11 +6,11 @@ LL | fn f(p: Path) { } | = help: within `Path`, the trait `Sized` is not implemented for `[u8]` = 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 | -LL | fn f(p: &Path) { } - | ^ +LL | fn f(&p: Path) { } + | ^ error[E0277]: the trait bound `i32: Foo` is not satisfied --> $DIR/E0277.rs:17:15 diff --git a/src/test/ui/feature-gates/feature-gate-unsized_fn_params.rs b/src/test/ui/feature-gates/feature-gate-unsized_fn_params.rs new file mode 100644 index 0000000000000..45bde37a3ac5e --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-unsized_fn_params.rs @@ -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 = Box::new(A { v: 22 }); + foo(*x); + //~^ ERROR: the size for values of type `(dyn Foo + 'static)` cannot be known at compilation time [E0277] +} diff --git a/src/test/ui/feature-gates/feature-gate-unsized_fn_params.stderr b/src/test/ui/feature-gates/feature-gate-unsized_fn_params.stderr new file mode 100644 index 0000000000000..71acbb174ac66 --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-unsized_fn_params.stderr @@ -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`. diff --git a/src/test/ui/feature-gates/feature-gate-unsized_locals.stderr b/src/test/ui/feature-gates/feature-gate-unsized_locals.stderr index 29595c923768d..522542208724b 100644 --- a/src/test/ui/feature-gates/feature-gate-unsized_locals.stderr +++ b/src/test/ui/feature-gates/feature-gate-unsized_locals.stderr @@ -5,11 +5,11 @@ LL | fn f(f: dyn FnOnce()) {} | ^ doesn't have a size known at compile-time | = 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 | -LL | fn f(f: &dyn FnOnce()) {} - | ^ +LL | fn f(&f: dyn FnOnce()) {} + | ^ error: aborting due to previous error diff --git a/src/test/ui/fn/dyn-fn-alignment.rs b/src/test/ui/fn/dyn-fn-alignment.rs index 125f44bbf0093..ecd7c1744a008 100644 --- a/src/test/ui/fn/dyn-fn-alignment.rs +++ b/src/test/ui/fn/dyn-fn-alignment.rs @@ -1,6 +1,6 @@ // run-pass -#![feature(unsized_locals)] +#![feature(unsized_fn_params)] #![allow(dead_code)] #[repr(align(256))] struct A { diff --git a/src/test/ui/issues/issue-17651.stderr b/src/test/ui/issues/issue-17651.stderr index 987f4e97f36a6..69817f10c9f32 100644 --- a/src/test/ui/issues/issue-17651.stderr +++ b/src/test/ui/issues/issue-17651.stderr @@ -15,7 +15,7 @@ LL | (|| Box::new(*(&[0][..])))(); | = help: the trait `Sized` is not implemented for `[{integer}]` = 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 diff --git a/src/test/ui/issues/issue-27078.stderr b/src/test/ui/issues/issue-27078.stderr index 006389f75375d..021a08696de2c 100644 --- a/src/test/ui/issues/issue-27078.stderr +++ b/src/test/ui/issues/issue-27078.stderr @@ -4,7 +4,7 @@ error[E0277]: the size for values of type `Self` cannot be known at compilation LL | fn foo(self) -> &'static i32 { | ^^^^ 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` | LL | fn foo(self) -> &'static i32 where Self: Sized { diff --git a/src/test/ui/issues/issue-30355.stderr b/src/test/ui/issues/issue-30355.stderr index db7a5a7f6dcfe..79f5db650d9dc 100644 --- a/src/test/ui/issues/issue-30355.stderr +++ b/src/test/ui/issues/issue-30355.stderr @@ -6,7 +6,7 @@ LL | &X(*Y) | = help: the trait `Sized` is not implemented for `[u8]` = 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 diff --git a/src/test/ui/issues/issue-38954.stderr b/src/test/ui/issues/issue-38954.stderr index bc40fd07c5a8e..f76063fc55872 100644 --- a/src/test/ui/issues/issue-38954.stderr +++ b/src/test/ui/issues/issue-38954.stderr @@ -5,7 +5,7 @@ LL | fn _test(ref _p: str) {} | ^^^^^^ doesn't have a size known at compile-time | = 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 | LL | fn _test(ref _p: &str) {} diff --git a/src/test/ui/issues/issue-41229-ref-str.stderr b/src/test/ui/issues/issue-41229-ref-str.stderr index c5c848e63e6d5..8b37e5e9774e5 100644 --- a/src/test/ui/issues/issue-41229-ref-str.stderr +++ b/src/test/ui/issues/issue-41229-ref-str.stderr @@ -5,7 +5,7 @@ LL | pub fn example(ref s: str) {} | ^^^^^ doesn't have a size known at compile-time | = 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 | LL | pub fn example(ref s: &str) {} diff --git a/src/test/ui/issues/issue-42312.stderr b/src/test/ui/issues/issue-42312.stderr index b55a724c0dbe6..f69c2a9925de7 100644 --- a/src/test/ui/issues/issue-42312.stderr +++ b/src/test/ui/issues/issue-42312.stderr @@ -5,7 +5,7 @@ LL | fn baz(_: Self::Target) where Self: Deref {} | ^ doesn't have a size known at compile-time | = help: the trait `Sized` is not implemented for `::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 | LL | fn baz(_: Self::Target) where Self: Deref, ::Target: Sized {} @@ -22,7 +22,7 @@ LL | pub fn f(_: dyn ToString) {} | ^ doesn't have a size known at compile-time | = 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 | LL | pub fn f(_: &dyn ToString) {} diff --git a/src/test/ui/issues/issue-5883.stderr b/src/test/ui/issues/issue-5883.stderr index 8d639304ab6e7..5798733e04be0 100644 --- a/src/test/ui/issues/issue-5883.stderr +++ b/src/test/ui/issues/issue-5883.stderr @@ -5,11 +5,11 @@ LL | fn new_struct(r: dyn A + 'static) | ^ doesn't have a size known at compile-time | = 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 | -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 --> $DIR/issue-5883.rs:8:8 diff --git a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs index 5ceba64678410..abd2faa7dc659 100644 --- a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs +++ b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs @@ -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, // it checks that the `ObjectCandidate` you get from method matching can't diff --git a/src/test/ui/resolve/issue-5035-2.stderr b/src/test/ui/resolve/issue-5035-2.stderr index 5078ffbec7324..b2084a7a426a6 100644 --- a/src/test/ui/resolve/issue-5035-2.stderr +++ b/src/test/ui/resolve/issue-5035-2.stderr @@ -5,11 +5,11 @@ LL | fn foo(_x: K) {} | ^^ doesn't have a size known at compile-time | = 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 | -LL | fn foo(_x: &K) {} - | ^ +LL | fn foo(&_x: K) {} + | ^ error: aborting due to previous error diff --git a/src/test/ui/suggestions/path-by-value.stderr b/src/test/ui/suggestions/path-by-value.stderr index ea0c63ac257c4..19fc3406ccfe4 100644 --- a/src/test/ui/suggestions/path-by-value.stderr +++ b/src/test/ui/suggestions/path-by-value.stderr @@ -6,11 +6,11 @@ LL | fn f(p: Path) { } | = help: within `Path`, the trait `Sized` is not implemented for `[u8]` = 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 | -LL | fn f(p: &Path) { } - | ^ +LL | fn f(&p: Path) { } + | ^ error: aborting due to previous error diff --git a/src/test/ui/traits/trait-bounds-not-on-bare-trait.stderr b/src/test/ui/traits/trait-bounds-not-on-bare-trait.stderr index b403fb4184d37..48eedc0b0ea43 100644 --- a/src/test/ui/traits/trait-bounds-not-on-bare-trait.stderr +++ b/src/test/ui/traits/trait-bounds-not-on-bare-trait.stderr @@ -13,11 +13,11 @@ LL | fn foo(_x: Foo + Send) { | ^^ doesn't have a size known at compile-time | = 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 | -LL | fn foo(_x: &Foo + Send) { - | ^ +LL | fn foo(&_x: Foo + Send) { + | ^ error: aborting due to previous error; 1 warning emitted diff --git a/src/test/ui/unsized-locals/autoderef.rs b/src/test/ui/unsized-locals/autoderef.rs index 7f2d2f9c7ef3b..63d9ce6d3c3e5 100644 --- a/src/test/ui/unsized-locals/autoderef.rs +++ b/src/test/ui/unsized-locals/autoderef.rs @@ -1,6 +1,6 @@ // run-pass -#![feature(unsized_locals)] +#![feature(unsized_locals, unsized_fn_params)] pub trait Foo { fn foo(self) -> String; @@ -24,7 +24,6 @@ impl Foo for dyn FnMut() -> String { } } - fn main() { let x = *(Box::new(['h', 'e', 'l', 'l', 'o']) as Box<[char]>); assert_eq!(&x.foo() as &str, "hello"); diff --git a/src/test/ui/unsized-locals/auxiliary/ufuncs.rs b/src/test/ui/unsized-locals/auxiliary/ufuncs.rs index 065563d45a472..5954abf3a1fc5 100644 --- a/src/test/ui/unsized-locals/auxiliary/ufuncs.rs +++ b/src/test/ui/unsized-locals/auxiliary/ufuncs.rs @@ -1,3 +1,3 @@ -#![feature(unsized_locals)] +#![feature(unsized_locals, unsized_fn_params)] pub fn udrop(_x: T) {} diff --git a/src/test/ui/unsized-locals/borrow-after-move.rs b/src/test/ui/unsized-locals/borrow-after-move.rs index 3299fdf3a9ce8..4e02ea6a4f49f 100644 --- a/src/test/ui/unsized-locals/borrow-after-move.rs +++ b/src/test/ui/unsized-locals/borrow-after-move.rs @@ -1,4 +1,4 @@ -#![feature(unsized_locals)] +#![feature(unsized_locals, unsized_fn_params)] pub trait Foo { fn foo(self) -> String; diff --git a/src/test/ui/unsized-locals/by-value-trait-object-safety-withdefault.rs b/src/test/ui/unsized-locals/by-value-trait-object-safety-withdefault.rs index 8b39a99da582e..b05504fbe820d 100644 --- a/src/test/ui/unsized-locals/by-value-trait-object-safety-withdefault.rs +++ b/src/test/ui/unsized-locals/by-value-trait-object-safety-withdefault.rs @@ -1,6 +1,6 @@ // run-pass -#![feature(unsized_locals)] +#![feature(unsized_locals, unsized_fn_params)] pub trait Foo { fn foo(self) -> String { @@ -12,7 +12,6 @@ struct A; impl Foo for A {} - fn main() { let x = *(Box::new(A) as Box); assert_eq!(x.foo(), format!("hello")); diff --git a/src/test/ui/unsized-locals/double-move.rs b/src/test/ui/unsized-locals/double-move.rs index c3a50341bc962..5c430a0c388e3 100644 --- a/src/test/ui/unsized-locals/double-move.rs +++ b/src/test/ui/unsized-locals/double-move.rs @@ -1,4 +1,4 @@ -#![feature(unsized_locals)] +#![feature(unsized_locals, unsized_fn_params)] pub trait Foo { fn foo(self) -> String; diff --git a/src/test/ui/unsized-locals/issue-30276-feature-flagged.stderr b/src/test/ui/unsized-locals/issue-30276-feature-flagged.stderr index 46e381611a1e6..be033c0b176d7 100644 --- a/src/test/ui/unsized-locals/issue-30276-feature-flagged.stderr +++ b/src/test/ui/unsized-locals/issue-30276-feature-flagged.stderr @@ -4,9 +4,9 @@ error[E0277]: the size for values of type `[i32]` cannot be known at compilation LL | let _x: fn(_) -> Test = Test; | ^^^^ doesn't have a size known at compile-time | - = help: within `Test`, the trait `Sized` is not implemented for `[i32]` - = note: required because it appears within the type `Test` - = note: the return type of a function must have a statically known size + = help: the trait `Sized` is not implemented for `[i32]` + = note: all function arguments must have a statically known size + = help: unsized fn params are gated as an unstable feature error: aborting due to previous error diff --git a/src/test/ui/unsized-locals/issue-30276.stderr b/src/test/ui/unsized-locals/issue-30276.stderr index e9258a61c32b7..8cccbd792da5c 100644 --- a/src/test/ui/unsized-locals/issue-30276.stderr +++ b/src/test/ui/unsized-locals/issue-30276.stderr @@ -6,7 +6,7 @@ LL | let _x: fn(_) -> Test = Test; | = help: the trait `Sized` is not implemented for `[i32]` = 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 diff --git a/src/test/ui/unsized-locals/issue-50940-with-feature.rs b/src/test/ui/unsized-locals/issue-50940-with-feature.rs index 3e5d39ab31150..310dfc9b62326 100644 --- a/src/test/ui/unsized-locals/issue-50940-with-feature.rs +++ b/src/test/ui/unsized-locals/issue-50940-with-feature.rs @@ -1,4 +1,4 @@ -#![feature(unsized_locals)] +#![feature(unsized_locals, unsized_fn_params)] fn main() { struct A(X); diff --git a/src/test/ui/unsized-locals/issue-50940.stderr b/src/test/ui/unsized-locals/issue-50940.stderr index c602fae883c40..8f09b460e004b 100644 --- a/src/test/ui/unsized-locals/issue-50940.stderr +++ b/src/test/ui/unsized-locals/issue-50940.stderr @@ -6,7 +6,7 @@ LL | A as fn(str) -> A; | = help: the trait `Sized` is not implemented for `str` = 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 diff --git a/src/test/ui/unsized-locals/unsized-exprs-rpass.rs b/src/test/ui/unsized-locals/unsized-exprs-rpass.rs index 24c2758a0a255..fc564d16ddb68 100644 --- a/src/test/ui/unsized-locals/unsized-exprs-rpass.rs +++ b/src/test/ui/unsized-locals/unsized-exprs-rpass.rs @@ -1,6 +1,6 @@ // run-pass #![allow(unused_braces, unused_parens)] -#![feature(unsized_tuple_coercion, unsized_locals)] +#![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] struct A(X); @@ -24,12 +24,8 @@ fn main() { udrop::<[u8]>(loop { break *foo(); }); - udrop::<[u8]>(if true { - *foo() - } else { - *foo() - }); - udrop::<[u8]>({*foo()}); + udrop::<[u8]>(if true { *foo() } else { *foo() }); + udrop::<[u8]>({ *foo() }); udrop::<[u8]>((*foo())); udrop::<[u8]>((*tfoo()).1); *afoo() + 42; diff --git a/src/test/ui/unsized-locals/unsized-exprs.rs b/src/test/ui/unsized-locals/unsized-exprs.rs index 8ca88edcb6add..be3140db86b72 100644 --- a/src/test/ui/unsized-locals/unsized-exprs.rs +++ b/src/test/ui/unsized-locals/unsized-exprs.rs @@ -1,4 +1,4 @@ -#![feature(unsized_tuple_coercion, unsized_locals)] +#![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] struct A(X); diff --git a/src/test/ui/unsized-locals/unsized-exprs2.rs b/src/test/ui/unsized-locals/unsized-exprs2.rs index 534439aa6c41c..495316c276e8d 100644 --- a/src/test/ui/unsized-locals/unsized-exprs2.rs +++ b/src/test/ui/unsized-locals/unsized-exprs2.rs @@ -1,4 +1,4 @@ -#![feature(unsized_tuple_coercion, unsized_locals)] +#![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] struct A(X); diff --git a/src/test/ui/unsized-locals/unsized-exprs3.stderr b/src/test/ui/unsized-locals/unsized-exprs3.stderr index 426262e82b751..57d9978225a2d 100644 --- a/src/test/ui/unsized-locals/unsized-exprs3.stderr +++ b/src/test/ui/unsized-locals/unsized-exprs3.stderr @@ -6,7 +6,7 @@ LL | udrop as fn([u8]); | = help: the trait `Sized` is not implemented for `[u8]` = 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 diff --git a/src/test/ui/unsized-locals/unsized-index.rs b/src/test/ui/unsized-locals/unsized-index.rs index 19ad97a853e83..470e0e2f12ea5 100644 --- a/src/test/ui/unsized-locals/unsized-index.rs +++ b/src/test/ui/unsized-locals/unsized-index.rs @@ -5,7 +5,7 @@ // Tightening the bound now could be a breaking change. Although no crater // regression were observed (https://github.com/rust-lang/rust/pull/59527), // let's be conservative and just add a test for this. -#![feature(unsized_locals)] +#![feature(unsized_locals, unsized_fn_params)] use std::ops; @@ -13,11 +13,15 @@ pub struct A; impl ops::Index for A { type Output = (); - fn index(&self, _: str) -> &Self::Output { panic!() } + fn index(&self, _: str) -> &Self::Output { + panic!() + } } impl ops::IndexMut for A { - fn index_mut(&mut self, _: str) -> &mut Self::Output { panic!() } + fn index_mut(&mut self, _: str) -> &mut Self::Output { + panic!() + } } fn main() {} diff --git a/src/test/ui/unsized-locals/unsized-parameters.rs b/src/test/ui/unsized-locals/unsized-parameters.rs index 3624154d5c44c..6d87f07f43b18 100644 --- a/src/test/ui/unsized-locals/unsized-parameters.rs +++ b/src/test/ui/unsized-locals/unsized-parameters.rs @@ -1,6 +1,6 @@ // run-pass -#![feature(unsized_locals)] +#![feature(unsized_locals, unsized_fn_params)] pub fn f0(_f: dyn FnOnce()) {} pub fn f1(_s: str) {} diff --git a/src/test/ui/unsized6.stderr b/src/test/ui/unsized6.stderr index e85b73355e90f..71dac236fa316 100644 --- a/src/test/ui/unsized6.stderr +++ b/src/test/ui/unsized6.stderr @@ -132,11 +132,11 @@ LL | fn g1(x: X) {} | | | 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 | -LL | fn g1(x: &X) {} - | ^ +LL | fn g1(&x: X) {} + | ^ error[E0277]: the size for values of type `X` cannot be known at compilation time --> $DIR/unsized6.rs:40:22 @@ -146,11 +146,11 @@ LL | fn g2(x: X) {} | | | 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 | -LL | fn g2(x: &X) {} - | ^ +LL | fn g2(&x: X) {} + | ^ error: aborting due to 13 previous errors From 953d7a64a5843b35e9e27ba1c8f725ff3cde35d0 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 16 Oct 2020 19:37:54 -0300 Subject: [PATCH 02/22] Add unsized_locals to INCOMPLETE_FEATURES list --- compiler/rustc_feature/src/active.rs | 1 + src/test/ui/error-codes/E0161.rs | 2 +- ...-same-trait-object-with-separate-params.rs | 1 + ...e-trait-object-with-separate-params.stderr | 29 ++++++++++++------- src/test/ui/moves/move-out-of-slice-2.rs | 9 +++--- src/test/ui/moves/move-out-of-slice-2.stderr | 27 +++++++++++------ src/test/ui/unsized-locals/autoderef.rs | 1 + .../ui/unsized-locals/borrow-after-move.rs | 1 + .../unsized-locals/borrow-after-move.stderr | 23 ++++++++++----- .../by-value-trait-object-safety-rpass.rs | 2 +- ...y-value-trait-object-safety-withdefault.rs | 1 + .../by-value-trait-object-safety.rs | 6 ++-- .../by-value-trait-object-safety.stderr | 17 ++++++++--- src/test/ui/unsized-locals/double-move.rs | 1 + src/test/ui/unsized-locals/double-move.stderr | 25 +++++++++++----- .../issue-30276-feature-flagged.rs | 1 + .../issue-30276-feature-flagged.stderr | 13 +++++++-- .../issue-50940-with-feature.rs | 1 + .../issue-50940-with-feature.stderr | 13 +++++++-- .../reference-unsized-locals.rs | 1 + .../unsized-locals/simple-unsized-locals.rs | 1 + .../ui/unsized-locals/unsized-exprs-rpass.rs | 2 +- src/test/ui/unsized-locals/unsized-exprs.rs | 1 + .../ui/unsized-locals/unsized-exprs.stderr | 17 ++++++++--- src/test/ui/unsized-locals/unsized-exprs2.rs | 1 + .../ui/unsized-locals/unsized-exprs2.stderr | 13 +++++++-- src/test/ui/unsized-locals/unsized-index.rs | 1 + .../ui/unsized-locals/unsized-parameters.rs | 1 + 28 files changed, 155 insertions(+), 57 deletions(-) diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs index 8a5a1066b06c8..ad926a810e6bf 100644 --- a/compiler/rustc_feature/src/active.rs +++ b/compiler/rustc_feature/src/active.rs @@ -632,6 +632,7 @@ pub const INCOMPLETE_FEATURES: &[Symbol] = &[ sym::specialization, sym::inline_const, sym::repr128, + sym::unsized_locals, ]; /// Some features are not allowed to be used together at the same time, if diff --git a/src/test/ui/error-codes/E0161.rs b/src/test/ui/error-codes/E0161.rs index 58217ff74b8d6..e0f5776424e09 100644 --- a/src/test/ui/error-codes/E0161.rs +++ b/src/test/ui/error-codes/E0161.rs @@ -9,13 +9,13 @@ //[zflagsul]compile-flags: -Z borrowck=migrate //[editionul]edition:2018 +#![allow(incomplete_features)] #![cfg_attr(nll, feature(nll))] #![cfg_attr(nllul, feature(nll))] #![cfg_attr(migrateul, feature(unsized_locals))] #![cfg_attr(zflagsul, feature(unsized_locals))] #![cfg_attr(nllul, feature(unsized_locals))] #![cfg_attr(editionul, feature(unsized_locals))] - #![feature(box_syntax)] fn foo(x: Box<[i32]>) { diff --git a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs index abd2faa7dc659..4ea0a609af4c4 100644 --- a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs +++ b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs @@ -1,4 +1,5 @@ #![feature(arbitrary_self_types, coerce_unsized, dispatch_from_dyn, unsize, unsized_locals, unsized_fn_params)] +//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] // This tests a few edge-cases around `arbitrary_self_types`. Most specifically, // it checks that the `ObjectCandidate` you get from method matching can't diff --git a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr index 08be7ee155e9d..4a06a95120ac7 100644 --- a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr +++ b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr @@ -1,5 +1,14 @@ +warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:1:77 + | +LL | #![feature(arbitrary_self_types, coerce_unsized, dispatch_from_dyn, unsize, unsized_locals, unsized_fn_params)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #48055 for more information + error[E0308]: mismatched types - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:85:24 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:86:24 | LL | let _seetype: () = z; | -- ^ expected `()`, found `u32` @@ -7,7 +16,7 @@ LL | let _seetype: () = z; | expected due to this error[E0308]: mismatched types - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:102:24 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:103:24 | LL | let _seetype: () = z; | -- ^ expected `()`, found `u64` @@ -15,23 +24,23 @@ LL | let _seetype: () = z; | expected due to this error[E0034]: multiple applicable items in scope - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:120:15 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:121:15 | LL | let z = x.foo(); | ^^^ multiple `foo` found | note: candidate #1 is defined in an impl of the trait `X` for the type `T` - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:43:9 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:44:9 | LL | fn foo(self: Smaht) -> u64 { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: candidate #2 is defined in an impl of the trait `NuisanceFoo` for the type `T` - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:70:9 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:71:9 | LL | fn foo(self) {} | ^^^^^^^^^^^^ note: candidate #3 is defined in the trait `FinalFoo` - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:57:5 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:58:5 | LL | fn foo(&self) -> u8; | ^^^^^^^^^^^^^^^^^^^^ @@ -49,7 +58,7 @@ LL | let z = FinalFoo::foo(x); | ^^^^^^^^^^^^^^^^ error[E0308]: mismatched types - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:137:24 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:138:24 | LL | let _seetype: () = z; | -- ^ expected `()`, found `u8` @@ -57,7 +66,7 @@ LL | let _seetype: () = z; | expected due to this error[E0308]: mismatched types - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:155:24 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:156:24 | LL | let _seetype: () = z; | -- ^ expected `()`, found `u32` @@ -65,14 +74,14 @@ LL | let _seetype: () = z; | expected due to this error[E0308]: mismatched types - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:172:24 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:173:24 | LL | let _seetype: () = z; | -- ^ expected `()`, found `u32` | | | expected due to this -error: aborting due to 6 previous errors +error: aborting due to 6 previous errors; 1 warning emitted Some errors have detailed explanations: E0034, E0308. For more information about an error, try `rustc --explain E0034`. diff --git a/src/test/ui/moves/move-out-of-slice-2.rs b/src/test/ui/moves/move-out-of-slice-2.rs index 5c1a61eb375a4..d91be023ed794 100644 --- a/src/test/ui/moves/move-out-of-slice-2.rs +++ b/src/test/ui/moves/move-out-of-slice-2.rs @@ -1,4 +1,5 @@ #![feature(unsized_locals)] +//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] struct A; #[derive(Clone, Copy)] @@ -8,13 +9,13 @@ fn main() { let a: Box<[A]> = Box::new([A]); match *a { //~^ ERROR cannot move out of type `[A]`, a non-copy slice - [a @ ..] => {}, + [a @ ..] => {} _ => {} } let b: Box<[A]> = Box::new([A, A, A]); match *b { //~^ ERROR cannot move out of type `[A]`, a non-copy slice - [_, _, b @ .., _] => {}, + [_, _, b @ .., _] => {} _ => {} } @@ -22,13 +23,13 @@ fn main() { let c: Box<[C]> = Box::new([C]); match *c { //~^ ERROR cannot move out of type `[C]`, a non-copy slice - [c @ ..] => {}, + [c @ ..] => {} _ => {} } let d: Box<[C]> = Box::new([C, C, C]); match *d { //~^ ERROR cannot move out of type `[C]`, a non-copy slice - [_, _, d @ .., _] => {}, + [_, _, d @ .., _] => {} _ => {} } } diff --git a/src/test/ui/moves/move-out-of-slice-2.stderr b/src/test/ui/moves/move-out-of-slice-2.stderr index 058f34b24a3b6..9a863bf31a7fb 100644 --- a/src/test/ui/moves/move-out-of-slice-2.stderr +++ b/src/test/ui/moves/move-out-of-slice-2.stderr @@ -1,51 +1,60 @@ +warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/move-out-of-slice-2.rs:1:12 + | +LL | #![feature(unsized_locals)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #48055 for more information + error[E0508]: cannot move out of type `[A]`, a non-copy slice - --> $DIR/move-out-of-slice-2.rs:9:11 + --> $DIR/move-out-of-slice-2.rs:10:11 | LL | match *a { | ^^ cannot move out of here LL | -LL | [a @ ..] => {}, +LL | [a @ ..] => {} | ------ | | | data moved here | move occurs because `a` has type `[A]`, which does not implement the `Copy` trait error[E0508]: cannot move out of type `[A]`, a non-copy slice - --> $DIR/move-out-of-slice-2.rs:15:11 + --> $DIR/move-out-of-slice-2.rs:16:11 | LL | match *b { | ^^ cannot move out of here LL | -LL | [_, _, b @ .., _] => {}, +LL | [_, _, b @ .., _] => {} | ------ | | | data moved here | move occurs because `b` has type `[A]`, which does not implement the `Copy` trait error[E0508]: cannot move out of type `[C]`, a non-copy slice - --> $DIR/move-out-of-slice-2.rs:23:11 + --> $DIR/move-out-of-slice-2.rs:24:11 | LL | match *c { | ^^ cannot move out of here LL | -LL | [c @ ..] => {}, +LL | [c @ ..] => {} | ------ | | | data moved here | move occurs because `c` has type `[C]`, which does not implement the `Copy` trait error[E0508]: cannot move out of type `[C]`, a non-copy slice - --> $DIR/move-out-of-slice-2.rs:29:11 + --> $DIR/move-out-of-slice-2.rs:30:11 | LL | match *d { | ^^ cannot move out of here LL | -LL | [_, _, d @ .., _] => {}, +LL | [_, _, d @ .., _] => {} | ------ | | | data moved here | move occurs because `d` has type `[C]`, which does not implement the `Copy` trait -error: aborting due to 4 previous errors +error: aborting due to 4 previous errors; 1 warning emitted For more information about this error, try `rustc --explain E0508`. diff --git a/src/test/ui/unsized-locals/autoderef.rs b/src/test/ui/unsized-locals/autoderef.rs index 63d9ce6d3c3e5..5dd5898c12e5c 100644 --- a/src/test/ui/unsized-locals/autoderef.rs +++ b/src/test/ui/unsized-locals/autoderef.rs @@ -1,5 +1,6 @@ // run-pass +#![allow(incomplete_features)] #![feature(unsized_locals, unsized_fn_params)] pub trait Foo { diff --git a/src/test/ui/unsized-locals/borrow-after-move.rs b/src/test/ui/unsized-locals/borrow-after-move.rs index 4e02ea6a4f49f..bf305a318d842 100644 --- a/src/test/ui/unsized-locals/borrow-after-move.rs +++ b/src/test/ui/unsized-locals/borrow-after-move.rs @@ -1,4 +1,5 @@ #![feature(unsized_locals, unsized_fn_params)] +//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] pub trait Foo { fn foo(self) -> String; diff --git a/src/test/ui/unsized-locals/borrow-after-move.stderr b/src/test/ui/unsized-locals/borrow-after-move.stderr index b49c32f5f808d..5934276cc1dda 100644 --- a/src/test/ui/unsized-locals/borrow-after-move.stderr +++ b/src/test/ui/unsized-locals/borrow-after-move.stderr @@ -1,5 +1,14 @@ +warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/borrow-after-move.rs:1:12 + | +LL | #![feature(unsized_locals, unsized_fn_params)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #48055 for more information + error[E0382]: borrow of moved value: `x` - --> $DIR/borrow-after-move.rs:20:24 + --> $DIR/borrow-after-move.rs:21:24 | LL | let y = *x; | -- value moved here @@ -10,7 +19,7 @@ LL | println!("{}", &x); = note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait error[E0382]: borrow of moved value: `y` - --> $DIR/borrow-after-move.rs:22:24 + --> $DIR/borrow-after-move.rs:23:24 | LL | let y = *x; | - move occurs because `y` has type `str`, which does not implement the `Copy` trait @@ -21,7 +30,7 @@ LL | println!("{}", &y); | ^^ value borrowed here after move error[E0382]: borrow of moved value: `x` - --> $DIR/borrow-after-move.rs:30:24 + --> $DIR/borrow-after-move.rs:31:24 | LL | let y = *x; | -- value moved here @@ -32,7 +41,7 @@ LL | println!("{}", &x); = note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait error[E0382]: borrow of moved value: `y` - --> $DIR/borrow-after-move.rs:32:24 + --> $DIR/borrow-after-move.rs:33:24 | LL | let y = *x; | - move occurs because `y` has type `str`, which does not implement the `Copy` trait @@ -43,13 +52,13 @@ LL | println!("{}", &y); | ^^ value borrowed here after move | note: this function consumes the receiver `self` by taking ownership of it, which moves `y` - --> $DIR/borrow-after-move.rs:4:12 + --> $DIR/borrow-after-move.rs:5:12 | LL | fn foo(self) -> String; | ^^^^ error[E0382]: borrow of moved value: `x` - --> $DIR/borrow-after-move.rs:39:24 + --> $DIR/borrow-after-move.rs:40:24 | LL | let x = "hello".to_owned().into_boxed_str(); | - move occurs because `x` has type `Box`, which does not implement the `Copy` trait @@ -58,6 +67,6 @@ LL | x.foo(); LL | println!("{}", &x); | ^^ value borrowed here after move -error: aborting due to 5 previous errors +error: aborting due to 5 previous errors; 1 warning emitted For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/unsized-locals/by-value-trait-object-safety-rpass.rs b/src/test/ui/unsized-locals/by-value-trait-object-safety-rpass.rs index b07d1a571b212..b9881defac39a 100644 --- a/src/test/ui/unsized-locals/by-value-trait-object-safety-rpass.rs +++ b/src/test/ui/unsized-locals/by-value-trait-object-safety-rpass.rs @@ -1,5 +1,6 @@ // run-pass +#![allow(incomplete_features)] #![feature(unsized_locals)] pub trait Foo { @@ -14,7 +15,6 @@ impl Foo for A { } } - fn main() { let x = *(Box::new(A) as Box); assert_eq!(x.foo(), format!("hello")); diff --git a/src/test/ui/unsized-locals/by-value-trait-object-safety-withdefault.rs b/src/test/ui/unsized-locals/by-value-trait-object-safety-withdefault.rs index b05504fbe820d..957991f853b2d 100644 --- a/src/test/ui/unsized-locals/by-value-trait-object-safety-withdefault.rs +++ b/src/test/ui/unsized-locals/by-value-trait-object-safety-withdefault.rs @@ -1,5 +1,6 @@ // run-pass +#![allow(incomplete_features)] #![feature(unsized_locals, unsized_fn_params)] pub trait Foo { diff --git a/src/test/ui/unsized-locals/by-value-trait-object-safety.rs b/src/test/ui/unsized-locals/by-value-trait-object-safety.rs index 8b24328bd3854..d298542541748 100644 --- a/src/test/ui/unsized-locals/by-value-trait-object-safety.rs +++ b/src/test/ui/unsized-locals/by-value-trait-object-safety.rs @@ -1,7 +1,10 @@ #![feature(unsized_locals)] +//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] pub trait Foo { - fn foo(self) -> String where Self: Sized; + fn foo(self) -> String + where + Self: Sized; } struct A; @@ -12,7 +15,6 @@ impl Foo for A { } } - fn main() { let x = *(Box::new(A) as Box); x.foo(); diff --git a/src/test/ui/unsized-locals/by-value-trait-object-safety.stderr b/src/test/ui/unsized-locals/by-value-trait-object-safety.stderr index 4cd2098eef256..59d91bc0cfd3d 100644 --- a/src/test/ui/unsized-locals/by-value-trait-object-safety.stderr +++ b/src/test/ui/unsized-locals/by-value-trait-object-safety.stderr @@ -1,11 +1,20 @@ +warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/by-value-trait-object-safety.rs:1:12 + | +LL | #![feature(unsized_locals)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #48055 for more information + error: the `foo` method cannot be invoked on a trait object - --> $DIR/by-value-trait-object-safety.rs:18:7 + --> $DIR/by-value-trait-object-safety.rs:20:7 | -LL | fn foo(self) -> String where Self: Sized; - | ----- this has a `Sized` requirement +LL | Self: Sized; + | ----- this has a `Sized` requirement ... LL | x.foo(); | ^^^ -error: aborting due to previous error +error: aborting due to previous error; 1 warning emitted diff --git a/src/test/ui/unsized-locals/double-move.rs b/src/test/ui/unsized-locals/double-move.rs index 5c430a0c388e3..35d95232f346f 100644 --- a/src/test/ui/unsized-locals/double-move.rs +++ b/src/test/ui/unsized-locals/double-move.rs @@ -1,4 +1,5 @@ #![feature(unsized_locals, unsized_fn_params)] +//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] pub trait Foo { fn foo(self) -> String; diff --git a/src/test/ui/unsized-locals/double-move.stderr b/src/test/ui/unsized-locals/double-move.stderr index 36fb32ae09c8e..b897dbbc9a3aa 100644 --- a/src/test/ui/unsized-locals/double-move.stderr +++ b/src/test/ui/unsized-locals/double-move.stderr @@ -1,5 +1,14 @@ +warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/double-move.rs:1:12 + | +LL | #![feature(unsized_locals, unsized_fn_params)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #48055 for more information + error[E0382]: use of moved value: `y` - --> $DIR/double-move.rs:20:22 + --> $DIR/double-move.rs:21:22 | LL | let y = *x; | - move occurs because `y` has type `str`, which does not implement the `Copy` trait @@ -9,7 +18,7 @@ LL | drop_unsized(y); | ^ value used here after move error[E0382]: use of moved value: `x` - --> $DIR/double-move.rs:26:22 + --> $DIR/double-move.rs:27:22 | LL | let _y = *x; | -- value moved here @@ -19,7 +28,7 @@ LL | drop_unsized(x); = note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait error[E0382]: use of moved value: `*x` - --> $DIR/double-move.rs:32:18 + --> $DIR/double-move.rs:33:18 | LL | let x = "hello".to_owned().into_boxed_str(); | - move occurs because `x` has type `Box`, which does not implement the `Copy` trait @@ -29,7 +38,7 @@ LL | let _y = *x; | ^^ value used here after move error[E0382]: use of moved value: `y` - --> $DIR/double-move.rs:39:9 + --> $DIR/double-move.rs:40:9 | LL | let y = *x; | - move occurs because `y` has type `str`, which does not implement the `Copy` trait @@ -39,13 +48,13 @@ LL | y.foo(); | ^ value used here after move | note: this function consumes the receiver `self` by taking ownership of it, which moves `y` - --> $DIR/double-move.rs:4:12 + --> $DIR/double-move.rs:5:12 | LL | fn foo(self) -> String; | ^^^^ error[E0382]: use of moved value: `x` - --> $DIR/double-move.rs:45:9 + --> $DIR/double-move.rs:46:9 | LL | let _y = *x; | -- value moved here @@ -55,7 +64,7 @@ LL | x.foo(); = note: move occurs because `*x` has type `str`, which does not implement the `Copy` trait error[E0382]: use of moved value: `*x` - --> $DIR/double-move.rs:51:18 + --> $DIR/double-move.rs:52:18 | LL | let x = "hello".to_owned().into_boxed_str(); | - move occurs because `x` has type `Box`, which does not implement the `Copy` trait @@ -64,6 +73,6 @@ LL | x.foo(); LL | let _y = *x; | ^^ value used here after move -error: aborting due to 6 previous errors +error: aborting due to 6 previous errors; 1 warning emitted For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/unsized-locals/issue-30276-feature-flagged.rs b/src/test/ui/unsized-locals/issue-30276-feature-flagged.rs index 4193210b8bd3b..3b08225c880ae 100644 --- a/src/test/ui/unsized-locals/issue-30276-feature-flagged.rs +++ b/src/test/ui/unsized-locals/issue-30276-feature-flagged.rs @@ -1,4 +1,5 @@ #![feature(unsized_locals)] +//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] struct Test([i32]); diff --git a/src/test/ui/unsized-locals/issue-30276-feature-flagged.stderr b/src/test/ui/unsized-locals/issue-30276-feature-flagged.stderr index be033c0b176d7..0f0ff5793776f 100644 --- a/src/test/ui/unsized-locals/issue-30276-feature-flagged.stderr +++ b/src/test/ui/unsized-locals/issue-30276-feature-flagged.stderr @@ -1,5 +1,14 @@ +warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-30276-feature-flagged.rs:1:12 + | +LL | #![feature(unsized_locals)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #48055 for more information + error[E0277]: the size for values of type `[i32]` cannot be known at compilation time - --> $DIR/issue-30276-feature-flagged.rs:6:29 + --> $DIR/issue-30276-feature-flagged.rs:7:29 | LL | let _x: fn(_) -> Test = Test; | ^^^^ doesn't have a size known at compile-time @@ -8,6 +17,6 @@ LL | let _x: fn(_) -> Test = Test; = note: all function arguments 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; 1 warning emitted For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/unsized-locals/issue-50940-with-feature.rs b/src/test/ui/unsized-locals/issue-50940-with-feature.rs index 310dfc9b62326..c8b78c4ac556f 100644 --- a/src/test/ui/unsized-locals/issue-50940-with-feature.rs +++ b/src/test/ui/unsized-locals/issue-50940-with-feature.rs @@ -1,4 +1,5 @@ #![feature(unsized_locals, unsized_fn_params)] +//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] fn main() { struct A(X); diff --git a/src/test/ui/unsized-locals/issue-50940-with-feature.stderr b/src/test/ui/unsized-locals/issue-50940-with-feature.stderr index dc20b92b4237d..1b1a584a01ff1 100644 --- a/src/test/ui/unsized-locals/issue-50940-with-feature.stderr +++ b/src/test/ui/unsized-locals/issue-50940-with-feature.stderr @@ -1,5 +1,14 @@ +warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-50940-with-feature.rs:1:12 + | +LL | #![feature(unsized_locals, unsized_fn_params)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #48055 for more information + error[E0277]: the size for values of type `str` cannot be known at compilation time - --> $DIR/issue-50940-with-feature.rs:5:5 + --> $DIR/issue-50940-with-feature.rs:6:5 | LL | A as fn(str) -> A; | ^ doesn't have a size known at compile-time @@ -8,6 +17,6 @@ LL | A as fn(str) -> A; = note: required because it appears within the type `A` = note: the return type of a function must have a statically known size -error: aborting due to previous error +error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/unsized-locals/reference-unsized-locals.rs b/src/test/ui/unsized-locals/reference-unsized-locals.rs index 1560d25d4b0de..4e887f32753f1 100644 --- a/src/test/ui/unsized-locals/reference-unsized-locals.rs +++ b/src/test/ui/unsized-locals/reference-unsized-locals.rs @@ -1,5 +1,6 @@ // run-pass +#![allow(incomplete_features)] #![feature(unsized_locals)] fn main() { diff --git a/src/test/ui/unsized-locals/simple-unsized-locals.rs b/src/test/ui/unsized-locals/simple-unsized-locals.rs index 059559192456d..02b7c299aa40a 100644 --- a/src/test/ui/unsized-locals/simple-unsized-locals.rs +++ b/src/test/ui/unsized-locals/simple-unsized-locals.rs @@ -1,5 +1,6 @@ // run-pass +#![allow(incomplete_features)] #![feature(unsized_locals)] fn main() { diff --git a/src/test/ui/unsized-locals/unsized-exprs-rpass.rs b/src/test/ui/unsized-locals/unsized-exprs-rpass.rs index fc564d16ddb68..8fcb6d93d391c 100644 --- a/src/test/ui/unsized-locals/unsized-exprs-rpass.rs +++ b/src/test/ui/unsized-locals/unsized-exprs-rpass.rs @@ -1,5 +1,5 @@ // run-pass -#![allow(unused_braces, unused_parens)] +#![allow(incomplete_features, unused_braces, unused_parens)] #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] struct A(X); diff --git a/src/test/ui/unsized-locals/unsized-exprs.rs b/src/test/ui/unsized-locals/unsized-exprs.rs index be3140db86b72..348629c0ff367 100644 --- a/src/test/ui/unsized-locals/unsized-exprs.rs +++ b/src/test/ui/unsized-locals/unsized-exprs.rs @@ -1,4 +1,5 @@ #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] +//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] struct A(X); diff --git a/src/test/ui/unsized-locals/unsized-exprs.stderr b/src/test/ui/unsized-locals/unsized-exprs.stderr index 9fb401aec2cfa..493a5425e5dce 100644 --- a/src/test/ui/unsized-locals/unsized-exprs.stderr +++ b/src/test/ui/unsized-locals/unsized-exprs.stderr @@ -1,5 +1,14 @@ +warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/unsized-exprs.rs:1:36 + | +LL | #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #48055 for more information + error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> $DIR/unsized-exprs.rs:22:26 + --> $DIR/unsized-exprs.rs:23:26 | LL | udrop::<(i32, [u8])>((42, *foo())); | ^^^^^^^^^^^^ doesn't have a size known at compile-time @@ -9,7 +18,7 @@ LL | udrop::<(i32, [u8])>((42, *foo())); = note: tuples must have a statically known size to be initialized error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> $DIR/unsized-exprs.rs:24:22 + --> $DIR/unsized-exprs.rs:25:22 | LL | udrop::>(A { 0: *foo() }); | ^^^^^^^^^^^^^^^ doesn't have a size known at compile-time @@ -19,7 +28,7 @@ LL | udrop::>(A { 0: *foo() }); = note: structs must have a statically known size to be initialized error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> $DIR/unsized-exprs.rs:26:22 + --> $DIR/unsized-exprs.rs:27:22 | LL | udrop::>(A(*foo())); | ^ doesn't have a size known at compile-time @@ -28,6 +37,6 @@ LL | udrop::>(A(*foo())); = note: required because it appears within the type `A<[u8]>` = note: the return type of a function must have a statically known size -error: aborting due to 3 previous errors +error: aborting due to 3 previous errors; 1 warning emitted For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/unsized-locals/unsized-exprs2.rs b/src/test/ui/unsized-locals/unsized-exprs2.rs index 495316c276e8d..1d0f39881b700 100644 --- a/src/test/ui/unsized-locals/unsized-exprs2.rs +++ b/src/test/ui/unsized-locals/unsized-exprs2.rs @@ -1,4 +1,5 @@ #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] +//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] struct A(X); diff --git a/src/test/ui/unsized-locals/unsized-exprs2.stderr b/src/test/ui/unsized-locals/unsized-exprs2.stderr index 88269f237afb7..fac16b8e07ee2 100644 --- a/src/test/ui/unsized-locals/unsized-exprs2.stderr +++ b/src/test/ui/unsized-locals/unsized-exprs2.stderr @@ -1,5 +1,14 @@ +warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/unsized-exprs2.rs:1:36 + | +LL | #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] + | ^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #48055 for more information + error[E0508]: cannot move out of type `[u8]`, a non-copy slice - --> $DIR/unsized-exprs2.rs:22:5 + --> $DIR/unsized-exprs2.rs:23:5 | LL | udrop::<[u8]>(foo()[..]); | ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -7,6 +16,6 @@ LL | udrop::<[u8]>(foo()[..]); | cannot move out of here | move occurs because value has type `[u8]`, which does not implement the `Copy` trait -error: aborting due to previous error +error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0508`. diff --git a/src/test/ui/unsized-locals/unsized-index.rs b/src/test/ui/unsized-locals/unsized-index.rs index 470e0e2f12ea5..c8b502b271d98 100644 --- a/src/test/ui/unsized-locals/unsized-index.rs +++ b/src/test/ui/unsized-locals/unsized-index.rs @@ -5,6 +5,7 @@ // Tightening the bound now could be a breaking change. Although no crater // regression were observed (https://github.com/rust-lang/rust/pull/59527), // let's be conservative and just add a test for this. +#![allow(incomplete_features)] #![feature(unsized_locals, unsized_fn_params)] use std::ops; diff --git a/src/test/ui/unsized-locals/unsized-parameters.rs b/src/test/ui/unsized-locals/unsized-parameters.rs index 6d87f07f43b18..15eeeb9303339 100644 --- a/src/test/ui/unsized-locals/unsized-parameters.rs +++ b/src/test/ui/unsized-locals/unsized-parameters.rs @@ -1,5 +1,6 @@ // run-pass +#![allow(incomplete_features)] #![feature(unsized_locals, unsized_fn_params)] pub fn f0(_f: dyn FnOnce()) {} From 072e230b1b39f44c609c845a51db7632647965a9 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 16 Oct 2020 19:38:46 -0300 Subject: [PATCH 03/22] This flag is not really needed in the test --- src/test/ui/fn/dyn-fn-alignment.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/ui/fn/dyn-fn-alignment.rs b/src/test/ui/fn/dyn-fn-alignment.rs index ecd7c1744a008..cedfd1cf2dcc9 100644 --- a/src/test/ui/fn/dyn-fn-alignment.rs +++ b/src/test/ui/fn/dyn-fn-alignment.rs @@ -1,6 +1,5 @@ // run-pass -#![feature(unsized_fn_params)] #![allow(dead_code)] #[repr(align(256))] struct A { From e049ba08086fadfb942e549cf73f6806d147b0a0 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Sat, 23 May 2020 09:35:22 -0300 Subject: [PATCH 04/22] Make tidy happy --- .../feature-gate-unsized_fn_params.rs | 4 ++-- ...-same-trait-object-with-separate-params.rs | 5 ++-- ...e-trait-object-with-separate-params.stderr | 24 +++++++++---------- src/test/ui/moves/move-out-of-slice-2.rs | 2 +- .../ui/unsized-locals/borrow-after-move.rs | 2 +- .../by-value-trait-object-safety.rs | 2 +- src/test/ui/unsized-locals/double-move.rs | 2 +- .../issue-30276-feature-flagged.rs | 2 +- .../issue-50940-with-feature.rs | 2 +- src/test/ui/unsized-locals/unsized-exprs.rs | 2 +- src/test/ui/unsized-locals/unsized-exprs2.rs | 2 +- 11 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/test/ui/feature-gates/feature-gate-unsized_fn_params.rs b/src/test/ui/feature-gates/feature-gate-unsized_fn_params.rs index 45bde37a3ac5e..9b868ed7a9e93 100644 --- a/src/test/ui/feature-gates/feature-gate-unsized_fn_params.rs +++ b/src/test/ui/feature-gates/feature-gate-unsized_fn_params.rs @@ -15,12 +15,12 @@ impl Foo for A { } fn foo(x: dyn Foo) { - //~^ ERROR: the size for values of type `(dyn Foo + 'static)` cannot be known at compilation time [E0277] + //~^ ERROR [E0277] x.foo() } fn main() { let x: Box = Box::new(A { v: 22 }); foo(*x); - //~^ ERROR: the size for values of type `(dyn Foo + 'static)` cannot be known at compilation time [E0277] + //~^ ERROR [E0277] } diff --git a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs index 4ea0a609af4c4..9e53ff0791728 100644 --- a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs +++ b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.rs @@ -1,5 +1,6 @@ -#![feature(arbitrary_self_types, coerce_unsized, dispatch_from_dyn, unsize, unsized_locals, unsized_fn_params)] -//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] +#![feature(arbitrary_self_types, coerce_unsized, dispatch_from_dyn, unsize)] +#![feature(unsized_locals, unsized_fn_params)] +//~^ WARN the feature `unsized_locals` is incomplete // This tests a few edge-cases around `arbitrary_self_types`. Most specifically, // it checks that the `ObjectCandidate` you get from method matching can't diff --git a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr index 4a06a95120ac7..0a516c89a8b55 100644 --- a/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr +++ b/src/test/ui/methods/method-deref-to-same-trait-object-with-separate-params.stderr @@ -1,14 +1,14 @@ warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:1:77 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:2:12 | -LL | #![feature(arbitrary_self_types, coerce_unsized, dispatch_from_dyn, unsize, unsized_locals, unsized_fn_params)] - | ^^^^^^^^^^^^^^ +LL | #![feature(unsized_locals, unsized_fn_params)] + | ^^^^^^^^^^^^^^ | = note: `#[warn(incomplete_features)]` on by default = note: see issue #48055 for more information error[E0308]: mismatched types - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:86:24 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:87:24 | LL | let _seetype: () = z; | -- ^ expected `()`, found `u32` @@ -16,7 +16,7 @@ LL | let _seetype: () = z; | expected due to this error[E0308]: mismatched types - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:103:24 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:104:24 | LL | let _seetype: () = z; | -- ^ expected `()`, found `u64` @@ -24,23 +24,23 @@ LL | let _seetype: () = z; | expected due to this error[E0034]: multiple applicable items in scope - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:121:15 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:122:15 | LL | let z = x.foo(); | ^^^ multiple `foo` found | note: candidate #1 is defined in an impl of the trait `X` for the type `T` - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:44:9 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:45:9 | LL | fn foo(self: Smaht) -> u64 { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ note: candidate #2 is defined in an impl of the trait `NuisanceFoo` for the type `T` - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:71:9 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:72:9 | LL | fn foo(self) {} | ^^^^^^^^^^^^ note: candidate #3 is defined in the trait `FinalFoo` - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:58:5 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:59:5 | LL | fn foo(&self) -> u8; | ^^^^^^^^^^^^^^^^^^^^ @@ -58,7 +58,7 @@ LL | let z = FinalFoo::foo(x); | ^^^^^^^^^^^^^^^^ error[E0308]: mismatched types - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:138:24 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:139:24 | LL | let _seetype: () = z; | -- ^ expected `()`, found `u8` @@ -66,7 +66,7 @@ LL | let _seetype: () = z; | expected due to this error[E0308]: mismatched types - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:156:24 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:157:24 | LL | let _seetype: () = z; | -- ^ expected `()`, found `u32` @@ -74,7 +74,7 @@ LL | let _seetype: () = z; | expected due to this error[E0308]: mismatched types - --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:173:24 + --> $DIR/method-deref-to-same-trait-object-with-separate-params.rs:174:24 | LL | let _seetype: () = z; | -- ^ expected `()`, found `u32` diff --git a/src/test/ui/moves/move-out-of-slice-2.rs b/src/test/ui/moves/move-out-of-slice-2.rs index d91be023ed794..59c02d42bf17e 100644 --- a/src/test/ui/moves/move-out-of-slice-2.rs +++ b/src/test/ui/moves/move-out-of-slice-2.rs @@ -1,5 +1,5 @@ #![feature(unsized_locals)] -//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] +//~^ WARN the feature `unsized_locals` is incomplete struct A; #[derive(Clone, Copy)] diff --git a/src/test/ui/unsized-locals/borrow-after-move.rs b/src/test/ui/unsized-locals/borrow-after-move.rs index bf305a318d842..ad73b720fa39d 100644 --- a/src/test/ui/unsized-locals/borrow-after-move.rs +++ b/src/test/ui/unsized-locals/borrow-after-move.rs @@ -1,5 +1,5 @@ #![feature(unsized_locals, unsized_fn_params)] -//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] +//~^ WARN the feature `unsized_locals` is incomplete pub trait Foo { fn foo(self) -> String; diff --git a/src/test/ui/unsized-locals/by-value-trait-object-safety.rs b/src/test/ui/unsized-locals/by-value-trait-object-safety.rs index d298542541748..d0ba6944a1e81 100644 --- a/src/test/ui/unsized-locals/by-value-trait-object-safety.rs +++ b/src/test/ui/unsized-locals/by-value-trait-object-safety.rs @@ -1,5 +1,5 @@ #![feature(unsized_locals)] -//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] +//~^ WARN the feature `unsized_locals` is incomplete pub trait Foo { fn foo(self) -> String diff --git a/src/test/ui/unsized-locals/double-move.rs b/src/test/ui/unsized-locals/double-move.rs index 35d95232f346f..9e46ef9be487c 100644 --- a/src/test/ui/unsized-locals/double-move.rs +++ b/src/test/ui/unsized-locals/double-move.rs @@ -1,5 +1,5 @@ #![feature(unsized_locals, unsized_fn_params)] -//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] +//~^ WARN the feature `unsized_locals` is incomplete pub trait Foo { fn foo(self) -> String; diff --git a/src/test/ui/unsized-locals/issue-30276-feature-flagged.rs b/src/test/ui/unsized-locals/issue-30276-feature-flagged.rs index 3b08225c880ae..635d34f822914 100644 --- a/src/test/ui/unsized-locals/issue-30276-feature-flagged.rs +++ b/src/test/ui/unsized-locals/issue-30276-feature-flagged.rs @@ -1,5 +1,5 @@ #![feature(unsized_locals)] -//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] +//~^ WARN the feature `unsized_locals` is incomplete struct Test([i32]); diff --git a/src/test/ui/unsized-locals/issue-50940-with-feature.rs b/src/test/ui/unsized-locals/issue-50940-with-feature.rs index c8b78c4ac556f..63b0e830be4ed 100644 --- a/src/test/ui/unsized-locals/issue-50940-with-feature.rs +++ b/src/test/ui/unsized-locals/issue-50940-with-feature.rs @@ -1,5 +1,5 @@ #![feature(unsized_locals, unsized_fn_params)] -//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] +//~^ WARN the feature `unsized_locals` is incomplete fn main() { struct A(X); diff --git a/src/test/ui/unsized-locals/unsized-exprs.rs b/src/test/ui/unsized-locals/unsized-exprs.rs index 348629c0ff367..17fcdf7ea27ea 100644 --- a/src/test/ui/unsized-locals/unsized-exprs.rs +++ b/src/test/ui/unsized-locals/unsized-exprs.rs @@ -1,5 +1,5 @@ #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] -//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] +//~^ WARN the feature `unsized_locals` is incomplete struct A(X); diff --git a/src/test/ui/unsized-locals/unsized-exprs2.rs b/src/test/ui/unsized-locals/unsized-exprs2.rs index 1d0f39881b700..8b0232e5b0f90 100644 --- a/src/test/ui/unsized-locals/unsized-exprs2.rs +++ b/src/test/ui/unsized-locals/unsized-exprs2.rs @@ -1,5 +1,5 @@ #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] -//~^ WARN the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features] +//~^ WARN the feature `unsized_locals` is incomplete struct A(X); From d57d3f300a2e36c0889e35e5954c620387232fa0 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Sat, 23 May 2020 16:26:20 -0300 Subject: [PATCH 05/22] Using unsized_local feature is not needed in these tests --- src/test/ui/unsized-locals/unsized-exprs.rs | 3 +-- src/test/ui/unsized-locals/unsized-exprs.stderr | 17 ++++------------- src/test/ui/unsized-locals/unsized-exprs2.rs | 3 +-- .../ui/unsized-locals/unsized-exprs2.stderr | 13 ++----------- src/test/ui/unsized-locals/unsized-index.rs | 3 +-- 5 files changed, 9 insertions(+), 30 deletions(-) diff --git a/src/test/ui/unsized-locals/unsized-exprs.rs b/src/test/ui/unsized-locals/unsized-exprs.rs index 17fcdf7ea27ea..1729b9ffa8670 100644 --- a/src/test/ui/unsized-locals/unsized-exprs.rs +++ b/src/test/ui/unsized-locals/unsized-exprs.rs @@ -1,5 +1,4 @@ -#![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] -//~^ WARN the feature `unsized_locals` is incomplete +#![feature(unsized_tuple_coercion, unsized_fn_params)] struct A(X); diff --git a/src/test/ui/unsized-locals/unsized-exprs.stderr b/src/test/ui/unsized-locals/unsized-exprs.stderr index 493a5425e5dce..9fb401aec2cfa 100644 --- a/src/test/ui/unsized-locals/unsized-exprs.stderr +++ b/src/test/ui/unsized-locals/unsized-exprs.stderr @@ -1,14 +1,5 @@ -warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/unsized-exprs.rs:1:36 - | -LL | #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] - | ^^^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - = note: see issue #48055 for more information - error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> $DIR/unsized-exprs.rs:23:26 + --> $DIR/unsized-exprs.rs:22:26 | LL | udrop::<(i32, [u8])>((42, *foo())); | ^^^^^^^^^^^^ doesn't have a size known at compile-time @@ -18,7 +9,7 @@ LL | udrop::<(i32, [u8])>((42, *foo())); = note: tuples must have a statically known size to be initialized error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> $DIR/unsized-exprs.rs:25:22 + --> $DIR/unsized-exprs.rs:24:22 | LL | udrop::>(A { 0: *foo() }); | ^^^^^^^^^^^^^^^ doesn't have a size known at compile-time @@ -28,7 +19,7 @@ LL | udrop::>(A { 0: *foo() }); = note: structs must have a statically known size to be initialized error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> $DIR/unsized-exprs.rs:27:22 + --> $DIR/unsized-exprs.rs:26:22 | LL | udrop::>(A(*foo())); | ^ doesn't have a size known at compile-time @@ -37,6 +28,6 @@ LL | udrop::>(A(*foo())); = note: required because it appears within the type `A<[u8]>` = note: the return type of a function must have a statically known size -error: aborting due to 3 previous errors; 1 warning emitted +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/unsized-locals/unsized-exprs2.rs b/src/test/ui/unsized-locals/unsized-exprs2.rs index 8b0232e5b0f90..127d8717e5806 100644 --- a/src/test/ui/unsized-locals/unsized-exprs2.rs +++ b/src/test/ui/unsized-locals/unsized-exprs2.rs @@ -1,5 +1,4 @@ -#![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] -//~^ WARN the feature `unsized_locals` is incomplete +#![feature(unsized_tuple_coercion, unsized_fn_params)] struct A(X); diff --git a/src/test/ui/unsized-locals/unsized-exprs2.stderr b/src/test/ui/unsized-locals/unsized-exprs2.stderr index fac16b8e07ee2..88269f237afb7 100644 --- a/src/test/ui/unsized-locals/unsized-exprs2.stderr +++ b/src/test/ui/unsized-locals/unsized-exprs2.stderr @@ -1,14 +1,5 @@ -warning: the feature `unsized_locals` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/unsized-exprs2.rs:1:36 - | -LL | #![feature(unsized_tuple_coercion, unsized_locals, unsized_fn_params)] - | ^^^^^^^^^^^^^^ - | - = note: `#[warn(incomplete_features)]` on by default - = note: see issue #48055 for more information - error[E0508]: cannot move out of type `[u8]`, a non-copy slice - --> $DIR/unsized-exprs2.rs:23:5 + --> $DIR/unsized-exprs2.rs:22:5 | LL | udrop::<[u8]>(foo()[..]); | ^^^^^^^^^^^^^^^^^^^^^^^^ @@ -16,6 +7,6 @@ LL | udrop::<[u8]>(foo()[..]); | cannot move out of here | move occurs because value has type `[u8]`, which does not implement the `Copy` trait -error: aborting due to previous error; 1 warning emitted +error: aborting due to previous error For more information about this error, try `rustc --explain E0508`. diff --git a/src/test/ui/unsized-locals/unsized-index.rs b/src/test/ui/unsized-locals/unsized-index.rs index c8b502b271d98..2c31ade7a3873 100644 --- a/src/test/ui/unsized-locals/unsized-index.rs +++ b/src/test/ui/unsized-locals/unsized-index.rs @@ -5,8 +5,7 @@ // Tightening the bound now could be a breaking change. Although no crater // regression were observed (https://github.com/rust-lang/rust/pull/59527), // let's be conservative and just add a test for this. -#![allow(incomplete_features)] -#![feature(unsized_locals, unsized_fn_params)] +#![feature(unsized_fn_params)] use std::ops; From 1b7d0b22c08717e285fbb1acfdb160e30e6cc085 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Sun, 24 May 2020 17:22:41 -0300 Subject: [PATCH 06/22] Fix unstable-book doc tests --- .../unstable-book/src/language-features/unsized-locals.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/doc/unstable-book/src/language-features/unsized-locals.md b/src/doc/unstable-book/src/language-features/unsized-locals.md index 343084b7db501..d716b1d51dcf7 100644 --- a/src/doc/unstable-book/src/language-features/unsized-locals.md +++ b/src/doc/unstable-book/src/language-features/unsized-locals.md @@ -11,7 +11,8 @@ This implements [RFC1909]. When turned on, you can have unsized arguments and lo [RFC1909]: https://github.com/rust-lang/rfcs/blob/master/text/1909-unsized-rvalues.md ```rust -#![feature(unsized_locals)] +#![allow(incomplete_features)] +#![feature(unsized_locals, unsized_fn_params)] use std::any::Any; @@ -85,7 +86,7 @@ fn main() { With this feature, you can have by-value `self` arguments without `Self: Sized` bounds. ```rust -#![feature(unsized_locals)] +#![feature(unsized_fn_params)] trait Foo { fn foo(self) {} @@ -102,7 +103,7 @@ fn main() { And `Foo` will also be object-safe. ```rust -#![feature(unsized_locals)] +#![feature(unsized_fn_params)] trait Foo { fn foo(self) {} From ba59aa2b779a55ecd1f5b1dded894d74e942b5b7 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 16 Oct 2020 23:19:26 -0300 Subject: [PATCH 07/22] Do not depend on except for bootstrap --- library/core/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs index 6de766ffd5679..b89ec93834fcc 100644 --- a/library/core/src/lib.rs +++ b/library/core/src/lib.rs @@ -132,8 +132,8 @@ #![feature(transparent_unions)] #![feature(try_blocks)] #![feature(unboxed_closures)] -#![feature(unsized_locals)] #![cfg_attr(not(bootstrap), feature(unsized_fn_params))] +#![cfg_attr(bootstrap, feature(unsized_locals))] #![cfg_attr(bootstrap, feature(untagged_unions))] #![feature(unwind_attributes)] #![feature(variant_count)] From 2040b790e8227e9ba4094d3c5779340bda813dea Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Fri, 16 Oct 2020 23:19:58 -0300 Subject: [PATCH 08/22] unsized_locals feature is not needed in this test --- src/test/ui/unsized-locals/unsized-parameters.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/ui/unsized-locals/unsized-parameters.rs b/src/test/ui/unsized-locals/unsized-parameters.rs index 15eeeb9303339..2d31b9e4046a3 100644 --- a/src/test/ui/unsized-locals/unsized-parameters.rs +++ b/src/test/ui/unsized-locals/unsized-parameters.rs @@ -1,7 +1,7 @@ // run-pass #![allow(incomplete_features)] -#![feature(unsized_locals, unsized_fn_params)] +#![feature(unsized_fn_params)] pub fn f0(_f: dyn FnOnce()) {} pub fn f1(_s: str) {} From 70b8c79a96a8d6647976736c64cb8c54cfad34bf Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 20 Oct 2020 12:39:32 -0300 Subject: [PATCH 09/22] Bless issue-53448 test --- src/test/ui/unboxed-closures/issue-53448.stderr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/ui/unboxed-closures/issue-53448.stderr b/src/test/ui/unboxed-closures/issue-53448.stderr index bece9eedc7ffa..29273a5babefd 100644 --- a/src/test/ui/unboxed-closures/issue-53448.stderr +++ b/src/test/ui/unboxed-closures/issue-53448.stderr @@ -5,7 +5,7 @@ LL | let f: &mut dyn FnMut<(_,), Output = ()> = &mut |_: <() as Lt<'_>>::T| | ^ doesn't have a size known at compile-time | = help: the trait `Sized` is not implemented for `<() as Lt<'_>>::T` - = 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 | LL | fn main() where <() as Lt<'_>>::T: Sized { From f0a71f7f4d583f7c93899ae913d6494cc42ad2ac Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 20 Oct 2020 12:40:02 -0300 Subject: [PATCH 10/22] Better test unsized_fn_params --- src/test/ui/unsized-locals/unsized-index.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/ui/unsized-locals/unsized-index.rs b/src/test/ui/unsized-locals/unsized-index.rs index 2c31ade7a3873..e8782e8948153 100644 --- a/src/test/ui/unsized-locals/unsized-index.rs +++ b/src/test/ui/unsized-locals/unsized-index.rs @@ -1,20 +1,16 @@ -// build-pass (FIXME(62277): could be check-pass?) +// run-pass -// `std::ops::Index` has an `: ?Sized` bound on the `Idx` type param. This is -// an accidental left-over from the times when it `Index` was by-reference. -// Tightening the bound now could be a breaking change. Although no crater -// regression were observed (https://github.com/rust-lang/rust/pull/59527), -// let's be conservative and just add a test for this. #![feature(unsized_fn_params)] use std::ops; +use std::ops::Index; pub struct A; impl ops::Index for A { type Output = (); fn index(&self, _: str) -> &Self::Output { - panic!() + &() } } @@ -24,4 +20,8 @@ impl ops::IndexMut for A { } } -fn main() {} +fn main() { + let a = A {}; + let s = String::new().into_boxed_str(); + assert_eq!(&(), a.index(*s)); +} From a3470b13ab8cfba6b698aa0ae0e9591a76d40ba7 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 20 Oct 2020 13:08:40 -0300 Subject: [PATCH 11/22] Test that unsized locals fail when turning unsized_fn_params feature flag on --- .../unsized-locals-using-unsized-fn-params.rs | 7 +++++++ .../unsized-locals-using-unsized-fn-params.stderr | 13 +++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs create mode 100644 src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr diff --git a/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs new file mode 100644 index 0000000000000..8ee5d3ee7cbff --- /dev/null +++ b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs @@ -0,0 +1,7 @@ +#![feature(unsized_fn_params)] + +fn main() { + let foo: Box<[u8]> = Box::new(*b"foo"); + let _foo: [u8] = *foo; + //~^ ERROR: the size for values of type `[u8]` cannot be known at compilation time [E0277] +} diff --git a/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr new file mode 100644 index 0000000000000..c9ecf89121714 --- /dev/null +++ b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr @@ -0,0 +1,13 @@ +error[E0277]: the size for values of type `[u8]` cannot be known at compilation time + --> $DIR/unsized-locals-using-unsized-fn-params.rs:5:9 + | +LL | let _foo: [u8] = *foo; + | ^^^^ doesn't have a size known at compile-time + | + = help: the trait `Sized` is not implemented for `[u8]` + = note: all local variables must have a statically known size + = help: unsized locals are gated as an unstable feature + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. From 58018d438b3e14624bf33a9c0d2031e906797b8d Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 20 Oct 2020 13:23:58 -0300 Subject: [PATCH 12/22] Properly restore within_fn_param value to the previous state --- compiler/rustc_typeck/src/check/gather_locals.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_typeck/src/check/gather_locals.rs b/compiler/rustc_typeck/src/check/gather_locals.rs index d5e45c3b89f31..8699de4ce14cd 100644 --- a/compiler/rustc_typeck/src/check/gather_locals.rs +++ b/compiler/rustc_typeck/src/check/gather_locals.rs @@ -6,6 +6,7 @@ use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKi use rustc_middle::ty::Ty; use rustc_span::Span; use rustc_trait_selection::traits; +use std::mem; pub(super) struct GatherLocalsVisitor<'a, 'tcx> { fcx: &'a FnCtxt<'a, 'tcx>, @@ -97,9 +98,9 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> { } fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { - self.within_fn_param = true; + let old_within_fn_param = mem::replace(&mut self.within_fn_param, true); intravisit::walk_param(self, param); - self.within_fn_param = false; + self.within_fn_param = old_within_fn_param; } // Add pattern bindings. From ca41681bf0d5175dd39a91e97aca28b007241a29 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 20 Oct 2020 13:30:47 -0300 Subject: [PATCH 13/22] Do not use unsized_fn_params in patterns --- .../rustc_typeck/src/check/gather_locals.rs | 2 ++ .../ui/unsized-locals/unsized-local-pat.rs | 11 +++++++++ .../unsized-locals/unsized-local-pat.stderr | 23 +++++++++++++++++++ .../ui/unsized-locals/unsized-parameters.rs | 2 +- 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/unsized-locals/unsized-local-pat.rs create mode 100644 src/test/ui/unsized-locals/unsized-local-pat.stderr diff --git a/compiler/rustc_typeck/src/check/gather_locals.rs b/compiler/rustc_typeck/src/check/gather_locals.rs index 8699de4ce14cd..b2e5e3fe60445 100644 --- a/compiler/rustc_typeck/src/check/gather_locals.rs +++ b/compiler/rustc_typeck/src/check/gather_locals.rs @@ -129,7 +129,9 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> { var_ty ); } + let old_within_fn_param = mem::replace(&mut self.within_fn_param, false); intravisit::walk_pat(self, p); + self.within_fn_param = old_within_fn_param; } // Don't descend into the bodies of nested closures. diff --git a/src/test/ui/unsized-locals/unsized-local-pat.rs b/src/test/ui/unsized-locals/unsized-local-pat.rs new file mode 100644 index 0000000000000..0b9b4ea5959b8 --- /dev/null +++ b/src/test/ui/unsized-locals/unsized-local-pat.rs @@ -0,0 +1,11 @@ +#![feature(box_patterns)] +#![feature(unsized_fn_params)] + +#[allow(dead_code)] +fn f1(box box _b: Box>) {} +//~^ ERROR: the size for values of type `[u8]` cannot be known at compilation time [E0277] + +fn f2((_x, _y): (i32, [i32])) {} +//~^ ERROR: the size for values of type `[i32]` cannot be known at compilation time [E0277] + +fn main() {} diff --git a/src/test/ui/unsized-locals/unsized-local-pat.stderr b/src/test/ui/unsized-locals/unsized-local-pat.stderr new file mode 100644 index 0000000000000..ecb108d453d38 --- /dev/null +++ b/src/test/ui/unsized-locals/unsized-local-pat.stderr @@ -0,0 +1,23 @@ +error[E0277]: the size for values of type `[u8]` cannot be known at compilation time + --> $DIR/unsized-local-pat.rs:5:15 + | +LL | fn f1(box box _b: Box>) {} + | ^^ doesn't have a size known at compile-time + | + = help: the trait `Sized` is not implemented for `[u8]` + = note: all local variables must have a statically known size + = help: unsized locals are gated as an unstable feature + +error[E0277]: the size for values of type `[i32]` cannot be known at compilation time + --> $DIR/unsized-local-pat.rs:8:12 + | +LL | fn f2((_x, _y): (i32, [i32])) {} + | ^^ doesn't have a size known at compile-time + | + = help: the trait `Sized` is not implemented for `[i32]` + = note: all local variables must have a statically known size + = help: unsized locals are gated as an unstable feature + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/unsized-locals/unsized-parameters.rs b/src/test/ui/unsized-locals/unsized-parameters.rs index 2d31b9e4046a3..a1b772a7eb689 100644 --- a/src/test/ui/unsized-locals/unsized-parameters.rs +++ b/src/test/ui/unsized-locals/unsized-parameters.rs @@ -5,7 +5,7 @@ pub fn f0(_f: dyn FnOnce()) {} pub fn f1(_s: str) {} -pub fn f2((_x, _y): (i32, [i32])) {} +pub fn f2(_x: i32, _y: [i32]) {} fn main() { let foo = "foo".to_string().into_boxed_str(); From bdd1b85f951fa93eb7693527fc42de0f259e7598 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 20 Oct 2020 13:40:18 -0300 Subject: [PATCH 14/22] Rename within_fn_param to outermost_fn_param_pat --- compiler/rustc_typeck/src/check/gather_locals.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_typeck/src/check/gather_locals.rs b/compiler/rustc_typeck/src/check/gather_locals.rs index b2e5e3fe60445..f1bbe8b6d6bc3 100644 --- a/compiler/rustc_typeck/src/check/gather_locals.rs +++ b/compiler/rustc_typeck/src/check/gather_locals.rs @@ -14,16 +14,16 @@ pub(super) struct GatherLocalsVisitor<'a, 'tcx> { // 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, + outermost_fn_param_pat: bool, } impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> { pub(super) fn new( fcx: &'a FnCtxt<'a, 'tcx>, parent_id: hir::HirId, - within_fn_param: bool, + outermost_fn_param_pat: bool, ) -> Self { - Self { fcx, parent_id, within_fn_param } + Self { fcx, parent_id, outermost_fn_param_pat } } fn assign(&mut self, span: Span, nid: hir::HirId, ty_opt: Option>) -> Ty<'tcx> { @@ -98,9 +98,9 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> { } fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { - let old_within_fn_param = mem::replace(&mut self.within_fn_param, true); + let old_outermost_fn_param_pat = mem::replace(&mut self.outermost_fn_param_pat, true); intravisit::walk_param(self, param); - self.within_fn_param = old_within_fn_param; + self.outermost_fn_param_pat = old_outermost_fn_param_pat; } // Add pattern bindings. @@ -108,7 +108,7 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> { if let PatKind::Binding(_, _, ident, _) = p.kind { let var_ty = self.assign(p.span, p.hir_id, None); - if self.within_fn_param { + if self.outermost_fn_param_pat { if !self.fcx.tcx.features().unsized_fn_params { self.fcx.require_type_is_sized( var_ty, @@ -129,9 +129,9 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> { var_ty ); } - let old_within_fn_param = mem::replace(&mut self.within_fn_param, false); + let old_outermost_fn_param_pat = mem::replace(&mut self.outermost_fn_param_pat, false); intravisit::walk_pat(self, p); - self.within_fn_param = old_within_fn_param; + self.outermost_fn_param_pat = old_outermost_fn_param_pat; } // Don't descend into the bodies of nested closures. From 497ee0e1ffd3aa320e47144a5bac2a25058173e8 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 20 Oct 2020 17:45:36 -0300 Subject: [PATCH 15/22] param -> parameter, pat -> pattern --- compiler/rustc_typeck/src/check/gather_locals.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler/rustc_typeck/src/check/gather_locals.rs b/compiler/rustc_typeck/src/check/gather_locals.rs index f1bbe8b6d6bc3..0f670bac8fbd9 100644 --- a/compiler/rustc_typeck/src/check/gather_locals.rs +++ b/compiler/rustc_typeck/src/check/gather_locals.rs @@ -11,9 +11,9 @@ use std::mem; pub(super) struct GatherLocalsVisitor<'a, 'tcx> { fcx: &'a FnCtxt<'a, 'tcx>, 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. + // parameters are special cases of patterns, but we want to handle them as + // *distinct* cases. so track when we are hitting a pattern *within* an fn + // parameter. outermost_fn_param_pat: bool, } From 8b8b6392ba1c1e41c4f235bce1669953c9cd3b72 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 20 Oct 2020 21:52:49 -0300 Subject: [PATCH 16/22] Add comment explaining why in these tests unsized locals are not accepted --- src/test/ui/unsized-locals/unsized-local-pat.rs | 2 ++ .../ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/test/ui/unsized-locals/unsized-local-pat.rs b/src/test/ui/unsized-locals/unsized-local-pat.rs index 0b9b4ea5959b8..5793d3fb499a7 100644 --- a/src/test/ui/unsized-locals/unsized-local-pat.rs +++ b/src/test/ui/unsized-locals/unsized-local-pat.rs @@ -1,6 +1,8 @@ #![feature(box_patterns)] #![feature(unsized_fn_params)] +// Ensure that even with unsized_fn_params, unsized types in parameter patterns are not accepted. + #[allow(dead_code)] fn f1(box box _b: Box>) {} //~^ ERROR: the size for values of type `[u8]` cannot be known at compilation time [E0277] diff --git a/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs index 8ee5d3ee7cbff..6d39c8c8172cd 100644 --- a/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs +++ b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs @@ -1,5 +1,7 @@ #![feature(unsized_fn_params)] +// Ensure that even with unsized_fn_params, unsized locals are not accepted. + fn main() { let foo: Box<[u8]> = Box::new(*b"foo"); let _foo: [u8] = *foo; From f0fe0a6ebad583f10a6a1740ca93618c4f5dd175 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 20 Oct 2020 21:53:54 -0300 Subject: [PATCH 17/22] or -> and --- compiler/rustc_mir/src/borrow_check/type_check/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs index 1bd4440c9c823..c6ec5c5db2793 100644 --- a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs +++ b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs @@ -1719,7 +1719,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { ); } - // When `unsized_fn_params` or `unsized_locals` is not enabled, + // When `unsized_fn_params` and `unsized_locals` is not enabled, // this check is done at `check_local`. if self.tcx().features().unsized_locals || self.tcx().features().unsized_fn_params { let span = term.source_info.span; From 89eac50a87cbe189976ee8c9f41f19c37f07da3d Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Tue, 20 Oct 2020 21:56:29 -0300 Subject: [PATCH 18/22] Hide outermost_fn_param_pat, it's an internal detail --- compiler/rustc_typeck/src/check/check.rs | 2 +- compiler/rustc_typeck/src/check/gather_locals.rs | 8 ++------ compiler/rustc_typeck/src/check/mod.rs | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_typeck/src/check/check.rs b/compiler/rustc_typeck/src/check/check.rs index 40366003d4341..6dd8a143ec0f2 100644 --- a/compiler/rustc_typeck/src/check/check.rs +++ b/compiler/rustc_typeck/src/check/check.rs @@ -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_hir_id = hir.local_def_id_to_hir_id(outer_def_id); - GatherLocalsVisitor::new(&fcx, outer_hir_id, false).visit_body(body); + GatherLocalsVisitor::new(&fcx, outer_hir_id).visit_body(body); // 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). diff --git a/compiler/rustc_typeck/src/check/gather_locals.rs b/compiler/rustc_typeck/src/check/gather_locals.rs index 0f670bac8fbd9..af552389de024 100644 --- a/compiler/rustc_typeck/src/check/gather_locals.rs +++ b/compiler/rustc_typeck/src/check/gather_locals.rs @@ -18,12 +18,8 @@ pub(super) struct GatherLocalsVisitor<'a, 'tcx> { } impl<'a, 'tcx> GatherLocalsVisitor<'a, 'tcx> { - pub(super) fn new( - fcx: &'a FnCtxt<'a, 'tcx>, - parent_id: hir::HirId, - outermost_fn_param_pat: bool, - ) -> Self { - Self { fcx, parent_id, outermost_fn_param_pat } + pub(super) fn new(fcx: &'a FnCtxt<'a, 'tcx>, parent_id: hir::HirId) -> Self { + Self { fcx, parent_id, outermost_fn_param_pat: false } } fn assign(&mut self, span: Span, nid: hir::HirId, ty_opt: Option>) -> Ty<'tcx> { diff --git a/compiler/rustc_typeck/src/check/mod.rs b/compiler/rustc_typeck/src/check/mod.rs index 4ec114b1f2c5e..169ad0df3a5c9 100644 --- a/compiler/rustc_typeck/src/check/mod.rs +++ b/compiler/rustc_typeck/src/check/mod.rs @@ -553,7 +553,7 @@ fn typeck_with_fallback<'tcx>( }; // Gather locals in statics (because of block expressions). - GatherLocalsVisitor::new(&fcx, id, false).visit_body(body); + GatherLocalsVisitor::new(&fcx, id).visit_body(body); fcx.check_expr_coercable_to_type(&body.value, revealed_ty, None); From 4760338ad2ee3c1c9fbcade616ffa268aa99c477 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Wed, 21 Oct 2020 07:35:19 -0300 Subject: [PATCH 19/22] Bless tests again --- src/test/ui/unsized-locals/unsized-local-pat.stderr | 4 ++-- .../unsized-locals-using-unsized-fn-params.stderr | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/ui/unsized-locals/unsized-local-pat.stderr b/src/test/ui/unsized-locals/unsized-local-pat.stderr index ecb108d453d38..01449b45b8965 100644 --- a/src/test/ui/unsized-locals/unsized-local-pat.stderr +++ b/src/test/ui/unsized-locals/unsized-local-pat.stderr @@ -1,5 +1,5 @@ error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> $DIR/unsized-local-pat.rs:5:15 + --> $DIR/unsized-local-pat.rs:7:15 | LL | fn f1(box box _b: Box>) {} | ^^ doesn't have a size known at compile-time @@ -9,7 +9,7 @@ LL | fn f1(box box _b: Box>) {} = help: unsized locals are gated as an unstable feature error[E0277]: the size for values of type `[i32]` cannot be known at compilation time - --> $DIR/unsized-local-pat.rs:8:12 + --> $DIR/unsized-local-pat.rs:10:12 | LL | fn f2((_x, _y): (i32, [i32])) {} | ^^ doesn't have a size known at compile-time diff --git a/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr index c9ecf89121714..1f5ce5bc2df09 100644 --- a/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr +++ b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr @@ -1,5 +1,5 @@ error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> $DIR/unsized-locals-using-unsized-fn-params.rs:5:9 + --> $DIR/unsized-locals-using-unsized-fn-params.rs:7:9 | LL | let _foo: [u8] = *foo; | ^^^^ doesn't have a size known at compile-time From 9584b00b1dc15c6d8211125d959cbaa1d93c0228 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Wed, 21 Oct 2020 07:36:29 -0300 Subject: [PATCH 20/22] is -> are both --- compiler/rustc_mir/src/borrow_check/type_check/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs index c6ec5c5db2793..48b43e8de52c0 100644 --- a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs +++ b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs @@ -1719,7 +1719,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { ); } - // When `unsized_fn_params` and `unsized_locals` is not enabled, + // When `unsized_fn_params` and `unsized_locals` are both not enabled, // this check is done at `check_local`. if self.tcx().features().unsized_locals || self.tcx().features().unsized_fn_params { let span = term.source_info.span; From 00fd703eb7cd0c9e23d76f0cf0f13c07388dd273 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Wed, 21 Oct 2020 07:50:15 -0300 Subject: [PATCH 21/22] Use unsized_feature_enabled helper function --- .../rustc_mir/src/borrow_check/type_check/mod.rs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs index 48b43e8de52c0..409399094e849 100644 --- a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs +++ b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs @@ -974,6 +974,11 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { checker } + fn unsized_feature_enabled(&self) -> bool { + let features = self.tcx().features(); + features.unsized_locals || features.unsized_fn_params + } + /// Equate the inferred type and the annotated type for user type annotations fn check_user_type_annotations(&mut self) { debug!( @@ -1456,9 +1461,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } self.check_rvalue(body, rv, location); - if !(self.tcx().features().unsized_locals - || self.tcx().features().unsized_fn_params) - { + if !self.unsized_feature_enabled() { let trait_ref = ty::TraitRef { def_id: tcx.require_lang_item(LangItem::Sized, Some(self.last_span)), substs: tcx.mk_substs_trait(place_ty, &[]), @@ -1721,7 +1724,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { // When `unsized_fn_params` and `unsized_locals` are both not enabled, // this check is done at `check_local`. - if self.tcx().features().unsized_locals || self.tcx().features().unsized_fn_params { + if self.unsized_feature_enabled() { let span = term.source_info.span; self.ensure_place_sized(dest_ty, span); } @@ -1884,7 +1887,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { // When `unsized_fn_params` or `unsized_locals` is enabled, only function calls // and nullary ops are checked in `check_call_dest`. - if !(self.tcx().features().unsized_locals || self.tcx().features().unsized_fn_params) { + if !self.unsized_feature_enabled() { let span = local_decl.source_info.span; let ty = local_decl.ty; self.ensure_place_sized(ty, span); @@ -2026,7 +2029,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { Rvalue::NullaryOp(_, ty) => { // Even with unsized locals cannot box an unsized value. - if self.tcx().features().unsized_locals || self.tcx().features().unsized_fn_params { + if self.unsized_feature_enabled() { let span = body.source_info(location).span; self.ensure_place_sized(ty, span); } From cc9ab1cd58e55de4e60cfaf884e89a9d66563b38 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Wed, 21 Oct 2020 08:23:40 -0300 Subject: [PATCH 22/22] Merge unsized locals pat tests --- .../ui/unsized-locals/unsized-local-pat.rs | 13 ---------- .../unsized-locals/unsized-local-pat.stderr | 23 ------------------ .../unsized-locals-using-unsized-fn-params.rs | 8 ++++++- ...ized-locals-using-unsized-fn-params.stderr | 24 +++++++++++++++++-- 4 files changed, 29 insertions(+), 39 deletions(-) delete mode 100644 src/test/ui/unsized-locals/unsized-local-pat.rs delete mode 100644 src/test/ui/unsized-locals/unsized-local-pat.stderr diff --git a/src/test/ui/unsized-locals/unsized-local-pat.rs b/src/test/ui/unsized-locals/unsized-local-pat.rs deleted file mode 100644 index 5793d3fb499a7..0000000000000 --- a/src/test/ui/unsized-locals/unsized-local-pat.rs +++ /dev/null @@ -1,13 +0,0 @@ -#![feature(box_patterns)] -#![feature(unsized_fn_params)] - -// Ensure that even with unsized_fn_params, unsized types in parameter patterns are not accepted. - -#[allow(dead_code)] -fn f1(box box _b: Box>) {} -//~^ ERROR: the size for values of type `[u8]` cannot be known at compilation time [E0277] - -fn f2((_x, _y): (i32, [i32])) {} -//~^ ERROR: the size for values of type `[i32]` cannot be known at compilation time [E0277] - -fn main() {} diff --git a/src/test/ui/unsized-locals/unsized-local-pat.stderr b/src/test/ui/unsized-locals/unsized-local-pat.stderr deleted file mode 100644 index 01449b45b8965..0000000000000 --- a/src/test/ui/unsized-locals/unsized-local-pat.stderr +++ /dev/null @@ -1,23 +0,0 @@ -error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> $DIR/unsized-local-pat.rs:7:15 - | -LL | fn f1(box box _b: Box>) {} - | ^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[u8]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - -error[E0277]: the size for values of type `[i32]` cannot be known at compilation time - --> $DIR/unsized-local-pat.rs:10:12 - | -LL | fn f2((_x, _y): (i32, [i32])) {} - | ^^ doesn't have a size known at compile-time - | - = help: the trait `Sized` is not implemented for `[i32]` - = note: all local variables must have a statically known size - = help: unsized locals are gated as an unstable feature - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs index 6d39c8c8172cd..15263954ced77 100644 --- a/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs +++ b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.rs @@ -1,6 +1,12 @@ +#![feature(box_patterns)] #![feature(unsized_fn_params)] -// Ensure that even with unsized_fn_params, unsized locals are not accepted. +#[allow(dead_code)] +fn f1(box box _b: Box>) {} +//~^ ERROR: the size for values of type `[u8]` cannot be known at compilation time [E0277] + +fn f2((_x, _y): (i32, [i32])) {} +//~^ ERROR: the size for values of type `[i32]` cannot be known at compilation time [E0277] fn main() { let foo: Box<[u8]> = Box::new(*b"foo"); diff --git a/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr index 1f5ce5bc2df09..da77026673d96 100644 --- a/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr +++ b/src/test/ui/unsized-locals/unsized-locals-using-unsized-fn-params.stderr @@ -1,5 +1,25 @@ error[E0277]: the size for values of type `[u8]` cannot be known at compilation time - --> $DIR/unsized-locals-using-unsized-fn-params.rs:7:9 + --> $DIR/unsized-locals-using-unsized-fn-params.rs:5:15 + | +LL | fn f1(box box _b: Box>) {} + | ^^ doesn't have a size known at compile-time + | + = help: the trait `Sized` is not implemented for `[u8]` + = note: all local variables must have a statically known size + = help: unsized locals are gated as an unstable feature + +error[E0277]: the size for values of type `[i32]` cannot be known at compilation time + --> $DIR/unsized-locals-using-unsized-fn-params.rs:8:12 + | +LL | fn f2((_x, _y): (i32, [i32])) {} + | ^^ doesn't have a size known at compile-time + | + = help: the trait `Sized` is not implemented for `[i32]` + = note: all local variables must have a statically known size + = help: unsized locals are gated as an unstable feature + +error[E0277]: the size for values of type `[u8]` cannot be known at compilation time + --> $DIR/unsized-locals-using-unsized-fn-params.rs:13:9 | LL | let _foo: [u8] = *foo; | ^^^^ doesn't have a size known at compile-time @@ -8,6 +28,6 @@ LL | let _foo: [u8] = *foo; = note: all local variables must have a statically known size = help: unsized locals are gated as an unstable feature -error: aborting due to previous error +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0277`.