57 lines
1.1 KiB
Rust
57 lines
1.1 KiB
Rust
|
// no-system-llvm
|
||
|
// only-x86_64
|
||
|
// run-pass
|
||
|
|
||
|
#![feature(asm)]
|
||
|
|
||
|
use std::mem::size_of;
|
||
|
|
||
|
trait Proj {
|
||
|
const C: usize;
|
||
|
}
|
||
|
impl Proj for i8 {
|
||
|
const C: usize = 8;
|
||
|
}
|
||
|
impl Proj for i16 {
|
||
|
const C: usize = 16;
|
||
|
}
|
||
|
|
||
|
const fn constfn(x: usize) -> usize {
|
||
|
x
|
||
|
}
|
||
|
|
||
|
fn generic<T: Proj>() {
|
||
|
unsafe {
|
||
|
let a: usize;
|
||
|
asm!("mov {}, {}", out(reg) a, const size_of::<T>());
|
||
|
assert_eq!(a, size_of::<T>());
|
||
|
|
||
|
let b: usize;
|
||
|
asm!("mov {}, {}", out(reg) b, const size_of::<T>() + constfn(5));
|
||
|
assert_eq!(b, size_of::<T>() + 5);
|
||
|
|
||
|
let c: usize;
|
||
|
asm!("mov {}, {}", out(reg) c, const T::C);
|
||
|
assert_eq!(c, T::C);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn main() {
|
||
|
unsafe {
|
||
|
let a: usize;
|
||
|
asm!("mov {}, {}", out(reg) a, const 5);
|
||
|
assert_eq!(a, 5);
|
||
|
|
||
|
let b: usize;
|
||
|
asm!("mov {}, {}", out(reg) b, const constfn(5));
|
||
|
assert_eq!(b, 5);
|
||
|
|
||
|
let c: usize;
|
||
|
asm!("mov {}, {}", out(reg) c, const constfn(5) + constfn(5));
|
||
|
assert_eq!(c, 10);
|
||
|
}
|
||
|
|
||
|
generic::<i8>();
|
||
|
generic::<i16>();
|
||
|
}
|