]> git.lizzy.rs Git - rust.git/blob - src/test/ui/asm/x86_64/type-check-2.rs
Rollup merge of #99787 - aDotInTheVoid:rdj-dyn, r=camelid,notriddle,GuillaumeGomez
[rust.git] / src / test / ui / asm / x86_64 / type-check-2.rs
1 // only-x86_64
2
3 #![feature(repr_simd, never_type, asm_sym)]
4
5 use std::arch::{asm, global_asm};
6
7 #[repr(simd)]
8 struct SimdNonCopy(f32, f32, f32, f32);
9
10 fn main() {
11     unsafe {
12         // Inputs must be initialized
13
14         let x: u64;
15         asm!("{}", in(reg) x);
16         let mut y: u64;
17         asm!("{}", inout(reg) y);
18         let _ = y;
19
20         // Outputs require mutable places
21
22         let v: Vec<u64> = vec![0, 1, 2];
23         asm!("{}", in(reg) v[0]);
24         asm!("{}", out(reg) v[0]);
25         asm!("{}", inout(reg) v[0]);
26
27         // Sym operands must point to a function or static
28
29         const C: i32 = 0;
30         static S: i32 = 0;
31         asm!("{}", sym S);
32         asm!("{}", sym main);
33         asm!("{}", sym C);
34         //~^ ERROR invalid `sym` operand
35         asm!("{}", sym x);
36         //~^ ERROR invalid `sym` operand
37
38         // Register operands must be Copy
39
40         asm!("{}", in(xmm_reg) SimdNonCopy(0.0, 0.0, 0.0, 0.0));
41         //~^ ERROR arguments for inline assembly must be copyable
42
43         // Register operands must be integers, floats, SIMD vectors, pointers or
44         // function pointers.
45
46         asm!("{}", in(reg) 0i64);
47         asm!("{}", in(reg) 0f64);
48         asm!("{}", in(xmm_reg) std::arch::x86_64::_mm_setzero_ps());
49         asm!("{}", in(reg) 0 as *const u8);
50         asm!("{}", in(reg) 0 as *mut u8);
51         asm!("{}", in(reg) main as fn());
52         asm!("{}", in(reg) |x: i32| x);
53         //~^ ERROR cannot use value of type
54         asm!("{}", in(reg) vec![0]);
55         //~^ ERROR cannot use value of type `Vec<i32>` for inline assembly
56         asm!("{}", in(reg) (1, 2, 3));
57         //~^ ERROR cannot use value of type `(i32, i32, i32)` for inline assembly
58         asm!("{}", in(reg) [1, 2, 3]);
59         //~^ ERROR cannot use value of type `[i32; 3]` for inline assembly
60
61         // Register inputs (but not outputs) allow references and function types
62
63         let mut f = main;
64         let mut r = &mut 0;
65         asm!("{}", in(reg) f);
66         asm!("{}", inout(reg) f);
67         //~^ ERROR cannot use value of type `fn() {main}` for inline assembly
68         asm!("{}", in(reg) r);
69         asm!("{}", inout(reg) r);
70         //~^ ERROR cannot use value of type `&mut i32` for inline assembly
71         let _ = (f, r);
72
73         // Type checks ignore never type
74
75         let u: ! = unreachable!();
76         asm!("{}", in(reg) u);
77     }
78 }
79
80 // Sym operands must point to a function or static
81
82 const C: i32 = 0;
83 static S: i32 = 0;
84 global_asm!("{}", sym S);
85 global_asm!("{}", sym main);
86 global_asm!("{}", sym C);
87 //~^ ERROR invalid `sym` operand