Move is_complete type trait to header
diff --git a/gen/src/builtin.rs b/gen/src/builtin.rs
index 1de36e1..dbd019b 100644
--- a/gen/src/builtin.rs
+++ b/gen/src/builtin.rs
@@ -102,6 +102,11 @@
         include.type_traits = true;
     }
 
+    if builtin.is_complete {
+        include.cstddef = true;
+        include.type_traits = true;
+    }
+
     out.begin_block(Block::Namespace("rust"));
     out.begin_block(Block::InlineNamespace("cxxbridge1"));
     writeln!(out, "// #include \"rust/cxx.h\"");
@@ -136,6 +141,7 @@
     ifndef::write(out, builtin.rust_isize, "CXXBRIDGE1_RUST_ISIZE");
     ifndef::write(out, builtin.opaque, "CXXBRIDGE1_RUST_OPAQUE");
     ifndef::write(out, builtin.relocatable, "CXXBRIDGE1_RELOCATABLE");
+    ifndef::write(out, builtin.is_complete, "CXXBRIDGE1_IS_COMPLETE");
 
     out.begin_block(Block::Namespace("detail"));
 
@@ -277,20 +283,6 @@
         writeln!(out, "}};");
     }
 
-    if builtin.is_complete {
-        include.cstddef = true;
-        include.type_traits = true;
-        out.next_section();
-        writeln!(out, "template <typename T, typename = ::std::size_t>");
-        writeln!(out, "struct is_complete : std::false_type {{}};");
-        out.next_section();
-        writeln!(out, "template <typename T>");
-        writeln!(
-            out,
-            "struct is_complete<T, decltype(sizeof(T))> : std::true_type {{}};",
-        );
-    }
-
     if builtin.deleter_if {
         out.next_section();
         writeln!(out, "template <bool> struct deleter_if {{");
diff --git a/gen/src/write.rs b/gen/src/write.rs
index 0083525..e20f54f 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -1622,7 +1622,7 @@
         };
         writeln!(
             out,
-            "static_assert(::rust::is_complete<{}>::value, \"definition of {} is required\");",
+            "static_assert(::rust::detail::is_complete<{}>::value, \"definition of {} is required\");",
             inner, definition,
         );
     }
@@ -1689,7 +1689,7 @@
         out.builtin.deleter_if = true;
         writeln!(
             out,
-            "  ::rust::deleter_if<::rust::is_complete<{}>::value>{{}}(ptr);",
+            "  ::rust::deleter_if<::rust::detail::is_complete<{}>::value>{{}}(ptr);",
             inner,
         );
     } else {