Skip to content

Commit e6f53c0

Browse files
committed
libsyntax: Forbid use (and most other things) within extern { ... } blocks
1 parent b0bea10 commit e6f53c0

File tree

4 files changed

+58
-69
lines changed

4 files changed

+58
-69
lines changed

src/libcore/libc.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1221,9 +1221,8 @@ pub mod funcs {
12211221
#[nolink]
12221222
#[abi = "cdecl"]
12231223
pub mod fcntl {
1224+
use libc::types::os::arch::c95::{c_int, c_char};
12241225
pub extern {
1225-
use libc::types::os::arch::c95::{c_int, c_char};
1226-
12271226
#[link_name = "_open"]
12281227
unsafe fn open(path: *c_char, oflag: c_int, mode: c_int)
12291228
-> c_int;
@@ -1562,11 +1561,11 @@ pub mod funcs {
15621561
#[cfg(target_os = "macos")]
15631562
#[cfg(target_os = "freebsd")]
15641563
pub mod bsd44 {
1564+
use libc::types::common::c95::{c_void};
1565+
use libc::types::os::arch::c95::{c_char, c_int, c_uint, size_t};
1566+
15651567
#[abi = "cdecl"]
15661568
pub extern {
1567-
use libc::types::common::c95::{c_void};
1568-
use libc::types::os::arch::c95::{c_char, c_int, c_uint, size_t};
1569-
15701569
unsafe fn sysctl(name: *c_int, namelen: c_uint,
15711570
oldp: *mut c_void, oldlenp: *mut size_t,
15721571
newp: *c_void, newlen: size_t) -> c_int;

src/libsyntax/parse/parser.rs

Lines changed: 54 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ pub enum item_or_view_item {
120120

121121
enum view_item_parse_mode {
122122
VIEW_ITEMS_AND_ITEMS_ALLOWED,
123-
VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED,
123+
FOREIGN_ITEMS_ALLOWED,
124124
IMPORTS_AND_ITEMS_ALLOWED
125125
}
126126

@@ -3535,7 +3535,7 @@ pub impl Parser {
35353535
items: _,
35363536
foreign_items: foreign_items
35373537
} = self.parse_items_and_view_items(first_item_attrs,
3538-
VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED,
3538+
FOREIGN_ITEMS_ALLOWED,
35393539
true);
35403540

35413541
let mut items: ~[@foreign_item] = foreign_items;
@@ -3885,12 +3885,14 @@ pub impl Parser {
38853885
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
38863886
visibility,
38873887
maybe_append(attrs, extra_attrs)));
3888-
} else if foreign_items_allowed &&
3888+
}
3889+
if foreign_items_allowed &&
38893890
(self.is_keyword(&~"const") || self.is_keyword(&~"static")) {
38903891
// FOREIGN CONST ITEM
38913892
let item = self.parse_item_foreign_const(visibility, attrs);
38923893
return iovi_foreign_item(item);
3893-
} else if items_allowed &&
3894+
}
3895+
if items_allowed &&
38943896
// FUNCTION ITEM (not sure about lookahead condition...)
38953897
self.is_keyword(&~"fn") &&
38963898
!self.fn_expr_lookahead(self.look_ahead(1u)) {
@@ -3899,21 +3901,24 @@ pub impl Parser {
38993901
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
39003902
visibility,
39013903
maybe_append(attrs, extra_attrs)));
3902-
} else if items_allowed && self.eat_keyword(&~"pure") {
3904+
}
3905+
if items_allowed && self.eat_keyword(&~"pure") {
39033906
// PURE FUNCTION ITEM
39043907
// NB: We parse this as impure for bootstrapping purposes.
39053908
self.expect_keyword(&~"fn");
39063909
let (ident, item_, extra_attrs) = self.parse_item_fn(impure_fn);
39073910
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
39083911
visibility,
39093912
maybe_append(attrs, extra_attrs)));
3910-
} else if foreign_items_allowed &&
3913+
}
3914+
if foreign_items_allowed &&
39113915
(self.is_keyword(&~"fn") || self.is_keyword(&~"pure") ||
39123916
self.is_keyword(&~"unsafe")) {
39133917
// FOREIGN FUNCTION ITEM (no items allowed)
39143918
let item = self.parse_item_foreign_fn(attrs);
39153919
return iovi_foreign_item(item);
3916-
} else if items_allowed && self.is_keyword(&~"unsafe")
3920+
}
3921+
if items_allowed && self.is_keyword(&~"unsafe")
39173922
&& self.look_ahead(1u) != token::LBRACE {
39183923
// UNSAFE FUNCTION ITEM (where items are allowed)
39193924
self.bump();
@@ -3922,7 +3927,8 @@ pub impl Parser {
39223927
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
39233928
visibility,
39243929
maybe_append(attrs, extra_attrs)));
3925-
} else if self.eat_keyword(&~"extern") {
3930+
}
3931+
if self.eat_keyword(&~"extern") {
39263932
if items_allowed && self.eat_keyword(&~"fn") {
39273933
// EXTERN FUNCTION ITEM
39283934
let (ident, item_, extra_attrs) =
@@ -3932,47 +3938,62 @@ pub impl Parser {
39323938
maybe_append(attrs,
39333939
extra_attrs)));
39343940
}
3935-
// EXTERN MODULE ITEM
3936-
return self.parse_item_foreign_mod(lo, visibility, attrs,
3937-
items_allowed);
3938-
} else if items_allowed && self.eat_keyword(&~"mod") {
3941+
if !foreign_items_allowed {
3942+
// EXTERN MODULE ITEM
3943+
return self.parse_item_foreign_mod(lo, visibility, attrs,
3944+
items_allowed);
3945+
}
3946+
}
3947+
if items_allowed && !foreign_items_allowed &&
3948+
self.eat_keyword(&~"mod") {
39393949
// MODULE ITEM
39403950
let (ident, item_, extra_attrs) = self.parse_item_mod(attrs);
39413951
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
39423952
visibility,
39433953
maybe_append(attrs, extra_attrs)));
3944-
} else if items_allowed && self.eat_keyword(&~"type") {
3954+
}
3955+
if items_allowed && !foreign_items_allowed &&
3956+
self.eat_keyword(&~"type") {
39453957
// TYPE ITEM
39463958
let (ident, item_, extra_attrs) = self.parse_item_type();
39473959
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
39483960
visibility,
39493961
maybe_append(attrs, extra_attrs)));
3950-
} else if items_allowed && self.eat_keyword(&~"enum") {
3962+
}
3963+
if items_allowed && !foreign_items_allowed &&
3964+
self.eat_keyword(&~"enum") {
39513965
// ENUM ITEM
39523966
let (ident, item_, extra_attrs) = self.parse_item_enum();
39533967
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
39543968
visibility,
39553969
maybe_append(attrs, extra_attrs)));
3956-
} else if items_allowed && self.eat_keyword(&~"trait") {
3970+
}
3971+
if items_allowed && !foreign_items_allowed &&
3972+
self.eat_keyword(&~"trait") {
39573973
// TRAIT ITEM
39583974
let (ident, item_, extra_attrs) = self.parse_item_trait();
39593975
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
39603976
visibility,
39613977
maybe_append(attrs, extra_attrs)));
3962-
} else if items_allowed && self.eat_keyword(&~"impl") {
3978+
}
3979+
if items_allowed && !foreign_items_allowed &&
3980+
self.eat_keyword(&~"impl") {
39633981
// IMPL ITEM
39643982
let (ident, item_, extra_attrs) =
39653983
self.parse_item_impl(visibility);
39663984
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
39673985
visibility,
39683986
maybe_append(attrs, extra_attrs)));
3969-
} else if items_allowed && self.eat_keyword(&~"struct") {
3987+
}
3988+
if items_allowed && !foreign_items_allowed &&
3989+
self.eat_keyword(&~"struct") {
39703990
// STRUCT ITEM
39713991
let (ident, item_, extra_attrs) = self.parse_item_struct();
39723992
return iovi_item(self.mk_item(lo, self.last_span.hi, ident, item_,
39733993
visibility,
39743994
maybe_append(attrs, extra_attrs)));
3975-
} else if self.eat_keyword(&~"use") {
3995+
}
3996+
if !foreign_items_allowed && self.eat_keyword(&~"use") {
39763997
// USE ITEM
39773998
let view_item = self.parse_use();
39783999
self.expect(&token::SEMI);
@@ -3982,7 +4003,8 @@ pub impl Parser {
39824003
vis: visibility,
39834004
span: mk_sp(lo, self.last_span.hi)
39844005
});
3985-
} else if macros_allowed && !self.is_any_keyword(&copy *self.token)
4006+
}
4007+
if macros_allowed && !self.is_any_keyword(&copy *self.token)
39864008
&& self.look_ahead(1) == token::NOT
39874009
&& (is_plain_ident(&self.look_ahead(2))
39884010
|| self.look_ahead(2) == token::LPAREN
@@ -4025,16 +4047,16 @@ pub impl Parser {
40254047
let item_ = item_mac(m);
40264048
return iovi_item(self.mk_item(lo, self.last_span.hi, id, item_,
40274049
visibility, attrs));
4028-
} else {
4029-
// FAILURE TO PARSE ITEM
4030-
if visibility != inherited {
4031-
let mut s = ~"unmatched visibility `";
4032-
s += if visibility == public { ~"pub" } else { ~"priv" };
4033-
s += ~"`";
4034-
self.span_fatal(*self.last_span, s);
4035-
}
4036-
return iovi_none;
4037-
};
4050+
}
4051+
4052+
// FAILURE TO PARSE ITEM
4053+
if visibility != inherited {
4054+
let mut s = ~"unmatched visibility `";
4055+
s += if visibility == public { ~"pub" } else { ~"priv" };
4056+
s += ~"`";
4057+
self.span_fatal(*self.last_span, s);
4058+
}
4059+
return iovi_none;
40384060
}
40394061

40404062
fn parse_item(&self, +attrs: ~[attribute]) -> Option<@ast::item> {
@@ -4201,17 +4223,17 @@ pub impl Parser {
42014223

42024224
let items_allowed = match mode {
42034225
VIEW_ITEMS_AND_ITEMS_ALLOWED | IMPORTS_AND_ITEMS_ALLOWED => true,
4204-
VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED => false
4226+
FOREIGN_ITEMS_ALLOWED => false
42054227
};
42064228

42074229
let restricted_to_imports = match mode {
42084230
IMPORTS_AND_ITEMS_ALLOWED => true,
42094231
VIEW_ITEMS_AND_ITEMS_ALLOWED |
4210-
VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED => false
4232+
FOREIGN_ITEMS_ALLOWED => false
42114233
};
42124234

42134235
let foreign_items_allowed = match mode {
4214-
VIEW_ITEMS_AND_FOREIGN_ITEMS_ALLOWED => true,
4236+
FOREIGN_ITEMS_ALLOWED => true,
42154237
VIEW_ITEMS_AND_ITEMS_ALLOWED | IMPORTS_AND_ITEMS_ALLOWED => false
42164238
};
42174239

src/test/run-pass/conditional-compile.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -121,13 +121,6 @@ mod test_foreign_items {
121121
mod test_use_statements {
122122
#[cfg(bogus)]
123123
use flippity_foo;
124-
125-
pub mod rustrt {
126-
pub extern {
127-
#[cfg(bogus)]
128-
use flippity_foo;
129-
}
130-
}
131124
}
132125

133126
mod test_methods {

src/test/run-pass/import-from-foreign.rs

Lines changed: 0 additions & 25 deletions
This file was deleted.

0 commit comments

Comments
 (0)