about summary refs log tree commit diff
path: root/src/test/ui/simd/simd-generics.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/simd/simd-generics.rs')
-rw-r--r--src/test/ui/simd/simd-generics.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/test/ui/simd/simd-generics.rs b/src/test/ui/simd/simd-generics.rs
new file mode 100644
index 00000000000..ab6caee9d7b
--- /dev/null
+++ b/src/test/ui/simd/simd-generics.rs
@@ -0,0 +1,39 @@
+// run-pass
+#![allow(non_camel_case_types)]
+
+
+
+#![feature(repr_simd, platform_intrinsics)]
+
+use std::ops;
+
+#[repr(simd)]
+#[derive(Copy, Clone)]
+struct f32x4(f32, f32, f32, f32);
+
+extern "platform-intrinsic" {
+    fn simd_add<T>(x: T, y: T) -> T;
+}
+
+fn add<T: ops::Add<Output=T>>(lhs: T, rhs: T) -> T {
+    lhs + rhs
+}
+
+impl ops::Add for f32x4 {
+    type Output = f32x4;
+
+    fn add(self, rhs: f32x4) -> f32x4 {
+        unsafe {simd_add(self, rhs)}
+    }
+}
+
+pub fn main() {
+    let lr = f32x4(1.0f32, 2.0f32, 3.0f32, 4.0f32);
+
+    // lame-o
+    let f32x4(x, y, z, w) = add(lr, lr);
+    assert_eq!(x, 2.0f32);
+    assert_eq!(y, 4.0f32);
+    assert_eq!(z, 6.0f32);
+    assert_eq!(w, 8.0f32);
+}