diff options
| author | bors <bors@rust-lang.org> | 2017-01-07 02:01:51 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-01-07 02:01:51 +0000 |
| commit | 25bfc8aedc805d217e8dd0df606f1ca013a6c838 (patch) | |
| tree | 67aeec9f22f56dc689f95e389b1fb9e16bcb0be1 /src | |
| parent | 7e38a89a7b970181be083691504825a23e6b0a0f (diff) | |
| parent | 97c008c39839a6feec2e6177ba7682a43c7a8d2f (diff) | |
| download | rust-25bfc8aedc805d217e8dd0df606f1ca013a6c838.tar.gz rust-25bfc8aedc805d217e8dd0df606f1ca013a6c838.zip | |
Auto merge of #38855 - Mark-Simulacrum:immediate-fix, r=eddyb
Fix ICE on i686 when calling immediate() on OperandValue::Ref in return Fixes #38727, and adds a test case. r? @eddyb
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_trans/mir/block.rs | 6 | ||||
| -rw-r--r-- | src/test/run-pass/issue-38727.rs | 21 |
2 files changed, 26 insertions, 1 deletions
diff --git a/src/librustc_trans/mir/block.rs b/src/librustc_trans/mir/block.rs index 6d92cd99fbe..7d4a1ab5ae7 100644 --- a/src/librustc_trans/mir/block.rs +++ b/src/librustc_trans/mir/block.rs @@ -223,7 +223,11 @@ impl<'a, 'tcx> MirContext<'a, 'tcx> { load } else { let op = self.trans_consume(&bcx, &mir::Lvalue::Local(mir::RETURN_POINTER)); - op.pack_if_pair(&bcx).immediate() + if let Ref(llval) = op.val { + base::load_ty(&bcx, llval, op.ty) + } else { + op.pack_if_pair(&bcx).immediate() + } }; bcx.ret(llval); } diff --git a/src/test/run-pass/issue-38727.rs b/src/test/run-pass/issue-38727.rs new file mode 100644 index 00000000000..e60b6a99f92 --- /dev/null +++ b/src/test/run-pass/issue-38727.rs @@ -0,0 +1,21 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#[repr(u64)] +enum A { + A = 0u64, + B = !0u64, +} + +fn cmp() -> A { + A::B +} + +fn main() {} |
