diff --git a/doc/rust.texi b/doc/rust.texi index fcca023d2553e..bc7562088971c 100644 --- a/doc/rust.texi +++ b/doc/rust.texi @@ -2930,6 +2930,7 @@ effects of the expression's evaluation. * Ref.Expr.Ret:: Expression for stopping and producing a value. @c * Ref.Expr.Be:: Expression for stopping and executing a tail call. * Ref.Expr.Put:: Expression for pausing and producing a value. +* Ref.Expr.As:: Expression for casting a value to a different type. * Ref.Expr.Fail:: Expression for causing task failure. * Ref.Expr.Log:: Expression for logging values to diagnostic buffers. * Ref.Expr.Note:: Expression for logging values during failure. @@ -3116,6 +3117,30 @@ either continuing execution after the @code{put} expression, or terminating its execution and destroying the iterator frame. +@node Ref.Expr.As +@subsection Ref.Expr.As +@c * Ref.Expr.As:: Expression for casting a value to a different type. +@cindex As expression +@cindex Cast +@cindex Typecast + +Executing an @code{as} expression casts the value on the left-hand side to the +type on the right-hand side. + +A numeric value can be cast to any numeric type. A native pointer value can +be cast to or from any integral type or native pointer type. Any other cast +is unsupported and will fail to compiler. + +An example of an @code{as} expression: +@example +fn avg(v: [float]) -> float @{ + let sum: float = sum(v); + let sz: float = std::vec::len(v) as float; + ret sum / sz; +@} +@end example + + @node Ref.Expr.Fail @subsection Ref.Expr.Fail @c * Ref.Expr.Fail:: Expression for causing task failure. diff --git a/src/test/compile-fail/nonscalar-cast.rs b/src/test/compile-fail/nonscalar-cast.rs new file mode 100644 index 0000000000000..ab920550f44c3 --- /dev/null +++ b/src/test/compile-fail/nonscalar-cast.rs @@ -0,0 +1,8 @@ +// error-pattern:non-scalar cast + +use std; +import std::os; + +fn main() { + log { x: 1 } as int; +} diff --git a/src/test/compile-fail/unsupported-cast.rs b/src/test/compile-fail/unsupported-cast.rs new file mode 100644 index 0000000000000..00e65f4024018 --- /dev/null +++ b/src/test/compile-fail/unsupported-cast.rs @@ -0,0 +1,8 @@ +// error-pattern:unsupported cast + +use std; +import std::os; + +fn main() { + log 1.0 as os::libc::FILE; // Can't cast float to native. +} diff --git a/src/test/run-pass/supported-cast.rs b/src/test/run-pass/supported-cast.rs new file mode 100644 index 0000000000000..a100386d1dcbb --- /dev/null +++ b/src/test/run-pass/supported-cast.rs @@ -0,0 +1,253 @@ +use std; +import std::os; + +fn main() { + let f = 1 as os::libc::FILE; + log f as int; + log f as uint; + log f as i8; + log f as i16; + log f as i32; + log f as i64; + log f as u8; + log f as u16; + log f as u32; + log f as u64; + + log 1 as int; + log 1 as uint; + log 1 as float; + log 1 as bool; + log 1 as os::libc::FILE; + log 1 as i8; + log 1 as i16; + log 1 as i32; + log 1 as i64; + log 1 as u8; + log 1 as u16; + log 1 as u32; + log 1 as u64; + log 1 as f32; + log 1 as f64; + + log 1u as int; + log 1u as uint; + log 1u as float; + log 1u as bool; + log 1u as os::libc::FILE; + log 1u as i8; + log 1u as i16; + log 1u as i32; + log 1u as i64; + log 1u as u8; + log 1u as u16; + log 1u as u32; + log 1u as u64; + log 1u as f32; + log 1u as f64; + + log 1i8 as int; + log 1i8 as uint; + log 1i8 as float; + log 1i8 as bool; + log 1i8 as os::libc::FILE; + log 1i8 as i8; + log 1i8 as i16; + log 1i8 as i32; + log 1i8 as i64; + log 1i8 as u8; + log 1i8 as u16; + log 1i8 as u32; + log 1i8 as u64; + log 1i8 as f32; + log 1i8 as f64; + + log 1u8 as int; + log 1u8 as uint; + log 1u8 as float; + log 1u8 as bool; + log 1u8 as os::libc::FILE; + log 1u8 as i8; + log 1u8 as i16; + log 1u8 as i32; + log 1u8 as i64; + log 1u8 as u8; + log 1u8 as u16; + log 1u8 as u32; + log 1u8 as u64; + log 1u8 as f32; + log 1u8 as f64; + + log 1i16 as int; + log 1i16 as uint; + log 1i16 as float; + log 1i16 as bool; + log 1i16 as os::libc::FILE; + log 1i16 as i8; + log 1i16 as i16; + log 1i16 as i32; + log 1i16 as i64; + log 1i16 as u8; + log 1i16 as u16; + log 1i16 as u32; + log 1i16 as u64; + log 1i16 as f32; + log 1i16 as f64; + + log 1u16 as int; + log 1u16 as uint; + log 1u16 as float; + log 1u16 as bool; + log 1u16 as os::libc::FILE; + log 1u16 as i8; + log 1u16 as i16; + log 1u16 as i32; + log 1u16 as i64; + log 1u16 as u8; + log 1u16 as u16; + log 1u16 as u32; + log 1u16 as u64; + log 1u16 as f32; + log 1u16 as f64; + + log 1i32 as int; + log 1i32 as uint; + log 1i32 as float; + log 1i32 as bool; + log 1i32 as os::libc::FILE; + log 1i32 as i8; + log 1i32 as i16; + log 1i32 as i32; + log 1i32 as i64; + log 1i32 as u8; + log 1i32 as u16; + log 1i32 as u32; + log 1i32 as u64; + log 1i32 as f32; + log 1i32 as f64; + + log 1u32 as int; + log 1u32 as uint; + log 1u32 as float; + log 1u32 as bool; + log 1u32 as os::libc::FILE; + log 1u32 as i8; + log 1u32 as i16; + log 1u32 as i32; + log 1u32 as i64; + log 1u32 as u8; + log 1u32 as u16; + log 1u32 as u32; + log 1u32 as u64; + log 1u32 as f32; + log 1u32 as f64; + + log 1i64 as int; + log 1i64 as uint; + log 1i64 as float; + log 1i64 as bool; + log 1i64 as os::libc::FILE; + log 1i64 as i8; + log 1i64 as i16; + log 1i64 as i32; + log 1i64 as i64; + log 1i64 as u8; + log 1i64 as u16; + log 1i64 as u32; + log 1i64 as u64; + log 1i64 as f32; + log 1i64 as f64; + + log 1u64 as int; + log 1u64 as uint; + log 1u64 as float; + log 1u64 as bool; + log 1u64 as os::libc::FILE; + log 1u64 as i8; + log 1u64 as i16; + log 1u64 as i32; + log 1u64 as i64; + log 1u64 as u8; + log 1u64 as u16; + log 1u64 as u32; + log 1u64 as u64; + log 1u64 as f32; + log 1u64 as f64; + + log 1u64 as int; + log 1u64 as uint; + log 1u64 as float; + log 1u64 as bool; + log 1u64 as os::libc::FILE; + log 1u64 as i8; + log 1u64 as i16; + log 1u64 as i32; + log 1u64 as i64; + log 1u64 as u8; + log 1u64 as u16; + log 1u64 as u32; + log 1u64 as u64; + log 1u64 as f32; + log 1u64 as f64; + + log true as int; + log true as uint; + log true as float; + log true as bool; + log true as os::libc::FILE; + log true as i8; + log true as i16; + log true as i32; + log true as i64; + log true as u8; + log true as u16; + log true as u32; + log true as u64; + log true as f32; + log true as f64; + + log 1. as int; + log 1. as uint; + log 1. as float; + log 1. as bool; + log 1. as i8; + log 1. as i16; + log 1. as i32; + log 1. as i64; + log 1. as u8; + log 1. as u16; + log 1. as u32; + log 1. as u64; + log 1. as f32; + log 1. as f64; + + log 1f32 as int; + log 1f32 as uint; + log 1f32 as float; + log 1f32 as bool; + log 1f32 as i8; + log 1f32 as i16; + log 1f32 as i32; + log 1f32 as i64; + log 1f32 as u8; + log 1f32 as u16; + log 1f32 as u32; + log 1f32 as u64; + log 1f32 as f32; + log 1f32 as f64; + + log 1f64 as int; + log 1f64 as uint; + log 1f64 as float; + log 1f64 as bool; + log 1f64 as i8; + log 1f64 as i16; + log 1f64 as i32; + log 1f64 as i64; + log 1f64 as u8; + log 1f64 as u16; + log 1f64 as u32; + log 1f64 as u64; + log 1f64 as f32; + log 1f64 as f64; +}