Skip to content

Add E0510, E0511 and E0512 error explanations #28909

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Oct 14, 2015
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 93 additions & 7 deletions src/librustc_trans/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,98 @@

register_long_diagnostics! {

E0510: r##"
`return_address` was used in an invalid context. Erroneous code example:

```
extern "rust-intrinsic" {
fn return_address() -> *const u8;
}

pub unsafe fn by_value() -> i32 {
let _ = return_address();
// error: invalid use of `return_address` intrinsic: function does
// not use out pointer
0
}
```

Return values may be stored in a return register(s) or written into a so-called
out pointer. In case the returned value is too big (this is
target-ABI-dependent and generally not portable or future proof) to fit into
the return register(s), the compiler will return the value by writing it into
space allocated in the caller's stack frame. Example:

```
extern "rust-intrinsic" {
fn return_address() -> *const u8;
}

pub unsafe fn by_pointer() -> String {
let _ = return_address();
String::new() // ok!
}
```
"##,

E0511: r##"
Invalid monomorphization of an intrinsic function was used. Erroneous code
example:

```
extern "platform-intrinsic" {
fn simd_add<T>(a: T, b: T) -> T;
}

unsafe { simd_add(0, 1); }
// error: invalid monomorphization of `simd_add` intrinsic
```

The generic type has to be a SIMD type. Example:

```
#[repr(simd)]
#[derive(Copy, Clone)]
struct i32x1(i32);

extern "platform-intrinsic" {
fn simd_add<T>(a: T, b: T) -> T;
}

unsafe { simd_add(i32x1(0), i32x1(1)); } // ok!
```
"##,

E0512: r##"
Transmute with two differently sized types was attempted. Erroneous code
example:

```
extern "rust-intrinsic" {
pub fn ctpop8(x: u8) -> u8;
}

fn main() {
unsafe { ctpop8(::std::mem::transmute(0u16)); }
// error: transmute called with differently sized types
}
```

Please use types with same size or use the expected type directly. Example:

```
extern "rust-intrinsic" {
pub fn ctpop8(x: u8) -> u8;
}

fn main() {
unsafe { ctpop8(::std::mem::transmute(0i8)); } // ok!
// or:
unsafe { ctpop8(0u8); } // ok!
}
```
"##,

E0515: r##"
A constant index expression was out of bounds. Erroneous code example:

Expand All @@ -23,14 +115,8 @@ Please specify a valid index (not inferior to 0 or superior to array length).
Example:

```
let x = &[0, 1, 2][2]; // ok!
let x = &[0, 1, 2][2]; // ok
```
"##,

}

register_diagnostics! {
E0510, // invalid use of `return_address` intrinsic: function does not use out pointer
E0511, // invalid monomorphization of `{}` intrinsic
E0512, // transmute called on types with potentially different sizes...
}