From 0eac640fdd56caa93d5f398a75d24e62feef4730 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 6 Jul 2011 13:36:27 -0700 Subject: [PATCH] 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. --- src/comp/middle/typeck.rs | 4 ++-- src/test/compile-fail/rec-extend.rs | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 src/test/compile-fail/rec-extend.rs diff --git a/src/comp/middle/typeck.rs b/src/comp/middle/typeck.rs index 6d0ffb432026..5d06e9e7d04a 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 000000000000..936c76b346ff --- /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); +}