// 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:
```
"##,
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:
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:
// functions implementation
}
```
+
+or
+
+```
+trait Foo {
+ // some functions
+}
+
+fn bar<T: Foo>(t: T) {} // ok!
+```
+
"##,
E0405: r##"
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
{
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;
/// 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.
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 {
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>,
// 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
impl Foo for Bar {} //~ ERROR E0404
-fn main() {
-}
+fn main() {}
+
+fn baz<T: Foo>(_: T) {} //~ ERROR E0404
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"