Rollup merge of #36723 - GuillaumeGomez:e0513, r=jonathandturner
E0513 Part of #35233 r? @jonathandturner
This commit is contained in:
commit
9b72650890
3 changed files with 63 additions and 4 deletions
|
|
@ -1525,9 +1525,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
|
|||
match self.locals.borrow().get(&nid) {
|
||||
Some(&t) => t,
|
||||
None => {
|
||||
span_err!(self.tcx.sess, span, E0513,
|
||||
"no type for local variable {}",
|
||||
nid);
|
||||
struct_span_err!(self.tcx.sess, span, E0513,
|
||||
"no type for local variable {}",
|
||||
self.tcx.map.node_to_string(nid))
|
||||
.span_label(span, &"no type for variable")
|
||||
.emit();
|
||||
self.tcx.types.err
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3766,6 +3766,45 @@ extern "platform-intrinsic" {
|
|||
```
|
||||
"##,
|
||||
|
||||
E0513: r##"
|
||||
The type of the variable couldn't be found out.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0513
|
||||
use std::mem;
|
||||
|
||||
unsafe {
|
||||
let size = mem::size_of::<u32>();
|
||||
mem::transmute_copy::<u32, [u8; size]>(&8_8);
|
||||
// error: no type for local variable
|
||||
}
|
||||
```
|
||||
|
||||
To fix this error, please use a constant size instead of `size`. To make
|
||||
this error more obvious, you could run:
|
||||
|
||||
```compile_fail,E0080
|
||||
use std::mem;
|
||||
|
||||
unsafe {
|
||||
mem::transmute_copy::<u32, [u8; mem::size_of::<u32>()]>(&8_8);
|
||||
// error: constant evaluation error
|
||||
}
|
||||
```
|
||||
|
||||
So now, you can fix your code by setting the size directly:
|
||||
|
||||
```
|
||||
use std::mem;
|
||||
|
||||
unsafe {
|
||||
mem::transmute_copy::<u32, [u8; 4]>(&8_8);
|
||||
// `u32` is 4 bytes so we replace the `mem::size_of` call with its size
|
||||
}
|
||||
```
|
||||
"##,
|
||||
|
||||
E0516: r##"
|
||||
The `typeof` keyword is currently reserved but unimplemented.
|
||||
Erroneous code example:
|
||||
|
|
@ -4064,7 +4103,6 @@ register_diagnostics! {
|
|||
E0399, // trait items need to be implemented because the associated
|
||||
// type `{}` was overridden
|
||||
E0436, // functional record update requires a struct
|
||||
E0513, // no type for local variable ..
|
||||
E0521, // redundant default implementations of trait
|
||||
E0533, // `{}` does not name a unit variant, unit struct or a constant
|
||||
E0562, // `impl Trait` not allowed outside of function
|
||||
|
|
|
|||
19
src/test/compile-fail/E0513.rs
Normal file
19
src/test/compile-fail/E0513.rs
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
// Copyright 2016 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.
|
||||
|
||||
use std::mem;
|
||||
|
||||
fn main() {
|
||||
unsafe {
|
||||
let size = mem::size_of::<u32>();
|
||||
mem::transmute_copy::<u32, [u8; size]>(&8_8); //~ ERROR E0513
|
||||
//~| NOTE no type for variable
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue