about summary refs log tree commit diff
path: root/tests/ui/rfc-2005-default-binding-mode
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/rfc-2005-default-binding-mode')
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/borrowck-issue-49631.rs24
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/borrowck-issue-49631.stderr14
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/const.rs17
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/const.stderr18
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/enum.rs22
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/enum.stderr21
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/explicit-mut.rs28
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/explicit-mut.stderr21
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/for.rs9
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/for.stderr17
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/issue-44912-or.rs10
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/issue-44912-or.stderr9
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/lit.rs24
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/lit.stderr25
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/no-double-error.rs11
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/no-double-error.stderr9
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/slice.rs7
-rw-r--r--tests/ui/rfc-2005-default-binding-mode/slice.stderr16
18 files changed, 302 insertions, 0 deletions
diff --git a/tests/ui/rfc-2005-default-binding-mode/borrowck-issue-49631.rs b/tests/ui/rfc-2005-default-binding-mode/borrowck-issue-49631.rs
new file mode 100644
index 00000000000..54ab9f0ad33
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/borrowck-issue-49631.rs
@@ -0,0 +1,24 @@
+#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+pub struct Foo {
+}
+
+impl Foo {
+    fn get(&self) -> Option<&Result<String, String>> {
+        None
+    }
+
+    fn mutate(&mut self) { }
+}
+
+fn main() {
+    let mut foo = Foo { };
+
+    // foo.get() returns type Option<&Result<String, String>>, so
+    // using `string` keeps borrow of `foo` alive. Hence calling
+    // `foo.mutate()` should be an error.
+    while let Some(Ok(string)) = foo.get() {
+        foo.mutate();
+        //~^ ERROR cannot borrow `foo` as mutable
+        println!("foo={:?}", *string);
+    }
+}
diff --git a/tests/ui/rfc-2005-default-binding-mode/borrowck-issue-49631.stderr b/tests/ui/rfc-2005-default-binding-mode/borrowck-issue-49631.stderr
new file mode 100644
index 00000000000..b7c0b0bb6b9
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/borrowck-issue-49631.stderr
@@ -0,0 +1,14 @@
+error[E0502]: cannot borrow `foo` as mutable because it is also borrowed as immutable
+  --> $DIR/borrowck-issue-49631.rs:20:9
+   |
+LL |     while let Some(Ok(string)) = foo.get() {
+   |                                  --------- immutable borrow occurs here
+LL |         foo.mutate();
+   |         ^^^^^^^^^^^^ mutable borrow occurs here
+LL |
+LL |         println!("foo={:?}", *string);
+   |                              ------- immutable borrow later used here
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0502`.
diff --git a/tests/ui/rfc-2005-default-binding-mode/const.rs b/tests/ui/rfc-2005-default-binding-mode/const.rs
new file mode 100644
index 00000000000..93df880408d
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/const.rs
@@ -0,0 +1,17 @@
+// FIXME(tschottdorf): this test should pass.
+
+#[derive(PartialEq, Eq)]
+struct Foo {
+    bar: i32,
+}
+
+const FOO: Foo = Foo{bar: 5};
+
+fn main() {
+    let f = Foo{bar:6};
+
+    match &f {
+        FOO => {}, //~ ERROR mismatched types
+        _ => panic!(),
+    }
+}
diff --git a/tests/ui/rfc-2005-default-binding-mode/const.stderr b/tests/ui/rfc-2005-default-binding-mode/const.stderr
new file mode 100644
index 00000000000..0f567125432
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/const.stderr
@@ -0,0 +1,18 @@
+error[E0308]: mismatched types
+  --> $DIR/const.rs:14:9
+   |
+LL | const FOO: Foo = Foo{bar: 5};
+   | -------------- constant defined here
+...
+LL |     match &f {
+   |           -- this expression has type `&Foo`
+LL |         FOO => {},
+   |         ^^^
+   |         |
+   |         expected `&Foo`, found struct `Foo`
+   |         `FOO` is interpreted as a constant, not a new binding
+   |         help: introduce a new binding instead: `other_foo`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/rfc-2005-default-binding-mode/enum.rs b/tests/ui/rfc-2005-default-binding-mode/enum.rs
new file mode 100644
index 00000000000..4e57769d6e2
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/enum.rs
@@ -0,0 +1,22 @@
+enum Wrapper {
+    Wrap(i32),
+}
+
+use Wrapper::Wrap;
+
+pub fn main() {
+    let Wrap(x) = &Wrap(3);
+    *x += 1; //~ ERROR cannot assign to `*x`, which is behind a `&` reference
+
+
+    if let Some(x) = &Some(3) {
+        *x += 1; //~ ERROR cannot assign to `*x`, which is behind a `&` reference
+    } else {
+        panic!();
+    }
+
+    while let Some(x) = &Some(3) {
+        *x += 1; //~ ERROR cannot assign to `*x`, which is behind a `&` reference
+        break;
+    }
+}
diff --git a/tests/ui/rfc-2005-default-binding-mode/enum.stderr b/tests/ui/rfc-2005-default-binding-mode/enum.stderr
new file mode 100644
index 00000000000..21e3d3d273d
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/enum.stderr
@@ -0,0 +1,21 @@
+error[E0594]: cannot assign to `*x`, which is behind a `&` reference
+  --> $DIR/enum.rs:9:5
+   |
+LL |     *x += 1;
+   |     ^^^^^^^ `x` is a `&` reference, so the data it refers to cannot be written
+
+error[E0594]: cannot assign to `*x`, which is behind a `&` reference
+  --> $DIR/enum.rs:13:9
+   |
+LL |         *x += 1;
+   |         ^^^^^^^ `x` is a `&` reference, so the data it refers to cannot be written
+
+error[E0594]: cannot assign to `*x`, which is behind a `&` reference
+  --> $DIR/enum.rs:19:9
+   |
+LL |         *x += 1;
+   |         ^^^^^^^ `x` is a `&` reference, so the data it refers to cannot be written
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0594`.
diff --git a/tests/ui/rfc-2005-default-binding-mode/explicit-mut.rs b/tests/ui/rfc-2005-default-binding-mode/explicit-mut.rs
new file mode 100644
index 00000000000..b8fde2208ac
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/explicit-mut.rs
@@ -0,0 +1,28 @@
+// Verify the binding mode shifts - only when no `&` are auto-dereferenced is the
+// final default binding mode mutable.
+
+fn main() {
+    match &&Some(5i32) {
+        Some(n) => {
+            *n += 1; //~ ERROR cannot assign to `*n`, which is behind a `&` reference
+            let _ = n;
+        }
+        None => {},
+    };
+
+    match &mut &Some(5i32) {
+        Some(n) => {
+            *n += 1; //~ ERROR cannot assign to `*n`, which is behind a `&` reference
+            let _ = n;
+        }
+        None => {},
+    };
+
+    match &&mut Some(5i32) {
+        Some(n) => {
+            *n += 1; //~ ERROR cannot assign to `*n`, which is behind a `&` reference
+            let _ = n;
+        }
+        None => {},
+    };
+}
diff --git a/tests/ui/rfc-2005-default-binding-mode/explicit-mut.stderr b/tests/ui/rfc-2005-default-binding-mode/explicit-mut.stderr
new file mode 100644
index 00000000000..c3f64f65a41
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/explicit-mut.stderr
@@ -0,0 +1,21 @@
+error[E0594]: cannot assign to `*n`, which is behind a `&` reference
+  --> $DIR/explicit-mut.rs:7:13
+   |
+LL |             *n += 1;
+   |             ^^^^^^^ `n` is a `&` reference, so the data it refers to cannot be written
+
+error[E0594]: cannot assign to `*n`, which is behind a `&` reference
+  --> $DIR/explicit-mut.rs:15:13
+   |
+LL |             *n += 1;
+   |             ^^^^^^^ `n` is a `&` reference, so the data it refers to cannot be written
+
+error[E0594]: cannot assign to `*n`, which is behind a `&` reference
+  --> $DIR/explicit-mut.rs:23:13
+   |
+LL |             *n += 1;
+   |             ^^^^^^^ `n` is a `&` reference, so the data it refers to cannot be written
+
+error: aborting due to 3 previous errors
+
+For more information about this error, try `rustc --explain E0594`.
diff --git a/tests/ui/rfc-2005-default-binding-mode/for.rs b/tests/ui/rfc-2005-default-binding-mode/for.rs
new file mode 100644
index 00000000000..d6c5a13b1bd
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/for.rs
@@ -0,0 +1,9 @@
+struct Foo {}
+
+pub fn main() {
+    let mut tups = vec![(Foo {}, Foo {})];
+    // The below desugars to &(ref n, mut m).
+    for (n, mut m) in &tups {
+        //~^ ERROR cannot move out of a shared reference
+    }
+}
diff --git a/tests/ui/rfc-2005-default-binding-mode/for.stderr b/tests/ui/rfc-2005-default-binding-mode/for.stderr
new file mode 100644
index 00000000000..07991af6ef9
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/for.stderr
@@ -0,0 +1,17 @@
+error[E0507]: cannot move out of a shared reference
+  --> $DIR/for.rs:6:23
+   |
+LL |     for (n, mut m) in &tups {
+   |             -----     ^^^^^
+   |             |
+   |             data moved here
+   |             move occurs because `m` has type `Foo`, which does not implement the `Copy` trait
+   |
+help: consider borrowing the pattern binding
+   |
+LL |     for (n, ref mut m) in &tups {
+   |             +++
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0507`.
diff --git a/tests/ui/rfc-2005-default-binding-mode/issue-44912-or.rs b/tests/ui/rfc-2005-default-binding-mode/issue-44912-or.rs
new file mode 100644
index 00000000000..b4a0d8145c1
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/issue-44912-or.rs
@@ -0,0 +1,10 @@
+// FIXME(tschottdorf): This should compile. See #44912.
+
+pub fn main() {
+    let x = &Some((3, 3));
+    let _: &i32 = match x {
+        Some((x, 3)) | &Some((ref x, 5)) => x,
+        //~^ ERROR is bound inconsistently
+        _ => &5i32,
+    };
+}
diff --git a/tests/ui/rfc-2005-default-binding-mode/issue-44912-or.stderr b/tests/ui/rfc-2005-default-binding-mode/issue-44912-or.stderr
new file mode 100644
index 00000000000..e1e1bf7f6d9
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/issue-44912-or.stderr
@@ -0,0 +1,9 @@
+error[E0409]: variable `x` is bound inconsistently across alternatives separated by `|`
+  --> $DIR/issue-44912-or.rs:6:35
+   |
+LL |         Some((x, 3)) | &Some((ref x, 5)) => x,
+   |               - first binding     ^ bound in different ways
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0409`.
diff --git a/tests/ui/rfc-2005-default-binding-mode/lit.rs b/tests/ui/rfc-2005-default-binding-mode/lit.rs
new file mode 100644
index 00000000000..ce79cfbdc1a
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/lit.rs
@@ -0,0 +1,24 @@
+// FIXME(tschottdorf): we want these to compile, but they don't.
+
+fn with_str() {
+    let s: &'static str = "abc";
+
+    match &s {
+            "abc" => true, //~ ERROR mismatched types
+            _ => panic!(),
+    };
+}
+
+fn with_bytes() {
+    let s: &'static [u8] = b"abc";
+
+    match &s {
+        b"abc" => true, //~ ERROR mismatched types
+        _ => panic!(),
+    };
+}
+
+pub fn main() {
+    with_str();
+    with_bytes();
+}
diff --git a/tests/ui/rfc-2005-default-binding-mode/lit.stderr b/tests/ui/rfc-2005-default-binding-mode/lit.stderr
new file mode 100644
index 00000000000..11bc170cdfa
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/lit.stderr
@@ -0,0 +1,25 @@
+error[E0308]: mismatched types
+  --> $DIR/lit.rs:7:13
+   |
+LL |     match &s {
+   |           -- this expression has type `&&str`
+LL |             "abc" => true,
+   |             ^^^^^ expected `&str`, found `str`
+   |
+   = note: expected reference `&&str`
+              found reference `&'static str`
+
+error[E0308]: mismatched types
+  --> $DIR/lit.rs:16:9
+   |
+LL |     match &s {
+   |           -- this expression has type `&&[u8]`
+LL |         b"abc" => true,
+   |         ^^^^^^ expected `&[u8]`, found array `[u8; 3]`
+   |
+   = note: expected reference `&&[u8]`
+              found reference `&'static [u8; 3]`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/rfc-2005-default-binding-mode/no-double-error.rs b/tests/ui/rfc-2005-default-binding-mode/no-double-error.rs
new file mode 100644
index 00000000000..46fdfd678cc
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/no-double-error.rs
@@ -0,0 +1,11 @@
+// Without caching type lookups in FnCtxt.resolve_ty_and_def_ufcs
+// the error below would be reported twice (once when checking
+// for a non-ref pattern, once when processing the pattern).
+
+fn main() {
+    let foo = 22;
+    match foo {
+        u32::XXX => { } //~ ERROR no associated item named
+        _ => { }
+    }
+}
diff --git a/tests/ui/rfc-2005-default-binding-mode/no-double-error.stderr b/tests/ui/rfc-2005-default-binding-mode/no-double-error.stderr
new file mode 100644
index 00000000000..c672acee040
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/no-double-error.stderr
@@ -0,0 +1,9 @@
+error[E0599]: no associated item named `XXX` found for type `u32` in the current scope
+  --> $DIR/no-double-error.rs:8:14
+   |
+LL |         u32::XXX => { }
+   |              ^^^ associated item not found in `u32`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0599`.
diff --git a/tests/ui/rfc-2005-default-binding-mode/slice.rs b/tests/ui/rfc-2005-default-binding-mode/slice.rs
new file mode 100644
index 00000000000..363a0e3e649
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/slice.rs
@@ -0,0 +1,7 @@
+pub fn main() {
+    let sl: &[u8] = b"foo";
+
+    match sl { //~ ERROR non-exhaustive patterns
+        [first, remainder @ ..] => {},
+    };
+}
diff --git a/tests/ui/rfc-2005-default-binding-mode/slice.stderr b/tests/ui/rfc-2005-default-binding-mode/slice.stderr
new file mode 100644
index 00000000000..60c1f5420f6
--- /dev/null
+++ b/tests/ui/rfc-2005-default-binding-mode/slice.stderr
@@ -0,0 +1,16 @@
+error[E0004]: non-exhaustive patterns: `&[]` not covered
+  --> $DIR/slice.rs:4:11
+   |
+LL |     match sl {
+   |           ^^ pattern `&[]` not covered
+   |
+   = note: the matched value is of type `&[u8]`
+help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
+   |
+LL ~         [first, remainder @ ..] => {}
+LL ~         &[] => todo!(),
+   |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0004`.