Skip to content

Commit 902e4d2

Browse files
committed
---
yaml --- r: 3579 b: refs/heads/master c: 6f8bc40 h: refs/heads/master i: 3577: 54035b5 3575: 917e879 v: v3
1 parent 4461eae commit 902e4d2

File tree

4 files changed

+30
-7
lines changed

4 files changed

+30
-7
lines changed

[refs]

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 4349eaed8417a39eb54ea952ce86c7c585be6e90
2+
refs/heads/master: 6f8bc404f8ceea0b8981ae2afd5d4414d7a26004

trunk/src/comp/back/link.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -286,19 +286,19 @@ fn build_link_meta(&session::session sess, &ast::crate c,
286286
option::t[str] vers,
287287
vec[@ast::meta_item] cmh_items);
288288

289-
fn provided_link_metas(&ast::crate c) -> provided_metas {
289+
fn provided_link_metas(&session::session sess,
290+
&ast::crate c) -> provided_metas {
290291
let option::t[str] name = none;
291292
let option::t[str] vers = none;
292293
let vec[@ast::meta_item] cmh_items = [];
293-
for (@ast::meta_item meta in
294-
attr::find_linkage_metas(c.node.attrs)) {
294+
auto linkage_metas = attr::find_linkage_metas(c.node.attrs);
295+
attr::require_unique_names(sess, linkage_metas);
296+
for (@ast::meta_item meta in linkage_metas) {
295297
alt (meta.node) {
296298
case (ast::meta_name_value("name", ?v)) {
297-
// FIXME: Should probably warn about duplicate name items
298299
name = some(v);
299300
}
300301
case (ast::meta_name_value("vers", ?v)) {
301-
// FIXME: Should probably warn about duplicate value items
302302
vers = some(v);
303303
}
304304
case (_) {
@@ -361,7 +361,7 @@ fn build_link_meta(&session::session sess, &ast::crate c,
361361
};
362362
}
363363

364-
auto provided_metas = provided_link_metas(c);
364+
auto provided_metas = provided_link_metas(sess, c);
365365
auto name = crate_meta_name(sess, c, output, provided_metas);
366366
auto vers = crate_meta_vers(sess, c, provided_metas);
367367
auto extras_hash = crate_meta_extras_hash(sha, c, provided_metas);

trunk/src/comp/front/attr.rs

+16
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
// Functions dealing with attributes and meta_items
22

33
import std::vec;
4+
import std::str;
5+
import std::map;
46
import std::option;
57
import syntax::ast;
68
import util::common;
9+
import driver::session;
710

811
export attr_metas;
912
export find_linkage_metas;
@@ -12,6 +15,7 @@ export find_meta_items_by_name;
1215
export contains;
1316
export sort_meta_items;
1417
export remove_meta_items_by_name;
18+
export require_unique_names;
1519
export get_attr_name;
1620
export mk_name_value_item;
1721
export mk_list_item;
@@ -168,6 +172,18 @@ fn remove_meta_items_by_name(&vec[@ast::meta_item] items,
168172
ret vec::filter_map(filter, items);
169173
}
170174

175+
fn require_unique_names(&session::session sess, &vec[@ast::meta_item] metas) {
176+
auto map = map::mk_hashmap[str, ()](str::hash, str::eq);
177+
for (@ast::meta_item meta in metas) {
178+
auto name = get_meta_item_name(meta);
179+
if (map.contains_key(name)) {
180+
sess.span_fatal(meta.span,
181+
#fmt("duplicate meta item `%s`", name));
182+
}
183+
map.insert(name, ());
184+
}
185+
}
186+
171187
fn span[T](&T item) -> ast::spanned[T] {
172188
ret rec(node=item, span=rec(lo=0u, hi=0u));
173189
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// xfail-stage0
2+
// error-pattern:duplicate meta item `name`
3+
4+
#[link(name = "test",
5+
name)];
6+
7+
fn main() {}

0 commit comments

Comments
 (0)