Disable using non-ascii identifiers in extern blocks.
This commit is contained in:
parent
5c897d430d
commit
4752a54ad0
6 changed files with 80 additions and 3 deletions
|
@ -532,6 +532,25 @@ impl<'a> AstValidator<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// An item in `extern { ... }` cannot use non-ascii identifier.
|
||||||
|
fn check_foreign_item_ascii_only(&self, ident: Ident) {
|
||||||
|
let symbol_str = ident.as_str();
|
||||||
|
if !symbol_str.is_ascii() {
|
||||||
|
let n = 83942;
|
||||||
|
self.err_handler()
|
||||||
|
.struct_span_err(
|
||||||
|
ident.span,
|
||||||
|
"items in `extern` blocks cannot use non-ascii identifiers",
|
||||||
|
)
|
||||||
|
.span_label(self.current_extern_span(), "in this `extern` block")
|
||||||
|
.note(&format!(
|
||||||
|
"This limitation may be lifted in the future; see issue #{} <https://github.com/rust-lang/rust/issues/{}> for more information",
|
||||||
|
n, n,
|
||||||
|
))
|
||||||
|
.emit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Reject C-varadic type unless the function is foreign,
|
/// Reject C-varadic type unless the function is foreign,
|
||||||
/// or free and `unsafe extern "C"` semantically.
|
/// or free and `unsafe extern "C"` semantically.
|
||||||
fn check_c_varadic_type(&self, fk: FnKind<'a>) {
|
fn check_c_varadic_type(&self, fk: FnKind<'a>) {
|
||||||
|
@ -592,7 +611,7 @@ impl<'a> AstValidator<'a> {
|
||||||
self.session,
|
self.session,
|
||||||
ident.span,
|
ident.span,
|
||||||
E0754,
|
E0754,
|
||||||
"trying to load file for module `{}` with non ascii identifer name",
|
"trying to load file for module `{}` with non-ascii identifier name",
|
||||||
ident.name
|
ident.name
|
||||||
)
|
)
|
||||||
.help("consider using `#[path]` attribute to specify filesystem path")
|
.help("consider using `#[path]` attribute to specify filesystem path")
|
||||||
|
@ -1103,15 +1122,18 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||||
self.check_defaultness(fi.span, *def);
|
self.check_defaultness(fi.span, *def);
|
||||||
self.check_foreign_fn_bodyless(fi.ident, body.as_deref());
|
self.check_foreign_fn_bodyless(fi.ident, body.as_deref());
|
||||||
self.check_foreign_fn_headerless(fi.ident, fi.span, sig.header);
|
self.check_foreign_fn_headerless(fi.ident, fi.span, sig.header);
|
||||||
|
self.check_foreign_item_ascii_only(fi.ident);
|
||||||
}
|
}
|
||||||
ForeignItemKind::TyAlias(box TyAliasKind(def, generics, bounds, body)) => {
|
ForeignItemKind::TyAlias(box TyAliasKind(def, generics, bounds, body)) => {
|
||||||
self.check_defaultness(fi.span, *def);
|
self.check_defaultness(fi.span, *def);
|
||||||
self.check_foreign_kind_bodyless(fi.ident, "type", body.as_ref().map(|b| b.span));
|
self.check_foreign_kind_bodyless(fi.ident, "type", body.as_ref().map(|b| b.span));
|
||||||
self.check_type_no_bounds(bounds, "`extern` blocks");
|
self.check_type_no_bounds(bounds, "`extern` blocks");
|
||||||
self.check_foreign_ty_genericless(generics);
|
self.check_foreign_ty_genericless(generics);
|
||||||
|
self.check_foreign_item_ascii_only(fi.ident);
|
||||||
}
|
}
|
||||||
ForeignItemKind::Static(_, _, body) => {
|
ForeignItemKind::Static(_, _, body) => {
|
||||||
self.check_foreign_kind_bodyless(fi.ident, "static", body.as_ref().map(|b| b.span));
|
self.check_foreign_kind_bodyless(fi.ident, "static", body.as_ref().map(|b| b.span));
|
||||||
|
self.check_foreign_item_ascii_only(fi.ident);
|
||||||
}
|
}
|
||||||
ForeignItemKind::MacCall(..) => {}
|
ForeignItemKind::MacCall(..) => {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ enum Bär { //~ ERROR non-ascii idents
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn qüx(); //~ ERROR non-ascii idents
|
fn qüx(); //~ ERROR non-ascii idents
|
||||||
|
//~^ ERROR items in `extern` blocks
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,3 +1,13 @@
|
||||||
|
error: items in `extern` blocks cannot use non-ascii identifiers
|
||||||
|
--> $DIR/feature-gate-non_ascii_idents.rs:30:8
|
||||||
|
|
|
||||||
|
LL | extern "C" {
|
||||||
|
| ---------- in this `extern` block
|
||||||
|
LL | fn qüx();
|
||||||
|
| ^^^
|
||||||
|
|
|
||||||
|
= note: This limitation may be lifted in the future; see issue #83942 <https://github.com/rust-lang/rust/issues/83942> for more information
|
||||||
|
|
||||||
error[E0658]: non-ascii idents are not fully supported
|
error[E0658]: non-ascii idents are not fully supported
|
||||||
--> $DIR/feature-gate-non_ascii_idents.rs:1:22
|
--> $DIR/feature-gate-non_ascii_idents.rs:1:22
|
||||||
|
|
|
|
||||||
|
@ -115,6 +125,6 @@ LL | fn qüx();
|
||||||
= note: see issue #55467 <https://github.com/rust-lang/rust/issues/55467> for more information
|
= note: see issue #55467 <https://github.com/rust-lang/rust/issues/55467> for more information
|
||||||
= help: add `#![feature(non_ascii_idents)]` to the crate attributes to enable
|
= help: add `#![feature(non_ascii_idents)]` to the crate attributes to enable
|
||||||
|
|
||||||
error: aborting due to 13 previous errors
|
error: aborting due to 14 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0658`.
|
For more information about this error, try `rustc --explain E0658`.
|
||||||
|
|
10
src/test/ui/rfc-2457/extern_block_nonascii_forbidden.rs
Normal file
10
src/test/ui/rfc-2457/extern_block_nonascii_forbidden.rs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#![feature(extern_types)]
|
||||||
|
#![feature(non_ascii_idents)]
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
type 一; //~ items in `extern` blocks cannot use non-ascii identifiers
|
||||||
|
fn 二(); //~ items in `extern` blocks cannot use non-ascii identifiers
|
||||||
|
static 三: usize; //~ items in `extern` blocks cannot use non-ascii identifiers
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
34
src/test/ui/rfc-2457/extern_block_nonascii_forbidden.stderr
Normal file
34
src/test/ui/rfc-2457/extern_block_nonascii_forbidden.stderr
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
error: items in `extern` blocks cannot use non-ascii identifiers
|
||||||
|
--> $DIR/extern_block_nonascii_forbidden.rs:5:10
|
||||||
|
|
|
||||||
|
LL | extern "C" {
|
||||||
|
| ---------- in this `extern` block
|
||||||
|
LL | type 一;
|
||||||
|
| ^^
|
||||||
|
|
|
||||||
|
= note: This limitation may be lifted in the future; see issue #83942 <https://github.com/rust-lang/rust/issues/83942> for more information
|
||||||
|
|
||||||
|
error: items in `extern` blocks cannot use non-ascii identifiers
|
||||||
|
--> $DIR/extern_block_nonascii_forbidden.rs:6:8
|
||||||
|
|
|
||||||
|
LL | extern "C" {
|
||||||
|
| ---------- in this `extern` block
|
||||||
|
LL | type 一;
|
||||||
|
LL | fn 二();
|
||||||
|
| ^^
|
||||||
|
|
|
||||||
|
= note: This limitation may be lifted in the future; see issue #83942 <https://github.com/rust-lang/rust/issues/83942> for more information
|
||||||
|
|
||||||
|
error: items in `extern` blocks cannot use non-ascii identifiers
|
||||||
|
--> $DIR/extern_block_nonascii_forbidden.rs:7:12
|
||||||
|
|
|
||||||
|
LL | extern "C" {
|
||||||
|
| ---------- in this `extern` block
|
||||||
|
...
|
||||||
|
LL | static 三: usize;
|
||||||
|
| ^^
|
||||||
|
|
|
||||||
|
= note: This limitation may be lifted in the future; see issue #83942 <https://github.com/rust-lang/rust/issues/83942> for more information
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | mod řųśť;
|
||||||
|
|
|
|
||||||
= help: to create the module `řųśť`, create file "$DIR/řųśť.rs"
|
= help: to create the module `řųśť`, create file "$DIR/řųśť.rs"
|
||||||
|
|
||||||
error[E0754]: trying to load file for module `řųśť` with non ascii identifer name
|
error[E0754]: trying to load file for module `řųśť` with non-ascii identifier name
|
||||||
--> $DIR/mod_file_nonascii_forbidden.rs:3:5
|
--> $DIR/mod_file_nonascii_forbidden.rs:3:5
|
||||||
|
|
|
|
||||||
LL | mod řųśť;
|
LL | mod řųśť;
|
||||||
|
|
Loading…
Add table
Reference in a new issue