Do not abort parser on namespace ident checks
diff --git a/gen/src/mod.rs b/gen/src/mod.rs
index 928c6ec..be46533 100644
--- a/gen/src/mod.rs
+++ b/gen/src/mod.rs
@@ -43,10 +43,11 @@
     match (|| -> Result<_> {
         let syntax = syn::parse_file(&source)?;
         let bridge = find_bridge_mod(syntax)?;
+        let namespace = bridge.namespace;
         let apis = syntax::parse_items(bridge.module)?;
         let types = Types::collect(&apis)?;
-        check::typecheck(&apis, &types)?;
-        let out = write::gen(bridge.namespace, &apis, &types, opt, header);
+        check::typecheck(&namespace, &apis, &types)?;
+        let out = write::gen(namespace, &apis, &types, opt, header);
         Ok(out)
     })() {
         Ok(out) => out.content(),
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index 472c079..2e1873c 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -16,7 +16,7 @@
     ))?;
     let apis = syntax::parse_items(content.1)?;
     let ref types = Types::collect(&apis)?;
-    check::typecheck(&apis, types)?;
+    check::typecheck(namespace, &apis, types)?;
 
     let mut expanded = TokenStream::new();
     let mut hidden = TokenStream::new();
diff --git a/syntax/check.rs b/syntax/check.rs
index 7ddcea3..c2ee1d1 100644
--- a/syntax/check.rs
+++ b/syntax/check.rs
@@ -1,4 +1,5 @@
 use crate::syntax::atom::Atom::{self, *};
+use crate::syntax::namespace::Namespace;
 use crate::syntax::{
     error, ident, Api, Enum, ExternFn, ExternType, Lang, Receiver, Ref, Slice, Struct, Ty1, Type,
     Types,
@@ -10,14 +11,16 @@
 use syn::{Error, Result};
 
 struct Check<'a> {
+    namespace: &'a Namespace,
     apis: &'a [Api],
     types: &'a Types<'a>,
     errors: &'a mut Vec<Error>,
 }
 
-pub(crate) fn typecheck(apis: &[Api], types: &Types) -> Result<()> {
+pub(crate) fn typecheck(namespace: &Namespace, apis: &[Api], types: &Types) -> Result<()> {
     let mut errors = Vec::new();
     let mut cx = Check {
+        namespace,
         apis,
         types,
         errors: &mut errors,
@@ -27,6 +30,10 @@
 }
 
 fn do_typecheck(cx: &mut Check) {
+    for segment in cx.namespace {
+        cx.errors.extend(ident::check(segment).err());
+    }
+
     for ty in cx.types {
         match ty {
             Type::Ident(ident) => check_type_ident(cx, ident),
diff --git a/syntax/namespace.rs b/syntax/namespace.rs
index 5230eb6..e2dce18 100644
--- a/syntax/namespace.rs
+++ b/syntax/namespace.rs
@@ -1,4 +1,3 @@
-use crate::syntax::ident;
 use quote::IdentFragment;
 use std::fmt::{self, Display};
 use std::slice::Iter;
@@ -34,7 +33,6 @@
             input.parse::<Token![=]>()?;
             let path = input.call(Path::parse_mod_style)?;
             for segment in path.segments {
-                ident::check(&segment.ident)?;
                 segments.push(segment.ident);
             }
             input.parse::<Option<Token![,]>>()?;