Defer error on restricted type names
diff --git a/syntax/check.rs b/syntax/check.rs
index f6e46fd..0d25e77 100644
--- a/syntax/check.rs
+++ b/syntax/check.rs
@@ -1,6 +1,6 @@
 use crate::syntax::atom::Atom::{self, *};
 use crate::syntax::{
-    error, ident, Api, ExternFn, Lang, Receiver, Ref, Slice, Struct, Ty1, Type, Types,
+    error, ident, Api, ExternFn, ExternType, Lang, Receiver, Ref, Slice, Struct, Ty1, Type, Types,
 };
 use proc_macro2::{Delimiter, Group, Ident, TokenStream};
 use quote::{quote, ToTokens};
@@ -39,6 +39,7 @@
     for api in cx.apis {
         match api {
             Api::Struct(strct) => check_api_struct(cx, strct),
+            Api::CxxType(ty) | Api::RustType(ty) => check_api_type(cx, ty),
             Api::CxxFunction(efn) | Api::RustFunction(efn) => check_api_fn(cx, efn),
             _ => {}
         }
@@ -119,6 +120,8 @@
 }
 
 fn check_api_struct(cx: &mut Check, strct: &Struct) {
+    check_reserved_name(cx, &strct.ident);
+
     if strct.fields.is_empty() {
         let span = span_for_struct_error(strct);
         cx.error(span, "structs without any fields are not supported");
@@ -139,6 +142,10 @@
     }
 }
 
+fn check_api_type(cx: &mut Check, ty: &ExternType) {
+    check_reserved_name(cx, &ty.ident);
+}
+
 fn check_api_fn(cx: &mut Check, efn: &ExternFn) {
     if let Some(receiver) = &efn.receiver {
         if !cx.types.structs.contains_key(&receiver.ty)
@@ -228,6 +235,12 @@
     }
 }
 
+fn check_reserved_name(cx: &mut Check, ident: &Ident) {
+    if ident == "Box" || ident == "UniquePtr" || Atom::from(ident).is_some() {
+        cx.error(ident, "reserved name");
+    }
+}
+
 fn is_unsized(cx: &mut Check, ty: &Type) -> bool {
     let ident = match ty {
         Type::Ident(ident) => ident,
diff --git a/syntax/parse.rs b/syntax/parse.rs
index bdccbda..060f133 100644
--- a/syntax/parse.rs
+++ b/syntax/parse.rs
@@ -1,9 +1,8 @@
 use crate::syntax::Atom::*;
 use crate::syntax::{
-    attrs, error, Api, Atom, Doc, ExternFn, ExternType, Lang, Receiver, Ref, Signature, Slice,
-    Struct, Ty1, Type, Var,
+    attrs, error, Api, Doc, ExternFn, ExternType, Lang, Receiver, Ref, Signature, Slice, Struct,
+    Ty1, Type, Var,
 };
-use proc_macro2::Ident;
 use quote::{format_ident, quote};
 use syn::punctuated::Punctuated;
 use syn::{
@@ -51,7 +50,6 @@
     let mut doc = Doc::new();
     let mut derives = Vec::new();
     attrs::parse(&item.attrs, &mut doc, Some(&mut derives))?;
-    check_reserved_name(&item.ident)?;
 
     let fields = match item.fields {
         Fields::Named(fields) => fields,
@@ -94,7 +92,6 @@
     let mut types = Vec::new();
     for foreign in &foreign_mod.items {
         if let ForeignItem::Type(foreign) = foreign {
-            check_reserved_name(&foreign.ident)?;
             let ety = parse_extern_type(foreign)?;
             types.push(ety);
         }
@@ -396,11 +393,3 @@
         ty => Ok(Some(ty)),
     }
 }
-
-fn check_reserved_name(ident: &Ident) -> Result<()> {
-    if ident == "Box" || ident == "UniquePtr" || Atom::from(ident).is_some() {
-        Err(Error::new(ident.span(), "reserved name"))
-    } else {
-        Ok(())
-    }
-}