about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBjörn Steinbrink <bsteinbr@gmail.com>2013-07-23 09:37:00 +0200
committerDaniel Micay <danielmicay@gmail.com>2013-07-24 09:45:21 -0400
commit7fbe8002d515b8f8730fc6502a767719854af3d8 (patch)
tree22be28438b500669b8af2c2adbbe8a73da481d08
parent254339fd3974417999147ac6c4f23c80e7ad8ab4 (diff)
downloadrust-7fbe8002d515b8f8730fc6502a767719854af3d8.tar.gz
rust-7fbe8002d515b8f8730fc6502a767719854af3d8.zip
Fix a crash when transmuting non-immediate to immediate types
The code to build the transmute intrinsic currently makes the invalid
assumption that if the in-type is non-immediate, the out-type is
non-immediate as well. But this is wrong, for example when transmuting
[int, ..1] to int. So we need to handle this fourth case as well.

Fixes #7988
-rw-r--r--src/librustc/middle/trans/foreign.rs3
-rw-r--r--src/test/run-pass/transmute-non-immediate-to-immediate.rs18
2 files changed, 21 insertions, 0 deletions
diff --git a/src/librustc/middle/trans/foreign.rs b/src/librustc/middle/trans/foreign.rs
index f8131c63378..372d24e664c 100644
--- a/src/librustc/middle/trans/foreign.rs
+++ b/src/librustc/middle/trans/foreign.rs
@@ -805,6 +805,9 @@ pub fn trans_intrinsic(ccx: @mut CrateContext,
                             _ => Ret(bcx, BitCast(bcx, llsrcval, llouttype))
                         }
                     }
+                } else if ty::type_is_immediate(ccx.tcx, out_type) {
+                    let llsrcptr = PointerCast(bcx, llsrcval, llouttype.ptr_to());
+                    Ret(bcx, Load(bcx, llsrcptr));
                 } else {
                     // NB: Do not use a Load and Store here. This causes massive
                     // code bloat when `transmute` is used on large structural
diff --git a/src/test/run-pass/transmute-non-immediate-to-immediate.rs b/src/test/run-pass/transmute-non-immediate-to-immediate.rs
new file mode 100644
index 00000000000..57844e7d860
--- /dev/null
+++ b/src/test/run-pass/transmute-non-immediate-to-immediate.rs
@@ -0,0 +1,18 @@
+// Copyright 2013 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.
+
+// Issue #7988
+// Transmuting non-immediate type to immediate type
+
+fn main() {
+    unsafe {
+        std::cast::transmute::<[int,..1],int>([1])
+    };
+}