chiark / gitweb /
W
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 16 May 2022 15:24:53 +0000 (16:24 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 16 May 2022 15:24:53 +0000 (16:24 +0100)
src/main.rs

index 3e80125352a63041583ff9686604913ebe26228f..de3f0a353de45e44572bcaaddf5afbc2d6108ad2 100644 (file)
@@ -2,10 +2,18 @@
 #![allow(unused_variables)]
 #![allow(unused_imports)]
 
+use std::mem;
 use std::mem::MaybeUninit;
 
 type S = &'static str;
 
+
+#[repr(C)]
+struct Concat<const A: usize, const B: usize>(
+    [S; A], 
+    [S; B],
+);
+
 trait Ish { const N: usize; }
 
 trait Has<const N: usize> {
@@ -21,18 +29,21 @@ impl Has<1> for Inner {
     const F: [S; 1] = ["i"];
 }
 
-struct Outer { o: usize, }
+struct Outer { o: usize, p: usize }
 
 impl Ish for Outer {
-    const N: usize = Inner::N + 1;
+    const N: usize = Inner::N + 2;
 }
-impl Has<{ Inner::N + 1 }> for Outer {
-    const F: [S; 2] = {
-        const TUPLE: ([S;1], [S; Inner::N]) = (
-            ["i"; 1],
-            <Inner as Has<{Inner::N}>>::F,
-        );
-        panic!()
+impl Has<{ Inner::N + 2 }> for Outer {
+    const F: [S; Inner::N + 2] = {
+        const TUPLE: Concat<
+                2,
+                { Inner::N },
+            > = Concat(
+                ["o", "p"],
+                Inner::F,
+            );
+        unsafe { mem::transmute(TUPLE) }
     };
 }
 
@@ -66,6 +77,6 @@ impl Ish for Outer {
 */
 
 fn main(){
-//    eprintln!("IF {:?}", Inner::F);
-//    eprintln!("OF {:?}", Outer::F);
+    eprintln!("IF {:?}", Inner::F);
+    eprintln!("OF {:?}", Outer::F);
 }