2021-03-25 15:21:58 -05:00
|
|
|
// min-llvm-version: 10.0.1
|
2020-05-11 11:53:32 -05:00
|
|
|
// 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>();
|
|
|
|
}
|