File: ptr-to-int-transmute-in-consts-issue-87525.rs

package info (click to toggle)
rustc 1.88.0%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 934,128 kB
  • sloc: xml: 158,127; python: 36,062; javascript: 19,855; sh: 19,700; cpp: 18,947; ansic: 12,993; asm: 4,792; makefile: 690; lisp: 29; perl: 29; ruby: 19; sql: 11
file content (70 lines) | stat: -rw-r--r-- 1,354 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
const fn foo(ptr: *const u8) -> usize {
    unsafe {
        std::mem::transmute(ptr)
        //~^ WARN pointers cannot be transmuted to integers
    }
}

trait Human {
    const ID: usize = {
        let value = 10;
        let ptr: *const usize = &value;
        unsafe {
            std::mem::transmute(ptr)
            //~^ WARN pointers cannot be transmuted to integers
        }
    };

    fn id_plus_one() -> usize {
        Self::ID + 1
    }
}

struct Type<T>(T);

impl<T> Type<T> {
    const ID: usize = {
        let value = 10;
        let ptr: *const usize = &value;
        unsafe {
            std::mem::transmute(ptr)
            //~^ WARN pointers cannot be transmuted to integers
        }
    };

    fn id_plus_one() -> usize {
        Self::ID + 1
    }
}

fn control(ptr: *const u8) -> usize {
    unsafe {
        std::mem::transmute(ptr)
    }
}

struct ControlStruct;

impl ControlStruct {
    fn new() -> usize {
        let value = 10;
        let ptr: *const i32 = &value;
        unsafe {
            std::mem::transmute(ptr)
        }
    }
}


const fn zoom(ptr: *const u8) -> usize {
    unsafe {
        std::mem::transmute(ptr)
        //~^ WARN pointers cannot be transmuted to integers
    }
}

fn main() {
    const a: u8 = 10;
    const value: usize = zoom(&a);
    //~^ ERROR evaluation of constant value failed
}