Rollup merge of #83936 - crlf0710:disallow_extern_block_non_ascii, r=Manishearth

Disable using non-ascii identifiers in extern blocks.

Fixes #83923.
This commit is contained in:
Dylan DPC 2021-04-07 13:07:16 +02:00 committed by GitHub
commit 9c688cd2a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 80 additions and 3 deletions

View File

@ -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>) {
@ -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")
@ -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(..) => {}
}

View File

@ -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() {}

View File

@ -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
|
@ -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`.

View 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() {}

View 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

View File

@ -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 řųśť;