about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2011-07-06 13:36:27 -0700
committerBrian Anderson <banderson@mozilla.com>2011-07-06 14:04:52 -0700
commit0eac640fdd56caa93d5f398a75d24e62feef4730 (patch)
tree626a90e9558f477b366f9a9b7733ab1b684e32c8
parent05954f37b76e6357fe8c162008176b3477e7b5a8 (diff)
downloadrust-0eac640fdd56caa93d5f398a75d24e62feef4730.tar.gz
rust-0eac640fdd56caa93d5f398a75d24e62feef4730.zip
Swap the expected/actual for typechecking fields of updated records
In 'rec(a = b with c)', if a exists in c then the expected type for b is the
type of c.
-rw-r--r--src/comp/middle/typeck.rs4
-rw-r--r--src/test/compile-fail/rec-extend.rs9
2 files changed, 11 insertions, 2 deletions
diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs
index 6d0ffb43202..5d06e9e7d04 100644
--- a/src/comp/middle/typeck.rs
+++ b/src/comp/middle/typeck.rs
@@ -2120,8 +2120,8 @@ fn check_expr(&@fn_ctxt fcx, &@ast::expr expr) {
                         auto found = false;
                         for (ty::field bf in base_fields) {
                             if (str::eq(f.ident, bf.ident)) {
-                                demand::simple(fcx, expr.span, f.mt.ty,
-                                               bf.mt.ty);
+                                demand::simple(fcx, expr.span, bf.mt.ty,
+                                               f.mt.ty);
                                 found = true;
                             }
                         }
diff --git a/src/test/compile-fail/rec-extend.rs b/src/test/compile-fail/rec-extend.rs
new file mode 100644
index 00000000000..936c76b346f
--- /dev/null
+++ b/src/test/compile-fail/rec-extend.rs
@@ -0,0 +1,9 @@
+// xfail-stage0
+// error-pattern:expected int but found bool
+
+fn main() {
+
+  auto a = rec(foo = 0);
+
+  auto b = rec(foo = true with a);
+}