Skip to content

Commit

Permalink
Auto merge of #35145 - jseyfried:avoid_extra_resolve_error, r=arielb1
Browse files Browse the repository at this point in the history
resolve: Avoid emitting an unhelpful cascading resolution error

Fixes #35142.
  • Loading branch information
bors committed Aug 2, 2016
2 parents 97d5be9 + 6656a30 commit 32e462e
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 40 deletions.
48 changes: 17 additions & 31 deletions src/librustc_resolve/lib.rs
Expand Up @@ -1807,39 +1807,25 @@ impl<'a> Resolver<'a> {
path_depth: usize)
-> Result<PathResolution, ()> {
self.resolve_path(id, trait_path, path_depth, TypeNS).and_then(|path_res| {
if let Def::Trait(_) = path_res.base_def {
debug!("(resolving trait) found trait def: {:?}", path_res);
Ok(path_res)
} else {
let mut err =
resolve_struct_error(self,
trait_path.span,
ResolutionError::IsNotATrait(&path_names_to_string(trait_path,
path_depth)));

// If it's a typedef, give a note
if let Def::TyAlias(..) = path_res.base_def {
let trait_name = trait_path.segments.last().unwrap().identifier.name;
err.span_label(trait_path.span,
&format!("`{}` is not a trait", trait_name));

let definition_site = {
let segments = &trait_path.segments;
if trait_path.global {
self.resolve_crate_relative_path(trait_path.span, segments, TypeNS)
} else {
self.resolve_module_relative_path(trait_path.span, segments, TypeNS)
}.map(|binding| binding.span).unwrap_or(syntax_pos::DUMMY_SP)
};

if definition_site != syntax_pos::DUMMY_SP {
err.span_label(definition_site,
&format!("type aliases cannot be used for traits"));
}
match path_res.base_def {
Def::Trait(_) => {
debug!("(resolving trait) found trait def: {:?}", path_res);
return Ok(path_res);
}
err.emit();
Err(true)
Def::Err => return Err(true),
_ => {}
}

let mut err = resolve_struct_error(self, trait_path.span, {
ResolutionError::IsNotATrait(&path_names_to_string(trait_path, path_depth))
});

// If it's a typedef, give a note
if let Def::TyAlias(..) = path_res.base_def {
err.note(&format!("type aliases cannot be used for traits"));
}
err.emit();
Err(true)
}).map_err(|error_reported| {
if error_reported { return }

Expand Down
4 changes: 2 additions & 2 deletions src/test/compile-fail/issue-3907.rs
Expand Up @@ -11,14 +11,14 @@
// aux-build:issue_3907.rs
extern crate issue_3907;

type Foo = issue_3907::Foo; //~ NOTE: type aliases cannot be used for traits
type Foo = issue_3907::Foo;

struct S {
name: isize
}

impl Foo for S { //~ ERROR: `Foo` is not a trait
//~| `Foo` is not a trait
//~| NOTE: type aliases cannot be used for traits
fn bar() { }
}

Expand Down
7 changes: 5 additions & 2 deletions src/test/compile-fail/issue-5035.rs
Expand Up @@ -10,7 +10,10 @@

trait I {}
type K = I;
//~^ NOTE: aliases cannot be used for traits
impl K for isize {} //~ ERROR: `K` is not a trait
//~| is not a trait
//~| NOTE: aliases cannot be used for traits

use ImportError; //~ ERROR unresolved
impl ImportError for () {} // check that this is not an additional error (c.f. #35142)

fn main() {}
7 changes: 2 additions & 5 deletions src/test/ui/codemap_tests/two_files.stderr
Expand Up @@ -2,12 +2,9 @@ error[E0404]: `Bar` is not a trait
--> $DIR/two_files.rs:16:6
|
16 | impl Bar for Baz { }
| ^^^ `Bar` is not a trait
|
::: $DIR/two_files_data.rs
| ^^^
|
15 | type Bar = Foo;
| --------------- type aliases cannot be used for traits
= note: type aliases cannot be used for traits

error: cannot continue compilation due to previous error

0 comments on commit 32e462e

Please sign in to comment.