Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove E0245; improve E0404 #48446

Merged
merged 1 commit into from
Mar 2, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions src/librustc_resolve/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -542,7 +542,7 @@ fn foo<T, T>(s: T, u: T) {} // error: the name `T` is already used for a type
// parameter in this type parameter list
```

Please verify that none of the type parameterss are misspelled, and rename any
Please verify that none of the type parameters are misspelled, and rename any
clashing parameters. Example:

```
Expand All @@ -551,7 +551,8 @@ fn foo<T, Y>(s: T, u: Y) {} // ok!
"##,

E0404: r##"
You tried to implement something which was not a trait on an object.
You tried to use something which is not a trait in a trait position, such as
a bound or `impl`.

Erroneous code example:

Expand All @@ -562,6 +563,14 @@ struct Bar;
impl Foo for Bar {} // error: `Foo` is not a trait
```

Another erroneous code example:

```compile_fail,E0404
struct Foo;

fn bar<T: Foo>(t: T) {} // error: `Foo` is not a trait
```

Please verify that you didn't misspell the trait's name or otherwise use the
wrong identifier. Example:

Expand All @@ -575,6 +584,17 @@ impl Foo for Bar { // ok!
// functions implementation
}
```

or

```
trait Foo {
// some functions
}

fn bar<T: Foo>(t: T) {} // ok!
```

"##,

E0405: r##"
Expand Down
16 changes: 9 additions & 7 deletions src/librustc_resolve/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2163,6 +2163,7 @@ impl<'a> Resolver<'a> {
result
}

/// This is called to resolve a trait reference from an `impl` (i.e. `impl Trait for Foo`)
fn with_optional_trait_ref<T, F>(&mut self, opt_trait_ref: Option<&TraitRef>, f: F) -> T
where F: FnOnce(&mut Resolver, Option<DefId>) -> T
{
Expand All @@ -2172,13 +2173,14 @@ impl<'a> Resolver<'a> {
let path: Vec<_> = trait_ref.path.segments.iter()
.map(|seg| respan(seg.span, seg.identifier))
.collect();
let def = self.smart_resolve_path_fragment(trait_ref.ref_id,
None,
&path,
trait_ref.path.span,
trait_ref.path.segments.last().unwrap().span,
PathSource::Trait(AliasPossibility::No))
.base_def();
let def = self.smart_resolve_path_fragment(
trait_ref.ref_id,
None,
&path,
trait_ref.path.span,
trait_ref.path.segments.last().unwrap().span,
PathSource::Trait(AliasPossibility::No)
).base_def();
if def != Def::Err {
new_id = Some(def.def_id());
let span = trait_ref.path.span;
Expand Down
9 changes: 4 additions & 5 deletions src/librustc_typeck/astconv.rs
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {

/// Instantiates the path for the given trait reference, assuming that it's
/// bound to a valid trait type. Returns the def_id for the defining trait.
/// Fails if the type is a type other than a trait type.
/// The type _cannot_ be a type other than a trait type.
///
/// If the `projections` argument is `None`, then assoc type bindings like `Foo<T=X>`
/// are disallowed. Otherwise, they are pushed onto the vector given.
Expand All @@ -331,6 +331,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
trait_ref.path.segments.last().unwrap())
}

/// Get the DefId of the given trait ref. It _must_ actually be a trait.
fn trait_def_id(&self, trait_ref: &hir::TraitRef) -> DefId {
let path = &trait_ref.path;
match path.def {
Expand All @@ -339,13 +340,11 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
Def::Err => {
self.tcx().sess.fatal("cannot continue compilation due to previous error");
}
_ => {
span_fatal!(self.tcx().sess, path.span, E0245, "`{}` is not a trait",
self.tcx().hir.node_to_pretty_string(trait_ref.ref_id));
}
_ => unreachable!(),
}
}

/// The given `trait_ref` must actually be trait.
pub(super) fn instantiate_poly_trait_ref_inner(&self,
trait_ref: &hir::TraitRef,
self_ty: Ty<'tcx>,
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_typeck/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4802,7 +4802,7 @@ register_diagnostics! {
// E0240,
// E0241,
// E0242,
E0245, // not a trait
// E0245, // not a trait
// E0246, // invalid recursive type
// E0247,
// E0248, // value used as a type, now reported earlier during resolution as E0412
Expand Down
5 changes: 3 additions & 2 deletions src/test/ui/error-codes/E0404.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ struct Bar;

impl Foo for Bar {} //~ ERROR E0404

fn main() {
}
fn main() {}

fn baz<T: Foo>(_: T) {} //~ ERROR E0404
6 changes: 6 additions & 0 deletions src/test/ui/error-codes/E0404.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ error[E0404]: expected trait, found struct `Foo`
LL | impl Foo for Bar {} //~ ERROR E0404
| ^^^ not a trait

error[E0404]: expected trait, found struct `Foo`
--> $DIR/E0404.rs:18:11
|
LL | fn baz<T: Foo>(_: T) {} //~ ERROR E0404
| ^^^ not a trait

error: cannot continue compilation due to previous error

If you want more information on this error, try using "rustc --explain E0404"