diff options
| author | James Miller <bladeon@gmail.com> | 2013-05-09 22:23:38 +1200 |
|---|---|---|
| committer | James Miller <bladeon@gmail.com> | 2013-05-09 22:23:38 +1200 |
| commit | 050c744c23a8e01407452bc64ca63f92554afee2 (patch) | |
| tree | e5b8e8715fac93caf2c4b0034e3872a8a438ff86 | |
| parent | fda176b07046c25c67af978c20c3d4eda2068079 (diff) | |
| download | rust-050c744c23a8e01407452bc64ca63f92554afee2.tar.gz rust-050c744c23a8e01407452bc64ca63f92554afee2.zip | |
Add uninit intrinsic
| -rw-r--r-- | src/libcore/unstable/intrinsics.rs | 3 | ||||
| -rw-r--r-- | src/librustc/middle/trans/foreign.rs | 3 | ||||
| -rw-r--r-- | src/librustc/middle/trans/type_use.rs | 2 | ||||
| -rw-r--r-- | src/librustc/middle/typeck/check/mod.rs | 1 | ||||
| -rw-r--r-- | src/test/run-pass/intrinsic-uninit.rs | 19 |
5 files changed, 27 insertions, 1 deletions
diff --git a/src/libcore/unstable/intrinsics.rs b/src/libcore/unstable/intrinsics.rs index 363dbb84c1c..cfd305f4b70 100644 --- a/src/libcore/unstable/intrinsics.rs +++ b/src/libcore/unstable/intrinsics.rs @@ -44,6 +44,9 @@ pub extern "rust-intrinsic" { pub fn init<T>() -> T; + #[cfg(not(stage0))] + pub unsafe fn uninit<T>() -> T; + pub fn forget<T>(_: T) -> (); pub fn needs_drop<T>() -> bool; diff --git a/src/librustc/middle/trans/foreign.rs b/src/librustc/middle/trans/foreign.rs index 7eea65e458f..26654cf31f8 100644 --- a/src/librustc/middle/trans/foreign.rs +++ b/src/librustc/middle/trans/foreign.rs @@ -715,6 +715,9 @@ pub fn trans_intrinsic(ccx: @CrateContext, Store(bcx, C_null(lltp_ty), fcx.llretptr.get()); } } + ~"uninit" => { + // Do nothing, this is effectively a no-op + } ~"forget" => {} ~"transmute" => { let (in_type, out_type) = (substs.tys[0], substs.tys[1]); diff --git a/src/librustc/middle/trans/type_use.rs b/src/librustc/middle/trans/type_use.rs index f1c3a42d158..cbad7bcb3a6 100644 --- a/src/librustc/middle/trans/type_use.rs +++ b/src/librustc/middle/trans/type_use.rs @@ -118,7 +118,7 @@ pub fn type_uses_for(ccx: @CrateContext, fn_id: def_id, n_tps: uint) if abi.is_intrinsic() { let flags = match *cx.ccx.sess.str_of(i.ident) { ~"size_of" | ~"pref_align_of" | ~"min_align_of" | - ~"init" | ~"transmute" | ~"move_val" | + ~"uninit" | ~"init" | ~"transmute" | ~"move_val" | ~"move_val_init" => use_repr, ~"get_tydesc" | ~"needs_drop" => use_tydesc, diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index 6cd10b5bd6f..a6f2f0da234 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -3447,6 +3447,7 @@ pub fn check_intrinsic_type(ccx: @mut CrateCtxt, it: @ast::foreign_item) { ~"size_of" | ~"pref_align_of" | ~"min_align_of" => (1u, ~[], ty::mk_uint()), ~"init" => (1u, ~[], param(ccx, 0u)), + ~"uninit" => (1u, ~[], param(ccx, 0u)), ~"forget" => (1u, ~[arg(param(ccx, 0u))], ty::mk_nil()), ~"transmute" => (2, ~[ arg(param(ccx, 0)) ], param(ccx, 1)), ~"move_val" | ~"move_val_init" => { diff --git a/src/test/run-pass/intrinsic-uninit.rs b/src/test/run-pass/intrinsic-uninit.rs new file mode 100644 index 00000000000..a835c9531bf --- /dev/null +++ b/src/test/run-pass/intrinsic-uninit.rs @@ -0,0 +1,19 @@ +// Copyright 2012 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. + +mod rusti { + #[abi = "rust-intrinsic"] + pub extern "rust-intrinsic" { + fn uninit<T>() -> T; + } +} +pub fn main() { + let _a : int = unsafe {rusti::uninit()}; +} |
