summary refs log tree commit diff
path: root/src/test/ui
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-11-10 19:10:12 +0000
committerbors <bors@rust-lang.org>2017-11-10 19:10:12 +0000
commita35a3abcda67a729edbb7d649dbc663c6feabd4c (patch)
tree57774687c76fadcb30a945409bcc3738d40901a0 /src/test/ui
parent75d25acd977085e6ae01d6a5c56cbbfc97463f89 (diff)
parent765076faabcceba7cc75ae78c4923f89bb34975b (diff)
downloadrust-a35a3abcda67a729edbb7d649dbc663c6feabd4c.tar.gz
rust-a35a3abcda67a729edbb7d649dbc663c6feabd4c.zip
Auto merge of #45050 - petrochenkov:ambind, r=nikomatsakis
resolve: Use same rules for disambiguating fresh bindings in `match` and `let`

Resolve `Unit` as a unit struct pattern in
```rust
struct Unit;

let Unit = x;
```
consistently with
```rust
match x {
    Unit => {}
}
```
It was previously an error.
(The change also applies to unit variants and constants.)

Fixes https://users.rust-lang.org/t/e0530-cannot-shadow-unit-structs-what-in-the-earthly-what/13054
(This particular change doesn't depend on a fix for the issue mentioned in https://users.rust-lang.org/t/e0530-cannot-shadow-unit-structs-what-in-the-earthly-what/13054/4)

cc @rust-lang/lang
r? @nikomatsakis
Diffstat (limited to 'src/test/ui')
-rw-r--r--src/test/ui/const-pattern-irrefutable.rs26
-rw-r--r--src/test/ui/const-pattern-irrefutable.stderr20
-rw-r--r--src/test/ui/resolve/name-clash-nullary.rs13
-rw-r--r--src/test/ui/resolve/name-clash-nullary.stderr11
4 files changed, 70 insertions, 0 deletions
diff --git a/src/test/ui/const-pattern-irrefutable.rs b/src/test/ui/const-pattern-irrefutable.rs
new file mode 100644
index 00000000000..af0b95e002d
--- /dev/null
+++ b/src/test/ui/const-pattern-irrefutable.rs
@@ -0,0 +1,26 @@
+// Copyright 2015 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+mod foo {
+    pub const b: u8 = 2;
+    pub const d: u8 = 2;
+}
+
+use foo::b as c;
+use foo::d;
+
+const a: u8 = 2;
+
+fn main() {
+    let a = 4; //~ ERROR refutable pattern in local binding: `_` not covered
+    let c = 4; //~ ERROR refutable pattern in local binding: `_` not covered
+    let d = 4; //~ ERROR refutable pattern in local binding: `_` not covered
+    fn f() {} // Check that the `NOTE`s still work with an item here (c.f. issue #35115).
+}
diff --git a/src/test/ui/const-pattern-irrefutable.stderr b/src/test/ui/const-pattern-irrefutable.stderr
new file mode 100644
index 00000000000..af48b773638
--- /dev/null
+++ b/src/test/ui/const-pattern-irrefutable.stderr
@@ -0,0 +1,20 @@
+error[E0005]: refutable pattern in local binding: `_` not covered
+  --> $DIR/const-pattern-irrefutable.rs:22:9
+   |
+22 |     let a = 4; //~ ERROR refutable pattern in local binding: `_` not covered
+   |         ^ interpreted as a constant pattern, not new variable
+
+error[E0005]: refutable pattern in local binding: `_` not covered
+  --> $DIR/const-pattern-irrefutable.rs:23:9
+   |
+23 |     let c = 4; //~ ERROR refutable pattern in local binding: `_` not covered
+   |         ^ interpreted as a constant pattern, not new variable
+
+error[E0005]: refutable pattern in local binding: `_` not covered
+  --> $DIR/const-pattern-irrefutable.rs:24:9
+   |
+24 |     let d = 4; //~ ERROR refutable pattern in local binding: `_` not covered
+   |         ^ interpreted as a constant pattern, not new variable
+
+error: aborting due to 3 previous errors
+
diff --git a/src/test/ui/resolve/name-clash-nullary.rs b/src/test/ui/resolve/name-clash-nullary.rs
new file mode 100644
index 00000000000..adf52c6d8e6
--- /dev/null
+++ b/src/test/ui/resolve/name-clash-nullary.rs
@@ -0,0 +1,13 @@
+// Copyright 2012-2014 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn main() {
+  let None: isize = 42; //~ ERROR mismatched types
+}
diff --git a/src/test/ui/resolve/name-clash-nullary.stderr b/src/test/ui/resolve/name-clash-nullary.stderr
new file mode 100644
index 00000000000..014b1fe1b5b
--- /dev/null
+++ b/src/test/ui/resolve/name-clash-nullary.stderr
@@ -0,0 +1,11 @@
+error[E0308]: mismatched types
+  --> $DIR/name-clash-nullary.rs:12:7
+   |
+12 |   let None: isize = 42; //~ ERROR mismatched types
+   |       ^^^^ expected isize, found enum `std::option::Option`
+   |
+   = note: expected type `isize`
+              found type `std::option::Option<_>`
+
+error: aborting due to previous error
+