summaryrefslogtreecommitdiffstats
path: root/tests/ui/transmutability/abstraction
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/transmutability/abstraction')
-rw-r--r--tests/ui/transmutability/abstraction/abstracted_assume.rs72
-rw-r--r--tests/ui/transmutability/abstraction/const_generic_fn.rs41
2 files changed, 113 insertions, 0 deletions
diff --git a/tests/ui/transmutability/abstraction/abstracted_assume.rs b/tests/ui/transmutability/abstraction/abstracted_assume.rs
new file mode 100644
index 000000000..0225c4230
--- /dev/null
+++ b/tests/ui/transmutability/abstraction/abstracted_assume.rs
@@ -0,0 +1,72 @@
+// check-pass
+//! The implementation should behave correctly when the `ASSUME` parameters are
+//! provided indirectly through an abstraction.
+
+#![crate_type = "lib"]
+#![feature(adt_const_params)]
+#![feature(transmutability)]
+#![allow(dead_code, incomplete_features, non_camel_case_types)]
+
+mod assert {
+ use std::mem::BikeshedIntrinsicFrom;
+
+ pub fn is_transmutable<
+ Src,
+ Dst,
+ Context,
+ const ASSUME: std::mem::Assume,
+ >()
+ where
+ Dst: BikeshedIntrinsicFrom<
+ Src,
+ Context,
+ ASSUME,
+ >,
+ {}
+}
+
+fn direct() {
+ struct Context;
+ #[repr(C)] struct Src;
+ #[repr(C)] struct Dst;
+
+ assert::is_transmutable::<Src, Dst, Context, { std::mem::Assume::NOTHING }>();
+}
+
+fn via_const() {
+ struct Context;
+ #[repr(C)] struct Src;
+ #[repr(C)] struct Dst;
+
+ const FALSE: bool = false;
+
+ assert::is_transmutable::<Src, Dst, Context, { std::mem::Assume::NOTHING }>();
+}
+
+fn via_associated_const() {
+ struct Context;
+ #[repr(C)] struct Src;
+ #[repr(C)] struct Dst;
+
+ trait Trait {
+ const FALSE: bool = true;
+ }
+
+ struct Ty;
+
+ impl Trait for Ty {}
+
+ assert::is_transmutable::<
+ Src,
+ Dst,
+ Context,
+ {
+ std::mem::Assume {
+ alignment: {Ty::FALSE},
+ lifetimes: {Ty::FALSE},
+ safety: {Ty::FALSE},
+ validity: {Ty::FALSE},
+ }
+ }
+ >();
+}
diff --git a/tests/ui/transmutability/abstraction/const_generic_fn.rs b/tests/ui/transmutability/abstraction/const_generic_fn.rs
new file mode 100644
index 000000000..e693a0957
--- /dev/null
+++ b/tests/ui/transmutability/abstraction/const_generic_fn.rs
@@ -0,0 +1,41 @@
+// check-pass
+//! An array must have the correct length.
+
+#![crate_type = "lib"]
+#![feature(transmutability)]
+#![allow(dead_code, incomplete_features, non_camel_case_types)]
+
+mod assert {
+ use std::mem::{Assume, BikeshedIntrinsicFrom};
+ pub struct Context;
+
+ pub fn array_like<T, E, const N: usize>()
+ where
+ T: BikeshedIntrinsicFrom<[E; N], Context, { Assume::SAFETY }>,
+ [E; N]: BikeshedIntrinsicFrom<T, Context, { Assume::SAFETY }>
+ {}
+}
+
+fn len_0() {
+ type Array = [u8; 0];
+ #[repr(C)] struct Struct();
+ assert::array_like::<Struct, u8, 0>();
+}
+
+fn len_1() {
+ type Array = [u8; 1];
+ #[repr(C)] struct Struct(u8);
+ assert::array_like::<Struct, u8, 1>();
+}
+
+fn len_2() {
+ type Array = [u8; 2];
+ #[repr(C)] struct Struct(u8, u8);
+ assert::array_like::<Struct, u8, 2>();
+}
+
+fn len_3() {
+ type Array = [u8; 3];
+ #[repr(C)] struct Struct(u8, u8, u8);
+ assert::array_like::<Struct, u8, 3>();
+}