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();