mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-19 11:07:32 +00:00
Disallow forbidden usage of non-ascii identifiers.
This commit is contained in:
parent
163445ac80
commit
de24ddac0a
@ -572,6 +572,35 @@ impl<'a> AstValidator<'a> {
|
|||||||
.emit();
|
.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn check_nomangle_item_asciionly(&self, ident: Ident, item_span: Span) {
|
||||||
|
if ident.name.as_str().is_ascii() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let head_span = self.session.source_map().guess_head_span(item_span);
|
||||||
|
struct_span_err!(
|
||||||
|
self.session,
|
||||||
|
head_span,
|
||||||
|
E0754,
|
||||||
|
"`#[no_mangle]` requires ASCII identifier"
|
||||||
|
)
|
||||||
|
.emit();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_mod_file_item_asciionly(&self, ident: Ident) {
|
||||||
|
if ident.name.as_str().is_ascii() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
struct_span_err!(
|
||||||
|
self.session,
|
||||||
|
ident.span,
|
||||||
|
E0754,
|
||||||
|
"trying to load file for module `{}` with non ascii identifer name",
|
||||||
|
ident.name
|
||||||
|
)
|
||||||
|
.help("consider using `#[path]` attribute to specify filesystem path")
|
||||||
|
.emit();
|
||||||
|
}
|
||||||
|
|
||||||
fn deny_generic_params(&self, generics: &Generics, ident_span: Span) {
|
fn deny_generic_params(&self, generics: &Generics, ident_span: Span) {
|
||||||
if !generics.params.is_empty() {
|
if !generics.params.is_empty() {
|
||||||
struct_span_err!(
|
struct_span_err!(
|
||||||
@ -866,6 +895,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
|||||||
self.has_proc_macro_decls = true;
|
self.has_proc_macro_decls = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if attr::contains_name(&item.attrs, sym::no_mangle) {
|
||||||
|
self.check_nomangle_item_asciionly(item.ident, item.span);
|
||||||
|
}
|
||||||
|
|
||||||
match item.kind {
|
match item.kind {
|
||||||
ItemKind::Impl {
|
ItemKind::Impl {
|
||||||
unsafety,
|
unsafety,
|
||||||
@ -992,9 +1025,11 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
|||||||
walk_list!(self, visit_attribute, &item.attrs);
|
walk_list!(self, visit_attribute, &item.attrs);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ItemKind::Mod(_) => {
|
ItemKind::Mod(Mod { inline, .. }) => {
|
||||||
// Ensure that `path` attributes on modules are recorded as used (cf. issue #35584).
|
// Ensure that `path` attributes on modules are recorded as used (cf. issue #35584).
|
||||||
attr::first_attr_value_str_by_name(&item.attrs, sym::path);
|
if !inline && !attr::contains_name(&item.attrs, sym::path) {
|
||||||
|
self.check_mod_file_item_asciionly(item.ident);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ItemKind::Union(ref vdata, _) => {
|
ItemKind::Union(ref vdata, _) => {
|
||||||
if let VariantData::Tuple(..) | VariantData::Unit(..) = vdata {
|
if let VariantData::Tuple(..) | VariantData::Unit(..) = vdata {
|
||||||
|
@ -436,6 +436,7 @@ E0750: include_str!("./error_codes/E0750.md"),
|
|||||||
E0751: include_str!("./error_codes/E0751.md"),
|
E0751: include_str!("./error_codes/E0751.md"),
|
||||||
E0752: include_str!("./error_codes/E0752.md"),
|
E0752: include_str!("./error_codes/E0752.md"),
|
||||||
E0753: include_str!("./error_codes/E0753.md"),
|
E0753: include_str!("./error_codes/E0753.md"),
|
||||||
|
E0754: include_str!("./error_codes/E0754.md"),
|
||||||
;
|
;
|
||||||
// E0006, // merged with E0005
|
// E0006, // merged with E0005
|
||||||
// E0008, // cannot bind by-move into a pattern guard
|
// E0008, // cannot bind by-move into a pattern guard
|
||||||
|
33
src/librustc_error_codes/error_codes/E0754.md
Normal file
33
src/librustc_error_codes/error_codes/E0754.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
An non-ascii identifier was used in an invalid context.
|
||||||
|
|
||||||
|
Erroneous code example:
|
||||||
|
|
||||||
|
```compile_fail,E0754
|
||||||
|
# #![feature(non_ascii_idents)]
|
||||||
|
|
||||||
|
mod řųśť;
|
||||||
|
// ^ error!
|
||||||
|
fn main() {}
|
||||||
|
```
|
||||||
|
|
||||||
|
```compile_fail,E0754
|
||||||
|
# #![feature(non_ascii_idents)]
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
fn řųśť() {}
|
||||||
|
// ^ error!
|
||||||
|
fn main() {}
|
||||||
|
```
|
||||||
|
|
||||||
|
Non-ascii can be used as module names if it is inline
|
||||||
|
or a #\[path\] attribute is specified. For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
# #![feature(non_ascii_idents)]
|
||||||
|
|
||||||
|
mod řųśť {
|
||||||
|
const IS_GREAT: bool = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
||||||
|
```
|
@ -0,0 +1 @@
|
|||||||
|
pub trait Foo {}
|
6
src/test/ui/rfc-2457/mod_file_nonascii_forbidden.rs
Normal file
6
src/test/ui/rfc-2457/mod_file_nonascii_forbidden.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#![feature(non_ascii_idents)]
|
||||||
|
|
||||||
|
mod řųśť; //~ trying to load file for
|
||||||
|
//~^ file not found for
|
||||||
|
|
||||||
|
fn main() {}
|
20
src/test/ui/rfc-2457/mod_file_nonascii_forbidden.stderr
Normal file
20
src/test/ui/rfc-2457/mod_file_nonascii_forbidden.stderr
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
error[E0583]: file not found for module `řųśť`
|
||||||
|
--> $DIR/mod_file_nonascii_forbidden.rs:3:1
|
||||||
|
|
|
||||||
|
LL | mod řųśť;
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: to create the module `řųśť`, create file "$DIR/řųśť.rs"
|
||||||
|
|
||||||
|
error[E0754]: trying to load file for module `řųśť` with non ascii identifer name
|
||||||
|
--> $DIR/mod_file_nonascii_forbidden.rs:3:5
|
||||||
|
|
|
||||||
|
LL | mod řųśť;
|
||||||
|
| ^^^^
|
||||||
|
|
|
||||||
|
= help: consider using `#[path]` attribute to specify filesystem path
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
Some errors have detailed explanations: E0583, E0754.
|
||||||
|
For more information about an error, try `rustc --explain E0583`.
|
@ -0,0 +1,7 @@
|
|||||||
|
// check-pass
|
||||||
|
#![feature(non_ascii_idents)]
|
||||||
|
|
||||||
|
#[path="auxiliary/mod_file_nonascii_with_path_allowed-aux.rs"]
|
||||||
|
mod řųśť;
|
||||||
|
|
||||||
|
fn main() {}
|
8
src/test/ui/rfc-2457/mod_inline_nonascii_allowed.rs
Normal file
8
src/test/ui/rfc-2457/mod_inline_nonascii_allowed.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// check-pass
|
||||||
|
#![feature(non_ascii_idents)]
|
||||||
|
|
||||||
|
mod řųśť {
|
||||||
|
const IS_GREAT: bool = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
6
src/test/ui/rfc-2457/no_mangle_nonascii_forbidden.rs
Normal file
6
src/test/ui/rfc-2457/no_mangle_nonascii_forbidden.rs
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#![feature(non_ascii_idents)]
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn řųśť() {} //~ `#[no_mangle]` requires ASCII identifier
|
||||||
|
|
||||||
|
fn main() {}
|
9
src/test/ui/rfc-2457/no_mangle_nonascii_forbidden.stderr
Normal file
9
src/test/ui/rfc-2457/no_mangle_nonascii_forbidden.stderr
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
error[E0754]: `#[no_mangle]` requires ASCII identifier
|
||||||
|
--> $DIR/no_mangle_nonascii_forbidden.rs:4:1
|
||||||
|
|
|
||||||
|
LL | pub fn řųśť() {}
|
||||||
|
| ^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0754`.
|
Loading…
Reference in New Issue
Block a user