diff options
| author | Brian Anderson <[email protected]> | 2011-03-27 18:51:25 -0400 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-03-28 21:14:04 -0700 |
| commit | aced4ce145bf23cc945c58a6c9c1bc1f33359a06 (patch) | |
| tree | 92d233fd79b9ee0f119bc89ee329b6be07047c09 | |
| parent | Teach rustc to use the result of if expressions (diff) | |
| download | rust-aced4ce145bf23cc945c58a6c9c1bc1f33359a06.tar.xz rust-aced4ce145bf23cc945c58a6c9c1bc1f33359a06.zip | |
Handle structural types as the result of if expressions
| -rw-r--r-- | src/comp/middle/trans.rs | 3 | ||||
| -rw-r--r-- | src/test/run-pass/expr-if-struct.rs | 24 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 82ba8654..433a8012 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -3049,6 +3049,9 @@ fn trans_if(@block_ctxt cx, @ast.expr cond, // FIXME: Handle dynamic type sizes auto expr_ty = ty.expr_ty(elexpr); expr_llty = type_of(else_res.bcx.fcx.ccx, expr_ty); + if (ty.type_is_structural(expr_ty)) { + expr_llty = T_ptr(expr_llty); + } } case (_) { else_res = res(else_cx, C_nil()); diff --git a/src/test/run-pass/expr-if-struct.rs b/src/test/run-pass/expr-if-struct.rs new file mode 100644 index 00000000..df20a3ba --- /dev/null +++ b/src/test/run-pass/expr-if-struct.rs @@ -0,0 +1,24 @@ +// xfail-boot +// -*- rust -*- + +// Tests for if as expressions returning structural types + +fn test_rec() { + auto res = if (true) { rec(i = 100) } else { rec(i = 101) }; + check (res == rec(i = 100)); +} + +fn test_tag() { + tag mood { + happy; + sad; + } + + auto res = if (true) { happy } else { sad }; + check (res == happy); +} + +fn main() { + test_rec(); + test_tag(); +}
\ No newline at end of file |