Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Disable using non-ascii identifiers in extern blocks. #83936

Merged
merged 1 commit into from
Apr 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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",
crlf0710 marked this conversation as resolved.
Show resolved Hide resolved
)
.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