summaryrefslogtreecommitdiffstats
path: root/tests/ui/type/type-check/assignment-in-if.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/type/type-check/assignment-in-if.rs')
-rw-r--r--tests/ui/type/type-check/assignment-in-if.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/tests/ui/type/type-check/assignment-in-if.rs b/tests/ui/type/type-check/assignment-in-if.rs
new file mode 100644
index 000000000..ada250df2
--- /dev/null
+++ b/tests/ui/type/type-check/assignment-in-if.rs
@@ -0,0 +1,62 @@
+// Test that the parser does not attempt to parse struct literals
+// within assignments in if expressions.
+
+#![allow(unused_parens)]
+
+struct Foo {
+ foo: usize
+}
+
+fn main() {
+ let x = 1;
+ let y: Foo;
+
+ // `x { ... }` should not be interpreted as a struct literal here
+ if x = x {
+ //~^ ERROR mismatched types
+ println!("{}", x);
+ }
+ // Explicit parentheses on the left should match behavior of above
+ if (x = x) {
+ //~^ ERROR mismatched types
+ println!("{}", x);
+ }
+ // The struct literal interpretation is fine with explicit parentheses on the right
+ if y = (Foo { foo: x }) {
+ //~^ ERROR mismatched types
+ println!("{}", x);
+ }
+ // "invalid left-hand side of assignment" error is suppresed
+ if 3 = x {
+ //~^ ERROR mismatched types
+ println!("{}", x);
+ }
+ if (
+ if true {
+ x = 4 //~ ERROR mismatched types
+ } else {
+ x = 5 //~ ERROR mismatched types
+ }
+ ) {
+ println!("{}", x);
+ }
+
+ if x == x && x = x && x == x {
+ //~^ ERROR mismatched types
+ //~| ERROR mismatched types
+ //~| ERROR mismatched types
+ println!("{}", x);
+ }
+
+ if x == x && x == x && x = x {
+ //~^ ERROR mismatched types
+ //~| ERROR mismatched types
+ println!("{}", x);
+ }
+
+ if x = 1 && x == 1 {
+ //~^ ERROR mismatched types
+ //~| ERROR mismatched types
+ println!("{}", x);
+ }
+}