diff options
| author | bors <bors@rust-lang.org> | 2013-05-10 00:52:52 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-05-10 00:52:52 -0700 |
| commit | f04eb37c7ea19bbd2cff12d15816873e0a46fc86 (patch) | |
| tree | 3ea97645b871233c86ff8603e71c096a13d8a6af /src | |
| parent | 3e106cf2c2556be6bbcd9a93e5ef2a73b98f0e7a (diff) | |
| parent | 9cbab89076c48bffd966303a1cf2856df2b00dcc (diff) | |
| download | rust-f04eb37c7ea19bbd2cff12d15816873e0a46fc86.tar.gz rust-f04eb37c7ea19bbd2cff12d15816873e0a46fc86.zip | |
auto merge of #6347 : cmr/rust/unknown_module_resolve_error, r=catamorphism
This improves error reporting for the following class of imports:
```rust
use foo::bar;
```
Where foo, the topmost module, is unresolved. It now results in:
```text
/tmp/foo.rs:1:4: 1:7 error: unresolved import. perhapsyou forgot an 'extern mod foo'?
/tmp/foo.rs:1 use foo::bar;
^~~
/tmp/foo.rs:1:4: 1:12 error: failed to resolve import: foo::bar
/tmp/foo.rs:1 use foo::bar;
^~~~~~~~
error: failed to resolve imports
error: aborting due to 3 previous errors
```
This is the first of a series of changes I plan on making to unresolved name error messages.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/middle/resolve.rs | 12 | ||||
| -rw-r--r-- | src/test/compile-fail/issue-1697.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/unresolved-import.rs | 12 |
3 files changed, 24 insertions, 2 deletions
diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 5c3bb6ca401..3d4bd0256bc 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -64,7 +64,7 @@ use syntax::attr::{attr_metas, contains_name, attrs_contains_name}; use syntax::parse::token::ident_interner; use syntax::parse::token::special_idents; use syntax::print::pprust::path_to_str; -use syntax::codemap::{span, dummy_sp}; +use syntax::codemap::{span, dummy_sp, BytePos}; use syntax::visit::{default_visitor, mk_vt, Visitor, visit_block}; use syntax::visit::{visit_crate, visit_expr, visit_expr_opt}; use syntax::visit::{visit_foreign_item, visit_item}; @@ -2482,6 +2482,16 @@ pub impl Resolver { TypeNS, name_search_type) { Failed => { + let segment_name = self.session.str_of(name); + let module_name = self.module_to_str(search_module); + if module_name == ~"???" { + self.session.span_err(span {lo: span.lo, hi: span.lo + + BytePos(str::len(*segment_name)), expn_info: + span.expn_info}, fmt!("unresolved import. maybe \ + a missing 'extern mod %s'?", + *segment_name)); + return Failed; + } self.session.span_err(span, ~"unresolved name"); return Failed; } diff --git a/src/test/compile-fail/issue-1697.rs b/src/test/compile-fail/issue-1697.rs index a0d2536d85f..71b319a27d0 100644 --- a/src/test/compile-fail/issue-1697.rs +++ b/src/test/compile-fail/issue-1697.rs @@ -10,7 +10,7 @@ // Testing that we don't fail abnormally after hitting the errors -use unresolved::*; //~ ERROR unresolved name +use unresolved::*; //~ ERROR unresolved import. maybe a missing //~^ ERROR failed to resolve import fn main() { diff --git a/src/test/compile-fail/unresolved-import.rs b/src/test/compile-fail/unresolved-import.rs new file mode 100644 index 00000000000..1bd3efeadcb --- /dev/null +++ b/src/test/compile-fail/unresolved-import.rs @@ -0,0 +1,12 @@ +// Copyright 2013 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 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use foo::bar; //~ ERROR unresolved import. maybe a missing + //~^ ERROR failed to resolve import |
