diff --git a/src/test/run-make/intrinsic-unreachable/Makefile b/src/test/run-make/intrinsic-unreachable/Makefile new file mode 100644 index 0000000000000..305e8a7ddc968 --- /dev/null +++ b/src/test/run-make/intrinsic-unreachable/Makefile @@ -0,0 +1,15 @@ +-include ../tools.mk + +ifndef IS_WINDOWS +# The assembly for exit-unreachable.rs should be shorter because it's missing +# (at minimum) a return instruction. + +all: + $(RUSTC) -O --emit asm exit-ret.rs + $(RUSTC) -O --emit asm exit-unreachable.rs + test `wc -l < $(TMPDIR)/exit-unreachable.s` -lt `wc -l < $(TMPDIR)/exit-ret.s` +else +# Because of Windows exception handling, the code is not necessarily any shorter. +# https://github.com/llvm-mirror/llvm/commit/64b2297786f7fd6f5fa24cdd4db0298fbf211466 +all: +endif diff --git a/src/test/run-make/intrinsic-unreachable/exit-ret.rs b/src/test/run-make/intrinsic-unreachable/exit-ret.rs new file mode 100644 index 0000000000000..02c03445ef4e6 --- /dev/null +++ b/src/test/run-make/intrinsic-unreachable/exit-ret.rs @@ -0,0 +1,20 @@ +// Copyright 2014 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(asm)] +#![crate_type="lib"] + +pub fn exit(n: uint) { + unsafe { + // Pretend this asm is an exit() syscall. + asm!("" :: "r"(n) :: "volatile"); + // Can't actually reach this point, but rustc doesn't know that. + } +} diff --git a/src/test/run-make/intrinsic-unreachable/exit-unreachable.rs b/src/test/run-make/intrinsic-unreachable/exit-unreachable.rs new file mode 100644 index 0000000000000..835e068c15cfd --- /dev/null +++ b/src/test/run-make/intrinsic-unreachable/exit-unreachable.rs @@ -0,0 +1,22 @@ +// Copyright 2014 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(asm)] +#![crate_type="lib"] + +use std::intrinsics; + +pub fn exit(n: uint) -> ! { + unsafe { + // Pretend this asm is an exit() syscall. + asm!("" :: "r"(n) :: "volatile"); + intrinsics::unreachable() + } +} diff --git a/src/test/run-pass/intrinsic-unreachable.rs b/src/test/run-pass/intrinsic-unreachable.rs new file mode 100644 index 0000000000000..5e8b758cdf68f --- /dev/null +++ b/src/test/run-pass/intrinsic-unreachable.rs @@ -0,0 +1,24 @@ +// Copyright 2014 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::intrinsics; + +// See also src/test/run-make/intrinsic-unreachable. + +unsafe fn f(x: uint) -> uint { + match x { + 17 => 23, + _ => intrinsics::unreachable(), + } +} + +fn main() { + assert_eq!(unsafe { f(17) }, 23); +}