mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-10 05:53:10 +00:00
rustc: Fail when there are multiple matches for 'use'
This commit is contained in:
parent
0255bf30ea
commit
de3528846f
@ -7,6 +7,7 @@ import diagnostic::span_handler;
|
||||
|
||||
export attr_meta;
|
||||
export attr_metas;
|
||||
export find_linkage_attrs;
|
||||
export find_linkage_metas;
|
||||
export inline_attr;
|
||||
export find_inline_attr;
|
||||
@ -36,14 +37,22 @@ export native_abi;
|
||||
// From a list of crate attributes get only the meta_items that impact crate
|
||||
// linkage
|
||||
fn find_linkage_metas(attrs: [ast::attribute]) -> [@ast::meta_item] {
|
||||
let mut metas: [@ast::meta_item] = [];
|
||||
find_linkage_attrs(attrs).flat_map {|attr|
|
||||
alt check attr.node.value.node {
|
||||
ast::meta_list(_, items) { items }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn find_linkage_attrs(attrs: [ast::attribute]) -> [ast::attribute] {
|
||||
let mut found = [];
|
||||
for attr: ast::attribute in find_attrs_by_name(attrs, "link") {
|
||||
alt attr.node.value.node {
|
||||
ast::meta_list(_, items) { metas += items; }
|
||||
ast::meta_list(_, _) { found += [attr] }
|
||||
_ { #debug("ignoring link attribute that has incorrect type"); }
|
||||
}
|
||||
}
|
||||
ret metas;
|
||||
ret found;
|
||||
}
|
||||
|
||||
enum inline_attr {
|
||||
|
@ -138,7 +138,7 @@ fn default_native_lib_naming(sess: session::session, static: bool) ->
|
||||
}
|
||||
}
|
||||
|
||||
fn find_library_crate(sess: session::session,
|
||||
fn find_library_crate(sess: session::session, span: span,
|
||||
metas: [@ast::meta_item])
|
||||
-> option<{ident: str, data: @[u8]}> {
|
||||
|
||||
@ -163,15 +163,16 @@ fn find_library_crate(sess: session::session,
|
||||
|
||||
let nn = default_native_lib_naming(sess, sess.opts.static);
|
||||
let x =
|
||||
find_library_crate_aux(sess, nn, crate_name,
|
||||
find_library_crate_aux(sess, span, nn, crate_name,
|
||||
metas, sess.filesearch);
|
||||
if x != none || sess.opts.static { ret x; }
|
||||
let nn2 = default_native_lib_naming(sess, true);
|
||||
ret find_library_crate_aux(sess, nn2, crate_name, metas,
|
||||
ret find_library_crate_aux(sess, span, nn2, crate_name, metas,
|
||||
sess.filesearch);
|
||||
}
|
||||
|
||||
fn find_library_crate_aux(sess: session::session,
|
||||
span: span,
|
||||
nn: {prefix: str, suffix: str},
|
||||
crate_name: str,
|
||||
metas: [@ast::meta_item],
|
||||
@ -180,7 +181,8 @@ fn find_library_crate_aux(sess: session::session,
|
||||
let prefix: str = nn.prefix + crate_name + "-";
|
||||
let suffix: str = nn.suffix;
|
||||
|
||||
ret filesearch::search(filesearch, { |path|
|
||||
let mut matches = [];
|
||||
filesearch::search(filesearch, { |path|
|
||||
#debug("inspecting file %s", path);
|
||||
let f: str = path::basename(path);
|
||||
if !(str::starts_with(f, prefix) && str::ends_with(f, suffix)) {
|
||||
@ -196,7 +198,8 @@ fn find_library_crate_aux(sess: session::session,
|
||||
option::none
|
||||
} else {
|
||||
#debug("found %s with matching metadata", path);
|
||||
option::some({ident: path, data: cvec})
|
||||
matches += [{ident: path, data: cvec}];
|
||||
option::none
|
||||
}
|
||||
}
|
||||
_ {
|
||||
@ -206,6 +209,25 @@ fn find_library_crate_aux(sess: session::session,
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if matches.is_empty() {
|
||||
none
|
||||
} else if matches.len() == 1u {
|
||||
some(matches[0])
|
||||
} else {
|
||||
sess.span_err(
|
||||
span, #fmt("multiple matching crates for `%s`", crate_name));
|
||||
sess.note("candidates:");
|
||||
for matches.each {|match|
|
||||
sess.note(#fmt("path: %s", match.ident));
|
||||
let attrs = decoder::get_crate_attributes(match.data);
|
||||
for attr::find_linkage_attrs(attrs).each {|attr|
|
||||
sess.note(#fmt("meta: %s", pprust::attr_to_str(attr)));
|
||||
}
|
||||
}
|
||||
sess.abort_if_errors();
|
||||
none
|
||||
}
|
||||
}
|
||||
|
||||
fn get_metadata_section(sess: session::session,
|
||||
@ -240,7 +262,7 @@ fn load_library_crate(sess: session::session, ident: ast::ident, span: span,
|
||||
-> {ident: str, data: @[u8]} {
|
||||
|
||||
|
||||
alt find_library_crate(sess, metas) {
|
||||
alt find_library_crate(sess, span, metas) {
|
||||
some(t) { ret t; }
|
||||
none {
|
||||
sess.span_fatal(span, #fmt["can't find crate for '%s'", ident]);
|
||||
|
9
src/test/compile-fail/crateresolve.rs
Normal file
9
src/test/compile-fail/crateresolve.rs
Normal file
@ -0,0 +1,9 @@
|
||||
// aux-build:crateresolve-1.rs
|
||||
// aux-build:crateresolve-2.rs
|
||||
// aux-build:crateresolve-3.rs
|
||||
// error-pattern:multiple matching crates for `crateresolve`
|
||||
|
||||
use crateresolve;
|
||||
|
||||
fn main() {
|
||||
}
|
Loading…
Reference in New Issue
Block a user