diff --git a/src/comp/front/eval.rs b/src/comp/front/eval.rs index 3366ddf51ab..8ed646f38d0 100644 --- a/src/comp/front/eval.rs +++ b/src/comp/front/eval.rs @@ -10,7 +10,7 @@ import ast::ident; import front::parser::parser; import front::parser::spanned; import front::parser::new_parser; -import front::parser::parse_inner_attributes; +import front::parser::parse_inner_attrs_and_next; import front::parser::parse_mod_items; import util::common; import util::common::filename; @@ -288,7 +288,7 @@ fn eval_crate_directive(ctx cx, env e, @ast::crate_directive cdir, str prefix, auto p0 = new_parser(cx.sess, e, start_id, full_path, cx.chpos, cx.next_ann); - auto inner_attrs = parse_inner_attributes(p0); + auto inner_attrs = parse_inner_attrs_and_next(p0); auto first_item_outer_attrs = inner_attrs._1; auto m0 = parse_mod_items(p0, token::EOF, first_item_outer_attrs); diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index 4e694a112dc..f1121c814aa 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -1838,7 +1838,7 @@ fn parse_item_mod(&parser p, vec[ast::attribute] attrs) -> @ast::item { auto lo = p.get_last_lo_pos(); auto id = parse_ident(p); expect(p, token::LBRACE); - auto inner_attrs = parse_inner_attributes(p); + auto inner_attrs = parse_inner_attrs_and_next(p); auto first_item_outer_attrs = inner_attrs._1; auto m = parse_mod_items(p, token::RBRACE, first_item_outer_attrs); @@ -2095,8 +2095,8 @@ fn parse_attribute_naked(&parser p, ast::attr_style style, // next item (since we can't know whether the attribute is an inner attribute // of the containing item or an outer attribute of the first contained item // until we see the semi). -fn parse_inner_attributes(&parser p) -> tup(vec[ast::attribute], - vec[ast::attribute]) { +fn parse_inner_attrs_and_next(&parser p) -> tup(vec[ast::attribute], + vec[ast::attribute]) { let vec[ast::attribute] inner_attrs = []; let vec[ast::attribute] next_outer_attrs = []; while (p.peek() == token::POUND) { @@ -2117,6 +2117,14 @@ fn parse_inner_attributes(&parser p) -> tup(vec[ast::attribute], ret tup(inner_attrs, next_outer_attrs); } +fn parse_inner_attrs(&parser p) -> vec[ast::attribute] { + auto attrs_and_next = parse_inner_attrs_and_next(p); + if (vec::len(attrs_and_next._1) > 0u) { + // FIXME: Don't drop this dangling attr on the ground + } + ret attrs_and_next._0; +} + fn parse_meta_item(&parser p) -> @ast::meta_item { auto lo = p.get_lo_pos(); auto ident = parse_ident(p); @@ -2369,6 +2377,8 @@ fn parse_crate_directives(&parser p, token::token term) -> fn parse_crate_from_crate_file(&parser p) -> @ast::crate { auto lo = p.get_lo_pos(); auto prefix = std::fs::dirname(p.get_filemap().name); + // FIXME (issue #487): Do something with these attrs + auto attrs = parse_inner_attrs(p); auto cdirs = parse_crate_directives(p, token::EOF); let vec[str] deps = []; auto cx = diff --git a/src/test/run-pass/crate-attributes.rc b/src/test/run-pass/crate-attributes.rc index c0ed56556b8..0896f834b8b 100644 --- a/src/test/run-pass/crate-attributes.rc +++ b/src/test/run-pass/crate-attributes.rc @@ -1,3 +1,6 @@ +#[name = "crate-attributes"]; +#[vers = "1.0"]; + mod m = "crate-attributes-src" { mod foo; -} \ No newline at end of file +}