Include <utility> when using std::move
diff --git a/gen/include.rs b/gen/include.rs
index b19a097..a642c0a 100644
--- a/gen/include.rs
+++ b/gen/include.rs
@@ -36,6 +36,7 @@
     pub memory: bool,
     pub string: bool,
     pub type_traits: bool,
+    pub utility: bool,
 }
 
 impl Includes {
@@ -74,6 +75,9 @@
         if self.type_traits {
             writeln!(f, "#include <type_traits>")?;
         }
+        if self.utility {
+            writeln!(f, "#include <utility>")?;
+        }
         if *self != Self::default() {
             writeln!(f)?;
         }
diff --git a/gen/write.rs b/gen/write.rs
index a75d4c0..16322c1 100644
--- a/gen/write.rs
+++ b/gen/write.rs
@@ -178,6 +178,7 @@
 
     if needs_manually_drop {
         out.next_section();
+        out.include.utility = true;
         writeln!(out, "template <typename T>");
         writeln!(out, "union ManuallyDrop {{");
         writeln!(out, "  T value;");
@@ -329,6 +330,7 @@
                 arg.ident,
             );
         } else if types.needs_indirect_abi(&arg.ty) {
+            out.include.utility = true;
             write!(out, "::std::move(*{})", arg.ident);
         } else {
             write!(out, "{}", arg.ident);
@@ -347,6 +349,7 @@
     writeln!(out, ";");
     if efn.throws {
         out.include.cstring = true;
+        out.include.exception = true;
         writeln!(out, "    throw$.ptr = nullptr;");
         writeln!(out, "  }} catch (const ::std::exception &catch$) {{");
         writeln!(out, "    const char *return$ = catch$.what();");
@@ -410,6 +413,7 @@
         writeln!(out, " {{");
         for arg in &efn.args {
             if arg.ty != RustString && types.needs_indirect_abi(&arg.ty) {
+                out.include.utility = true;
                 write!(out, "  ::rust::ManuallyDrop<");
                 write_type(out, &arg.ty);
                 writeln!(out, "> {}$(::std::move({0}));", arg.ident);
@@ -481,6 +485,7 @@
             writeln!(out, "  }}");
         }
         if indirect_return {
+            out.include.utility = true;
             writeln!(out, "  return ::std::move(return$.value);");
         }
         writeln!(out, "}}");
@@ -668,6 +673,8 @@
 }
 
 fn write_unique_ptr(out: &mut OutFile, ident: &Ident) {
+    out.include.utility = true;
+
     let mut inner = String::new();
     for name in &out.namespace {
         inner += name;
diff --git a/include/cxx.h b/include/cxx.h
index a021ca7..1026743 100644
--- a/include/cxx.h
+++ b/include/cxx.h
@@ -5,6 +5,7 @@
 #include <iosfwd>
 #include <string>
 #include <type_traits>
+#include <utility>
 
 namespace rust {
 inline namespace cxxbridge02 {