Skip to content

Commit 08237ca

Browse files
committed
rustc: Enable writing "unsafe extern fn() {}"
Previously, the parser would not allow you to simultaneously implement a function with a different abi as well as being unsafe at the same time. This extends the parser to allow functions of the form: unsafe extern fn foo() { // ... } The closure type grammar was also changed to reflect this reversal, types previously written as "extern unsafe fn()" must now be written as "unsafe extern fn()". The parser currently has a hack which allows the old style, but this will go away once a snapshot has landed. Closes #10025 [breaking-change]
1 parent cf6857b commit 08237ca

File tree

15 files changed

+59
-49
lines changed

15 files changed

+59
-49
lines changed

src/librustc/metadata/decoder.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ enum Family {
110110
UnsafeFn, // u
111111
StaticMethod, // F
112112
UnsafeStaticMethod, // U
113-
ForeignFn, // e
114113
Type, // y
115114
ForeignType, // T
116115
Mod, // m
@@ -134,7 +133,6 @@ fn item_family(item: ebml::Doc) -> Family {
134133
'u' => UnsafeFn,
135134
'F' => StaticMethod,
136135
'U' => UnsafeStaticMethod,
137-
'e' => ForeignFn,
138136
'y' => Type,
139137
'T' => ForeignType,
140138
'm' => Mod,
@@ -339,7 +337,6 @@ fn item_to_def_like(item: ebml::Doc, did: ast::DefId, cnum: ast::CrateNum)
339337
Struct => DlDef(ast::DefStruct(did)),
340338
UnsafeFn => DlDef(ast::DefFn(did, ast::UnsafeFn)),
341339
Fn => DlDef(ast::DefFn(did, ast::NormalFn)),
342-
ForeignFn => DlDef(ast::DefFn(did, ast::ExternFn)),
343340
StaticMethod | UnsafeStaticMethod => {
344341
let fn_style = if fam == UnsafeStaticMethod { ast::UnsafeFn } else
345342
{ ast::NormalFn };

src/librustc/metadata/encoder.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -787,15 +787,13 @@ fn style_fn_family(s: FnStyle) -> char {
787787
match s {
788788
UnsafeFn => 'u',
789789
NormalFn => 'f',
790-
ExternFn => 'e'
791790
}
792791
}
793792

794793
fn fn_style_static_method_family(s: FnStyle) -> char {
795794
match s {
796795
UnsafeFn => 'U',
797796
NormalFn => 'F',
798-
_ => fail!("extern fn can't be static")
799797
}
800798
}
801799

src/librustc/metadata/tydecode.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,6 @@ fn parse_fn_style(c: char) -> FnStyle {
441441
match c {
442442
'u' => UnsafeFn,
443443
'n' => NormalFn,
444-
'c' => ExternFn,
445444
_ => fail!("parse_fn_style: bad fn_style {}", c)
446445
}
447446
}

src/librustc/metadata/tyencode.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,6 @@ fn enc_fn_style(w: &mut MemWriter, p: FnStyle) {
293293
match p {
294294
NormalFn => mywrite!(w, "n"),
295295
UnsafeFn => mywrite!(w, "u"),
296-
ExternFn => mywrite!(w, "c")
297296
}
298297
}
299298

src/librustc/middle/reachable.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use middle::privacy;
2222
use util::nodemap::NodeSet;
2323

2424
use collections::HashSet;
25+
use syntax::abi;
2526
use syntax::ast;
2627
use syntax::ast_map;
2728
use syntax::ast_util::{def_id_of_def, is_local};
@@ -250,8 +251,10 @@ impl<'a> ReachableContext<'a> {
250251
match *node {
251252
ast_map::NodeItem(item) => {
252253
match item.node {
253-
ast::ItemFn(_, ast::ExternFn, _, _, _) => {
254-
self.reachable_symbols.insert(search_item);
254+
ast::ItemFn(_, _, abi, _, _) => {
255+
if abi != abi::Rust {
256+
self.reachable_symbols.insert(search_item);
257+
}
255258
}
256259
_ => {}
257260
}

src/librustc/middle/trans/base.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1594,8 +1594,8 @@ impl<'a> Visitor<()> for TransItemVisitor<'a> {
15941594
pub fn trans_item(ccx: &CrateContext, item: &ast::Item) {
15951595
let _icx = push_ctxt("trans_item");
15961596
match item.node {
1597-
ast::ItemFn(decl, fn_style, _abi, ref generics, body) => {
1598-
if fn_style == ast::ExternFn {
1597+
ast::ItemFn(decl, _fn_style, abi, ref generics, body) => {
1598+
if abi != Rust {
15991599
let llfndecl = get_item_val(ccx, item.id);
16001600
foreign::trans_rust_fn_with_foreign_abi(
16011601
ccx, decl, body, item.attrs.as_slice(), llfndecl, item.id);
@@ -1939,8 +1939,8 @@ pub fn get_item_val(ccx: &CrateContext, id: ast::NodeId) -> ValueRef {
19391939
}
19401940
}
19411941

1942-
ast::ItemFn(_, fn_style, _, _, _) => {
1943-
let llfn = if fn_style != ast::ExternFn {
1942+
ast::ItemFn(_, _, abi, _, _) => {
1943+
let llfn = if abi == Rust {
19441944
register_fn(ccx, i.span, sym, i.id, ty)
19451945
} else {
19461946
foreign::register_rust_fn_with_foreign_abi(ccx,

src/librustc/middle/trans/reflect.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,5 @@ pub fn ast_fn_style_constant(fn_style: ast::FnStyle) -> uint {
403403
match fn_style {
404404
ast::UnsafeFn => 1u,
405405
ast::NormalFn => 2u,
406-
ast::ExternFn => 3u
407406
}
408407
}

src/librustc/middle/typeck/infer/glb.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use middle::typeck::infer::{cres, InferCtxt};
2222
use middle::typeck::infer::{TypeTrace, Subtype};
2323
use middle::typeck::infer::fold_regions_in_sig;
2424
use syntax::ast::{Many, Once, MutImmutable, MutMutable};
25-
use syntax::ast::{ExternFn, NormalFn, UnsafeFn, NodeId};
25+
use syntax::ast::{NormalFn, UnsafeFn, NodeId};
2626
use syntax::ast::{Onceness, FnStyle};
2727
use collections::HashMap;
2828
use util::common::{indenter};
@@ -83,7 +83,6 @@ impl<'f> Combine for Glb<'f> {
8383

8484
fn fn_styles(&self, a: FnStyle, b: FnStyle) -> cres<FnStyle> {
8585
match (a, b) {
86-
(ExternFn, _) | (_, ExternFn) => Ok(ExternFn),
8786
(NormalFn, _) | (_, NormalFn) => Ok(NormalFn),
8887
(UnsafeFn, UnsafeFn) => Ok(UnsafeFn)
8988
}

src/librustc/middle/typeck/infer/lub.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use middle::typeck::infer::fold_regions_in_sig;
2323
use middle::typeck::infer::{TypeTrace, Subtype};
2424
use collections::HashMap;
2525
use syntax::ast::{Many, Once, NodeId};
26-
use syntax::ast::{ExternFn, NormalFn, UnsafeFn};
26+
use syntax::ast::{NormalFn, UnsafeFn};
2727
use syntax::ast::{Onceness, FnStyle};
2828
use util::ppaux::mt_to_str;
2929

@@ -78,8 +78,7 @@ impl<'f> Combine for Lub<'f> {
7878
fn fn_styles(&self, a: FnStyle, b: FnStyle) -> cres<FnStyle> {
7979
match (a, b) {
8080
(UnsafeFn, _) | (_, UnsafeFn) => Ok(UnsafeFn),
81-
(NormalFn, _) | (_, NormalFn) => Ok(NormalFn),
82-
(ExternFn, ExternFn) => Ok(ExternFn),
81+
(NormalFn, NormalFn) => Ok(NormalFn),
8382
}
8483
}
8584

src/librustdoc/clean.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1200,7 +1200,7 @@ impl Clean<Item> for ast::ForeignItem {
12001200
ForeignFunctionItem(Function {
12011201
decl: decl.clean(),
12021202
generics: generics.clean(),
1203-
fn_style: ast::ExternFn,
1203+
fn_style: ast::NormalFn,
12041204
})
12051205
}
12061206
ast::ForeignItemStatic(ref ty, mutbl) => {

0 commit comments

Comments
 (0)