1 #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")]
3 #![feature(box_patterns)]
4 #![feature(drain_filter)]
7 #![feature(proc_macro_internals)]
8 #![feature(proc_macro_quote)]
9 #![feature(rustc_diagnostic_macros)]
10 #![feature(crate_visibility_modifier)]
11 #![feature(specialization)]
12 #![feature(rustc_private)]
14 #![recursion_limit="256"]
16 #![deny(rust_2018_idioms)]
17 #![cfg_attr(not(stage0), deny(internal))]
20 #[allow(unused_extern_crates)]
21 extern crate serialize as rustc_serialize; // used by deriving
22 extern crate proc_macro;
27 extern crate rustc_data_structures;
47 pub fn validate_crate_name(
48 sess: Option<&rustc::session::Session>,
50 sp: Option<syntax_pos::Span>
52 let mut err_count = 0;
54 let mut say = |s: &str| {
56 (_, None) => bug!("{}", s),
57 (Some(sp), Some(sess)) => sess.span_err(sp, s),
58 (None, Some(sess)) => sess.err(s),
63 say("crate name must not be empty");
66 if c.is_alphanumeric() { continue }
67 if c == '_' { continue }
68 say(&format!("invalid character `{}` in crate name: `{}`", c, s));
73 sess.unwrap().abort_if_errors();
77 __build_diagnostic_array! { librustc_metadata, DIAGNOSTICS }