about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDeadbeef <ent3rm4n@gmail.com>2022-07-13 18:13:07 +0000
committerDeadbeef <ent3rm4n@gmail.com>2022-11-18 06:16:20 +0000
commitc74f155b24005790fdc1ddf787a47e2bda38e01c (patch)
treea167b6de8f2763fb12c8978d63bae16ef6911211
parentd1c6b797deafbc9d3311a1e02db9623e75419218 (diff)
downloadrust-c74f155b24005790fdc1ddf787a47e2bda38e01c.tar.gz
rust-c74f155b24005790fdc1ddf787a47e2bda38e01c.zip
Adding more tests
-rw-r--r--src/test/mir-opt/deref-patterns/string.foo.PreCodegen.after.mir74
-rw-r--r--src/test/mir-opt/deref-patterns/string.rs12
-rw-r--r--src/test/ui/deref-patterns/default-infer.rs9
-rw-r--r--src/test/ui/deref-patterns/gate.stderr2
-rw-r--r--src/test/ui/deref-patterns/mir.rs12
-rw-r--r--src/test/ui/deref-patterns/mir.stdout99
-rw-r--r--src/test/ui/deref-patterns/refs.rs18
7 files changed, 114 insertions, 112 deletions
diff --git a/src/test/mir-opt/deref-patterns/string.foo.PreCodegen.after.mir b/src/test/mir-opt/deref-patterns/string.foo.PreCodegen.after.mir
new file mode 100644
index 00000000000..5b185082d4d
--- /dev/null
+++ b/src/test/mir-opt/deref-patterns/string.foo.PreCodegen.after.mir
@@ -0,0 +1,74 @@
+// MIR for `foo` after PreCodegen
+
+fn foo(_1: Option<String>) -> i32 {
+    debug s => _1;                       // in scope 0 at $DIR/string.rs:+0:12: +0:13
+    let mut _0: i32;                     // return place in scope 0 at $DIR/string.rs:+0:34: +0:37
+    let mut _2: &std::string::String;    // in scope 0 at $DIR/string.rs:+2:14: +2:17
+    let mut _3: &str;                    // in scope 0 at $DIR/string.rs:+2:14: +2:17
+    let mut _4: bool;                    // in scope 0 at $DIR/string.rs:+2:14: +2:17
+    let mut _5: isize;                   // in scope 0 at $DIR/string.rs:+2:9: +2:18
+    let _6: std::option::Option<std::string::String>; // in scope 0 at $DIR/string.rs:+3:9: +3:10
+    let mut _7: bool;                    // in scope 0 at $DIR/string.rs:+5:1: +5:2
+    scope 1 {
+        debug s => _6;                   // in scope 1 at $DIR/string.rs:+3:9: +3:10
+    }
+
+    bb0: {
+        _7 = const false;                // scope 0 at $DIR/string.rs:+1:11: +1:12
+        _7 = const true;                 // scope 0 at $DIR/string.rs:+1:11: +1:12
+        _5 = discriminant(_1);           // scope 0 at $DIR/string.rs:+1:11: +1:12
+        switchInt(move _5) -> [1_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/string.rs:+1:5: +1:12
+    }
+
+    bb1: {
+        StorageLive(_6);                 // scope 0 at $DIR/string.rs:+3:9: +3:10
+        _7 = const false;                // scope 0 at $DIR/string.rs:+3:9: +3:10
+        _6 = move _1;                    // scope 0 at $DIR/string.rs:+3:9: +3:10
+        _0 = const 4321_i32;             // scope 1 at $DIR/string.rs:+3:14: +3:18
+        drop(_6) -> bb6;                 // scope 0 at $DIR/string.rs:+3:17: +3:18
+    }
+
+    bb2: {
+        _2 = &((_1 as Some).0: std::string::String); // scope 0 at $DIR/string.rs:+2:14: +2:17
+        _3 = <String as Deref>::deref(move _2) -> bb3; // scope 0 at $DIR/string.rs:+2:14: +2:17
+                                         // mir::Constant
+                                         // + span: $DIR/string.rs:9:14: 9:17
+                                         // + literal: Const { ty: for<'a> fn(&'a String) -> &'a <String as Deref>::Target {<String as Deref>::deref}, val: Value(<ZST>) }
+    }
+
+    bb3: {
+        _4 = <str as PartialEq>::eq(_3, const "a") -> bb4; // scope 0 at $DIR/string.rs:+2:14: +2:17
+                                         // mir::Constant
+                                         // + span: $DIR/string.rs:9:14: 9:17
+                                         // + literal: Const { ty: for<'a, 'b> fn(&'a str, &'b str) -> bool {<str as PartialEq>::eq}, val: Value(<ZST>) }
+                                         // mir::Constant
+                                         // + span: $DIR/string.rs:9:14: 9:17
+                                         // + literal: Const { ty: &str, val: Value(Slice(..)) }
+    }
+
+    bb4: {
+        switchInt(move _4) -> [false: bb1, otherwise: bb5]; // scope 0 at $DIR/string.rs:+2:14: +2:17
+    }
+
+    bb5: {
+        _0 = const 1234_i32;             // scope 0 at $DIR/string.rs:+2:22: +2:26
+        goto -> bb9;                     // scope 0 at $DIR/string.rs:+2:22: +2:26
+    }
+
+    bb6: {
+        StorageDead(_6);                 // scope 0 at $DIR/string.rs:+3:17: +3:18
+        goto -> bb9;                     // scope 0 at $DIR/string.rs:+3:17: +3:18
+    }
+
+    bb7: {
+        return;                          // scope 0 at $DIR/string.rs:+5:2: +5:2
+    }
+
+    bb8: {
+        drop(_1) -> bb7;                 // scope 0 at $DIR/string.rs:+5:1: +5:2
+    }
+
+    bb9: {
+        switchInt(_7) -> [false: bb7, otherwise: bb8]; // scope 0 at $DIR/string.rs:+5:1: +5:2
+    }
+}
diff --git a/src/test/mir-opt/deref-patterns/string.rs b/src/test/mir-opt/deref-patterns/string.rs
new file mode 100644
index 00000000000..2557f75b267
--- /dev/null
+++ b/src/test/mir-opt/deref-patterns/string.rs
@@ -0,0 +1,12 @@
+// compile-flags: -Z mir-opt-level=0 -C panic=abort
+
+#![feature(deref_patterns)]
+#![crate_type = "lib"]
+
+// EMIT_MIR string.foo.PreCodegen.after.mir
+pub fn foo(s: Option<String>) -> i32 {
+    match s {
+        Some("a") => 1234,
+        s => 4321,
+    }
+}
diff --git a/src/test/ui/deref-patterns/default-infer.rs b/src/test/ui/deref-patterns/default-infer.rs
new file mode 100644
index 00000000000..b7155b7efff
--- /dev/null
+++ b/src/test/ui/deref-patterns/default-infer.rs
@@ -0,0 +1,9 @@
+// check-pass
+#![feature(deref_patterns)]
+
+fn main() {
+    match <_ as Default>::default() {
+        "" => (),
+        _ => unreachable!(),
+    }
+}
diff --git a/src/test/ui/deref-patterns/gate.stderr b/src/test/ui/deref-patterns/gate.stderr
index 7ffd0eb7e6c..993468b5e82 100644
--- a/src/test/ui/deref-patterns/gate.stderr
+++ b/src/test/ui/deref-patterns/gate.stderr
@@ -1,5 +1,5 @@
 error[E0308]: mismatched types
-  --> $DIR/gate.rs:3:9
+  --> $DIR/gate.rs:4:9
    |
 LL |     match String::new() {
    |           ------------- this expression has type `String`
diff --git a/src/test/ui/deref-patterns/mir.rs b/src/test/ui/deref-patterns/mir.rs
deleted file mode 100644
index 2e7d26d0dfd..00000000000
--- a/src/test/ui/deref-patterns/mir.rs
+++ /dev/null
@@ -1,12 +0,0 @@
-// compile-flags: -Z unpretty=mir
-// build-pass
-#![feature(deref_patterns)]
-
-fn main() {
-    let s = Some(String::new());
-    let a;
-    match s {
-        Some("a") => a = 1234,
-        s => a = 4321,
-    }
-}
diff --git a/src/test/ui/deref-patterns/mir.stdout b/src/test/ui/deref-patterns/mir.stdout
deleted file mode 100644
index e73d37efb24..00000000000
--- a/src/test/ui/deref-patterns/mir.stdout
+++ /dev/null
@@ -1,99 +0,0 @@
-// WARNING: This output format is intended for human consumers only
-// and is subject to change without notice. Knock yourself out.
-fn main() -> () {
-    let mut _0: ();                      // return place in scope 0 at $DIR/mir.rs:5:11: 5:11
-    let _1: std::option::Option<std::string::String>; // in scope 0 at $DIR/mir.rs:6:9: 6:10
-    let mut _2: std::string::String;     // in scope 0 at $DIR/mir.rs:6:18: 6:31
-    let mut _4: &std::string::String;    // in scope 0 at $DIR/mir.rs:9:14: 9:17
-    let mut _5: &str;                    // in scope 0 at $DIR/mir.rs:9:14: 9:17
-    let mut _6: bool;                    // in scope 0 at $DIR/mir.rs:9:14: 9:17
-    let mut _7: isize;                   // in scope 0 at $DIR/mir.rs:9:9: 9:18
-    let mut _9: bool;                    // in scope 0 at $DIR/mir.rs:12:1: 12:2
-    scope 1 {
-        debug s => _1;                   // in scope 1 at $DIR/mir.rs:6:9: 6:10
-        let _3: i32;                     // in scope 1 at $DIR/mir.rs:7:9: 7:10
-        scope 2 {
-            debug a => _3;               // in scope 2 at $DIR/mir.rs:7:9: 7:10
-            let _8: std::option::Option<std::string::String>; // in scope 2 at $DIR/mir.rs:10:9: 10:10
-            scope 3 {
-                debug s => _8;           // in scope 3 at $DIR/mir.rs:10:9: 10:10
-            }
-        }
-    }
-
-    bb0: {
-        _9 = const false;                // scope 0 at $DIR/mir.rs:6:9: 6:10
-        _2 = String::new() -> bb1;       // scope 0 at $DIR/mir.rs:6:18: 6:31
-                                         // mir::Constant
-                                         // + span: $DIR/mir.rs:6:18: 6:29
-                                         // + literal: Const { ty: fn() -> String {String::new}, val: Value(Scalar(<ZST>)) }
-    }
-
-    bb1: {
-        _9 = const true;                 // scope 0 at $DIR/mir.rs:6:13: 6:32
-        Deinit(_1);                      // scope 0 at $DIR/mir.rs:6:13: 6:32
-        ((_1 as Some).0: std::string::String) = move _2; // scope 0 at $DIR/mir.rs:6:13: 6:32
-        discriminant(_1) = 1;            // scope 0 at $DIR/mir.rs:6:13: 6:32
-        _7 = discriminant(_1);           // scope 2 at $DIR/mir.rs:8:11: 8:12
-        switchInt(move _7) -> [1_isize: bb3, otherwise: bb2]; // scope 2 at $DIR/mir.rs:8:5: 8:12
-    }
-
-    bb2: {
-        _9 = const false;                // scope 2 at $DIR/mir.rs:10:9: 10:10
-        _8 = move _1;                    // scope 2 at $DIR/mir.rs:10:9: 10:10
-        _3 = const 4321_i32;             // scope 3 at $DIR/mir.rs:10:14: 10:22
-        drop(_8) -> [return: bb7, unwind: bb12]; // scope 2 at $DIR/mir.rs:10:21: 10:22
-    }
-
-    bb3: {
-        _4 = &((_1 as Some).0: std::string::String); // scope 2 at $DIR/mir.rs:9:14: 9:17
-        _5 = <String as Deref>::deref(move _4) -> bb4; // scope 2 at $DIR/mir.rs:9:14: 9:17
-                                         // mir::Constant
-                                         // + span: $DIR/mir.rs:9:14: 9:17
-                                         // + literal: Const { ty: for<'r> fn(&'r String) -> &'r <String as Deref>::Target {<String as Deref>::deref}, val: Value(Scalar(<ZST>)) }
-    }
-
-    bb4: {
-        _6 = <str as PartialEq>::eq(_5, const "a") -> [return: bb5, unwind: bb12]; // scope 2 at $DIR/mir.rs:9:14: 9:17
-                                         // mir::Constant
-                                         // + span: $DIR/mir.rs:9:14: 9:17
-                                         // + literal: Const { ty: for<'r, 's> fn(&'r str, &'s str) -> bool {<str as PartialEq>::eq}, val: Value(Scalar(<ZST>)) }
-                                         // mir::Constant
-                                         // + span: $DIR/mir.rs:9:14: 9:17
-                                         // + literal: Const { ty: &str, val: Value(Slice(..)) }
-    }
-
-    bb5: {
-        switchInt(move _6) -> [false: bb2, otherwise: bb6]; // scope 2 at $DIR/mir.rs:9:14: 9:17
-    }
-
-    bb6: {
-        _3 = const 1234_i32;             // scope 2 at $DIR/mir.rs:9:22: 9:30
-        goto -> bb7;                     // scope 2 at $DIR/mir.rs:9:22: 9:30
-    }
-
-    bb7: {
-        switchInt(_9) -> [false: bb8, otherwise: bb10]; // scope 0 at $DIR/mir.rs:12:1: 12:2
-    }
-
-    bb8: {
-        _9 = const false;                // scope 0 at $DIR/mir.rs:12:1: 12:2
-        return;                          // scope 0 at $DIR/mir.rs:12:2: 12:2
-    }
-
-    bb9 (cleanup): {
-        resume;                          // scope 0 at $DIR/mir.rs:5:1: 12:2
-    }
-
-    bb10: {
-        drop(_1) -> bb8;                 // scope 0 at $DIR/mir.rs:12:1: 12:2
-    }
-
-    bb11 (cleanup): {
-        drop(_1) -> bb9;                 // scope 0 at $DIR/mir.rs:12:1: 12:2
-    }
-
-    bb12 (cleanup): {
-        switchInt(_9) -> [false: bb9, otherwise: bb11]; // scope 0 at $DIR/mir.rs:12:1: 12:2
-    }
-}
diff --git a/src/test/ui/deref-patterns/refs.rs b/src/test/ui/deref-patterns/refs.rs
new file mode 100644
index 00000000000..6dac46c05fd
--- /dev/null
+++ b/src/test/ui/deref-patterns/refs.rs
@@ -0,0 +1,18 @@
+// check-pass
+#![feature(deref_patterns)]
+
+fn foo(s: &String) -> i32 {
+    match *s {
+        "a" => 42,
+        _ => -1,
+    }
+}
+
+fn bar(s: Option<&&&&String>) -> i32 {
+    match s {
+        Some(&&&&"&&&&") => 1,
+        _ => -1,
+    }
+}
+
+fn main() {}