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,