diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 9f11b059a9535fb051ccfe662ee2b0f00c3e4ed9..4f81194acd78124ccb68d57c6858832428a6434d 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4186,10 +4186,10 @@ fn parse_foreign_item( return iovi_foreign_item(item); } if (self.is_keyword("fn") || self.is_keyword("pure") || - self.is_keyword("unsafe")) { + self.is_keyword("unsafe")) { // FOREIGN FUNCTION ITEM - let item = self.parse_item_foreign_fn(attrs); - return iovi_foreign_item(item); + let item = self.parse_item_foreign_fn(attrs); + return iovi_foreign_item(item); } self.parse_macro_use_or_failure(attrs,macros_allowed,lo,visibility) } @@ -4504,7 +4504,12 @@ fn parse_foreign_items(&self, first_item_attrs: ~[attribute], let mut foreign_items = ~[]; loop { match self.parse_foreign_item(/*bad*/ copy attrs, macros_allowed) { - iovi_none => break, + iovi_none => { + if *self.token == token::RBRACE { + break + } + self.unexpected(); + }, iovi_view_item(view_item) => { // I think this can't occur: self.span_err(view_item.span, diff --git a/src/test/compile-fail/extern-no-fn.rs b/src/test/compile-fail/extern-no-fn.rs new file mode 100644 index 0000000000000000000000000000000000000000..164cbe5417402dd619c597b71243b46706fc55b0 --- /dev/null +++ b/src/test/compile-fail/extern-no-fn.rs @@ -0,0 +1,17 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// error-pattern:unexpected token +extern { + f(); +} + +fn main() { +}