Skip to content

Commit

Permalink
Disable using non-ascii identifiers in extern blocks.
Browse files Browse the repository at this point in the history
  • Loading branch information
crlf0710 committed Apr 7, 2021
1 parent 5c897d4 commit 4752a54
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 3 deletions.
24 changes: 23 additions & 1 deletion compiler/rustc_ast_passes/src/ast_validation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
/// or free and `unsafe extern "C"` semantically.
fn check_c_varadic_type(&self, fk: FnKind<'a>) {
Expand Down Expand Up @@ -592,7 +611,7 @@ impl<'a> AstValidator<'a> {
self.session,
ident.span,
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
)
.help("consider using `#[path]` attribute to specify filesystem path")
Expand Down Expand Up @@ -1103,15 +1122,18 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
self.check_defaultness(fi.span, *def);
self.check_foreign_fn_bodyless(fi.ident, body.as_deref());
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)) => {
self.check_defaultness(fi.span, *def);
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_foreign_ty_genericless(generics);
self.check_foreign_item_ascii_only(fi.ident);
}
ForeignItemKind::Static(_, _, body) => {
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(..) => {}
}
Expand Down
1 change: 1 addition & 0 deletions src/test/ui/feature-gates/feature-gate-non_ascii_idents.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ enum Bär { //~ ERROR non-ascii idents

extern "C" {
fn qüx(); //~ ERROR non-ascii idents
//~^ ERROR items in `extern` blocks
}

fn main() {}
12 changes: 11 additions & 1 deletion src/test/ui/feature-gates/feature-gate-non_ascii_idents.stderr
Original file line number Diff line number Diff line change
@@ -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
--> $DIR/feature-gate-non_ascii_idents.rs:1:22
|
Expand Down Expand Up @@ -115,6 +125,6 @@ LL | fn qüx();
= 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

error: aborting due to 13 previous errors
error: aborting due to 14 previous errors

For more information about this error, try `rustc --explain E0658`.
10 changes: 10 additions & 0 deletions src/test/ui/rfc-2457/extern_block_nonascii_forbidden.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 34 additions & 0 deletions src/test/ui/rfc-2457/extern_block_nonascii_forbidden.stderr
Original file line number Diff line number Diff line change
@@ -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

2 changes: 1 addition & 1 deletion src/test/ui/rfc-2457/mod_file_nonascii_forbidden.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ LL | mod řųśť;
|
= 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
|
LL | mod řųśť;
Expand Down

0 comments on commit 4752a54

Please sign in to comment.