From 4e50c5b6e45fc1b21b0e0bd6f7c9c5389e0b637f Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Sat, 11 Aug 2018 06:15:58 -0400 Subject: [PATCH] add tests for assigning fields without initializing var We did not seem to have any! --- src/test/ui/nll/assign_mutable_fields.rs | 34 ++++++++++++++ src/test/ui/nll/assign_mutable_fields.stderr | 9 ++++ .../ui/nll/reassignment_immutable_fields.rs | 32 ++++++++++++++ .../nll/reassignment_immutable_fields.stderr | 44 +++++++++++++++++++ ...assignment_immutable_fields_overlapping.rs | 28 ++++++++++++ ...gnment_immutable_fields_overlapping.stderr | 20 +++++++++ .../reassignment_immutable_fields_twice.rs | 29 ++++++++++++ ...reassignment_immutable_fields_twice.stderr | 38 ++++++++++++++++ 8 files changed, 234 insertions(+) create mode 100644 src/test/ui/nll/assign_mutable_fields.rs create mode 100644 src/test/ui/nll/assign_mutable_fields.stderr create mode 100644 src/test/ui/nll/reassignment_immutable_fields.rs create mode 100644 src/test/ui/nll/reassignment_immutable_fields.stderr create mode 100644 src/test/ui/nll/reassignment_immutable_fields_overlapping.rs create mode 100644 src/test/ui/nll/reassignment_immutable_fields_overlapping.stderr create mode 100644 src/test/ui/nll/reassignment_immutable_fields_twice.rs create mode 100644 src/test/ui/nll/reassignment_immutable_fields_twice.stderr diff --git a/src/test/ui/nll/assign_mutable_fields.rs b/src/test/ui/nll/assign_mutable_fields.rs new file mode 100644 index 00000000000..8025b998d5d --- /dev/null +++ b/src/test/ui/nll/assign_mutable_fields.rs @@ -0,0 +1,34 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Currently, we permit you to assign to individual fields of a mut +// var, but we do not permit you to use the complete var afterwards. +// We hope to fix this at some point. +// +// FIXME(#21232) + +#![feature(nll)] + +fn assign_both_fields_and_use() { + let mut x: (u32, u32); + x.0 = 1; + x.1 = 22; + drop(x.0); + drop(x.1); +} + +fn assign_both_fields_the_use_var() { + let mut x: (u32, u32); + x.0 = 1; + x.1 = 22; + drop(x); //~ ERROR +} + +fn main() { } diff --git a/src/test/ui/nll/assign_mutable_fields.stderr b/src/test/ui/nll/assign_mutable_fields.stderr new file mode 100644 index 00000000000..278dcce4acd --- /dev/null +++ b/src/test/ui/nll/assign_mutable_fields.stderr @@ -0,0 +1,9 @@ +error[E0381]: use of possibly uninitialized variable: `x` + --> $DIR/assign_mutable_fields.rs:31:10 + | +LL | drop(x); //~ ERROR + | ^ use of possibly uninitialized `x` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0381`. diff --git a/src/test/ui/nll/reassignment_immutable_fields.rs b/src/test/ui/nll/reassignment_immutable_fields.rs new file mode 100644 index 00000000000..3660017e75d --- /dev/null +++ b/src/test/ui/nll/reassignment_immutable_fields.rs @@ -0,0 +1,32 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// This test is currently disallowed, but we hope someday to support it. +// +// FIXME(#21232) + +#![feature(nll)] + +fn assign_both_fields_and_use() { + let x: (u32, u32); + x.0 = 1; //~ ERROR + x.1 = 22; //~ ERROR + drop(x.0); + drop(x.1); +} + +fn assign_both_fields_the_use_var() { + let x: (u32, u32); + x.0 = 1; //~ ERROR + x.1 = 22; //~ ERROR + drop(x); //~ ERROR +} + +fn main() { } diff --git a/src/test/ui/nll/reassignment_immutable_fields.stderr b/src/test/ui/nll/reassignment_immutable_fields.stderr new file mode 100644 index 00000000000..853e82d0e99 --- /dev/null +++ b/src/test/ui/nll/reassignment_immutable_fields.stderr @@ -0,0 +1,44 @@ +error[E0594]: cannot assign to `x.0`, as `x` is not declared as mutable + --> $DIR/reassignment_immutable_fields.rs:19:5 + | +LL | let x: (u32, u32); + | - help: consider changing this to be mutable: `mut x` +LL | x.0 = 1; //~ ERROR + | ^^^^^^^ cannot assign + +error[E0594]: cannot assign to `x.1`, as `x` is not declared as mutable + --> $DIR/reassignment_immutable_fields.rs:20:5 + | +LL | let x: (u32, u32); + | - help: consider changing this to be mutable: `mut x` +LL | x.0 = 1; //~ ERROR +LL | x.1 = 22; //~ ERROR + | ^^^^^^^^ cannot assign + +error[E0594]: cannot assign to `x.0`, as `x` is not declared as mutable + --> $DIR/reassignment_immutable_fields.rs:27:5 + | +LL | let x: (u32, u32); + | - help: consider changing this to be mutable: `mut x` +LL | x.0 = 1; //~ ERROR + | ^^^^^^^ cannot assign + +error[E0594]: cannot assign to `x.1`, as `x` is not declared as mutable + --> $DIR/reassignment_immutable_fields.rs:28:5 + | +LL | let x: (u32, u32); + | - help: consider changing this to be mutable: `mut x` +LL | x.0 = 1; //~ ERROR +LL | x.1 = 22; //~ ERROR + | ^^^^^^^^ cannot assign + +error[E0381]: use of possibly uninitialized variable: `x` + --> $DIR/reassignment_immutable_fields.rs:29:10 + | +LL | drop(x); //~ ERROR + | ^ use of possibly uninitialized `x` + +error: aborting due to 5 previous errors + +Some errors occurred: E0381, E0594. +For more information about an error, try `rustc --explain E0381`. diff --git a/src/test/ui/nll/reassignment_immutable_fields_overlapping.rs b/src/test/ui/nll/reassignment_immutable_fields_overlapping.rs new file mode 100644 index 00000000000..17a82bf0c9b --- /dev/null +++ b/src/test/ui/nll/reassignment_immutable_fields_overlapping.rs @@ -0,0 +1,28 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// This should never be allowed -- `foo.a` and `foo.b` are +// overlapping, so since `x` is not `mut` we should not permit +// reassignment. + +#![feature(nll)] + +union Foo { + a: u32, + b: u32, +} + +unsafe fn overlapping_fields() { + let x: Foo; + x.a = 1; //~ ERROR + x.b = 22; //~ ERROR +} + +fn main() { } diff --git a/src/test/ui/nll/reassignment_immutable_fields_overlapping.stderr b/src/test/ui/nll/reassignment_immutable_fields_overlapping.stderr new file mode 100644 index 00000000000..1981b149700 --- /dev/null +++ b/src/test/ui/nll/reassignment_immutable_fields_overlapping.stderr @@ -0,0 +1,20 @@ +error[E0594]: cannot assign to `x.a`, as `x` is not declared as mutable + --> $DIR/reassignment_immutable_fields_overlapping.rs:24:5 + | +LL | let x: Foo; + | - help: consider changing this to be mutable: `mut x` +LL | x.a = 1; //~ ERROR + | ^^^^^^^ cannot assign + +error[E0594]: cannot assign to `x.b`, as `x` is not declared as mutable + --> $DIR/reassignment_immutable_fields_overlapping.rs:25:5 + | +LL | let x: Foo; + | - help: consider changing this to be mutable: `mut x` +LL | x.a = 1; //~ ERROR +LL | x.b = 22; //~ ERROR + | ^^^^^^^^ cannot assign + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0594`. diff --git a/src/test/ui/nll/reassignment_immutable_fields_twice.rs b/src/test/ui/nll/reassignment_immutable_fields_twice.rs new file mode 100644 index 00000000000..e413ad4f947 --- /dev/null +++ b/src/test/ui/nll/reassignment_immutable_fields_twice.rs @@ -0,0 +1,29 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// This should never be allowed -- since `x` is not `mut`, so `x.0` +// cannot be assigned twice. + +#![feature(nll)] + +fn var_then_field() { + let x: (u32, u32); + x = (22, 44); + x.0 = 1; //~ ERROR +} + +fn same_field_twice() { + let x: (u32, u32); + x.0 = 1; //~ ERROR + x.0 = 22; //~ ERROR + x.1 = 44; //~ ERROR +} + +fn main() { } diff --git a/src/test/ui/nll/reassignment_immutable_fields_twice.stderr b/src/test/ui/nll/reassignment_immutable_fields_twice.stderr new file mode 100644 index 00000000000..cf0461f275c --- /dev/null +++ b/src/test/ui/nll/reassignment_immutable_fields_twice.stderr @@ -0,0 +1,38 @@ +error[E0594]: cannot assign to `x.0`, as `x` is not declared as mutable + --> $DIR/reassignment_immutable_fields_twice.rs:19:5 + | +LL | let x: (u32, u32); + | - help: consider changing this to be mutable: `mut x` +LL | x = (22, 44); +LL | x.0 = 1; //~ ERROR + | ^^^^^^^ cannot assign + +error[E0594]: cannot assign to `x.0`, as `x` is not declared as mutable + --> $DIR/reassignment_immutable_fields_twice.rs:24:5 + | +LL | let x: (u32, u32); + | - help: consider changing this to be mutable: `mut x` +LL | x.0 = 1; //~ ERROR + | ^^^^^^^ cannot assign + +error[E0594]: cannot assign to `x.0`, as `x` is not declared as mutable + --> $DIR/reassignment_immutable_fields_twice.rs:25:5 + | +LL | let x: (u32, u32); + | - help: consider changing this to be mutable: `mut x` +LL | x.0 = 1; //~ ERROR +LL | x.0 = 22; //~ ERROR + | ^^^^^^^^ cannot assign + +error[E0594]: cannot assign to `x.1`, as `x` is not declared as mutable + --> $DIR/reassignment_immutable_fields_twice.rs:26:5 + | +LL | let x: (u32, u32); + | - help: consider changing this to be mutable: `mut x` +... +LL | x.1 = 44; //~ ERROR + | ^^^^^^^^ cannot assign + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0594`. -- GitLab