summaryrefslogtreecommitdiffstats
path: root/src/test/ui/expr/if/if-no-match-bindings.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/expr/if/if-no-match-bindings.rs')
-rw-r--r--src/test/ui/expr/if/if-no-match-bindings.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/test/ui/expr/if/if-no-match-bindings.rs b/src/test/ui/expr/if/if-no-match-bindings.rs
new file mode 100644
index 000000000..ca3df0fdd
--- /dev/null
+++ b/src/test/ui/expr/if/if-no-match-bindings.rs
@@ -0,0 +1,28 @@
+// Checks for `if` expressions with respect to default match bindings.
+// Specifically, we do not accept `if cond { ... }` where `cond: &mut? bool`.
+// Meanwhile, `match cond { true => ..., _ => ... }` does accept that.
+
+// FIXME(@rust-lang/lang-team): consider relaxing this?
+
+fn b_ref<'a>() -> &'a bool { &true }
+fn b_mut_ref<'a>() -> &'a mut bool { &mut true }
+
+fn main() {
+ // This is OK:
+ match b_ref() { true => {}, _ => {} }
+ match b_mut_ref() { true => {}, _ => {} }
+ match &true { true => {}, _ => {} }
+ match &mut true { true => {}, _ => {} }
+
+ // This is NOT:
+ if b_ref() {} //~ ERROR mismatched types [E0308]
+ if b_mut_ref() {} //~ ERROR mismatched types [E0308]
+ if &true {} //~ ERROR mismatched types [E0308]
+ if &mut true {} //~ ERROR mismatched types [E0308]
+
+ // This is also NOT:
+ while b_ref() {} //~ ERROR mismatched types [E0308]
+ while b_mut_ref() {} //~ ERROR mismatched types [E0308]
+ while &true {} //~ ERROR mismatched types [E0308]
+ while &mut true {} //~ ERROR mismatched types [E0308]
+}