use rustc_hir as hir;
use rustc_hir::def::{CtorOf, DefKind, Namespace, Res};
use rustc_hir::def_id::DefId;
-use rustc_hir::intravisit::Visitor;
+use rustc_hir::intravisit::{walk_generics, Visitor};
use rustc_hir::print;
use rustc_hir::{Constness, ExprKind, GenericArg, GenericArgs};
use rustc_session::lint::builtin::{AMBIGUOUS_ASSOCIATED_ITEMS, LATE_BOUND_LIFETIME_ARGUMENTS};
}
},
);
- if !inferred_params.is_empty() {
- // We always collect the spans for placeholder types when evaluating `fn`s, but we
- // only want to emit an error complaining about them if infer types (`_`) are not
- // allowed. `allow_ty_infer` gates this behavior.
- crate::collect::placeholder_type_error(
- tcx,
- inferred_params[0],
- &[],
- inferred_params,
- false,
- );
- }
self.complain_about_missing_type_params(
missing_type_params,
}
hir::TyKind::BareFn(ref bf) => {
require_c_abi_if_c_variadic(tcx, &bf.decl, bf.abi, ast_ty.span);
- tcx.mk_fn_ptr(self.ty_of_fn(bf.unsafety, bf.abi, &bf.decl, &[], None))
+ tcx.mk_fn_ptr(self.ty_of_fn(
+ bf.unsafety,
+ bf.abi,
+ &bf.decl,
+ &hir::Generics::empty(),
+ None,
+ ))
}
hir::TyKind::TraitObject(ref bounds, ref lifetime) => {
self.conv_object_ty_poly_trait_ref(ast_ty.span, bounds, lifetime)
unsafety: hir::Unsafety,
abi: abi::Abi,
decl: &hir::FnDecl<'_>,
- generic_params: &[hir::GenericParam<'_>],
+ generics: &hir::Generics<'_>,
ident_span: Option<Span>,
) -> ty::PolyFnSig<'tcx> {
debug!("ty_of_fn");
for ty in decl.inputs {
visitor.visit_ty(ty);
}
+ walk_generics(&mut visitor, generics);
+
let input_tys = decl.inputs.iter().map(|a| self.ty_of_arg(a, None));
let output_ty = match decl.output {
hir::FnRetTy::Return(ref output) => {
crate::collect::placeholder_type_error(
tcx,
ident_span.map(|sp| sp.shrink_to_hi()).unwrap_or(DUMMY_SP),
- generic_params,
+ &generics.params[..],
visitor.0,
ident_span.is_some(),
);
tcx.sess,
decl.output.span(),
E0581,
- "return type references {} \
- which is not constrained by the fn input types",
+ "return type references {} which is not constrained by the fn input types",
lifetime_name
);
if let ty::BrAnon(_) = *br {
// though we can easily give a hint that ought to be
// relevant.
err.note(
- "lifetimes appearing in an associated type \
- are not considered constrained",
+ "lifetimes appearing in an associated type are not considered constrained",
);
}
err.emit();
let fcx = if let (Some(header), Some(decl)) = (fn_header, fn_decl) {
let fn_sig = if crate::collect::get_infer_ret_ty(&decl.output).is_some() {
let fcx = FnCtxt::new(&inh, param_env, body.value.hir_id);
- AstConv::ty_of_fn(&fcx, header.unsafety, header.abi, decl, &[], None)
+ AstConv::ty_of_fn(
+ &fcx,
+ header.unsafety,
+ header.abi,
+ decl,
+ &hir::Generics::empty(),
+ None,
+ )
} else {
tcx.fn_sig(def_id)
};
sig.header.unsafety,
sig.header.abi,
&sig.decl,
- &generics.params[..],
+ &generics,
Some(ident.span),
),
}
ident,
generics,
..
- }) => AstConv::ty_of_fn(
- &icx,
- header.unsafety,
- header.abi,
- decl,
- &generics.params[..],
- Some(ident.span),
- ),
+ }) => {
+ AstConv::ty_of_fn(&icx, header.unsafety, header.abi, decl, &generics, Some(ident.span))
+ }
ForeignItem(&hir::ForeignItem { kind: ForeignItemKind::Fn(ref fn_decl, _, _), .. }) => {
let abi = tcx.hir().get_foreign_abi(hir_id);
} else {
hir::Unsafety::Unsafe
};
- let fty = AstConv::ty_of_fn(&ItemCtxt::new(tcx, def_id), unsafety, abi, decl, &[], None);
+ let fty = AstConv::ty_of_fn(
+ &ItemCtxt::new(tcx, def_id),
+ unsafety,
+ abi,
+ decl,
+ &hir::Generics::empty(),
+ None,
+ );
// Feature gate SIMD types in FFI, since I am not sure that the
// ABIs are handled at all correctly. -huonw
fn foo<X: K<_, _>>(x: X) {}
//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
+fn bar<F>(_: F) where F: Fn() -> _ {}
+//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
+
+fn baz<F: Fn() -> _>(_: F) {}
+//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
+
+struct L<F>(F) where F: Fn() -> _;
+//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
+struct M<F> where F: Fn() -> _ {
+//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
+ a: F,
+}
+enum N<F> where F: Fn() -> _ {
+//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
+ Foo(F),
+}
+
+union O<F> where F: Fn() -> _ {
+//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
+//~| ERROR unions with non-`Copy` fields are unstable
+ foo: F,
+}
+
+trait P<F> where F: Fn() -> _ {
+//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
+}
+
+trait Q {
+ fn foo<F>(_: F) where F: Fn() -> _ {}
+ //~^ ERROR the type placeholder `_` is not allowed within types on item signatures
+}
+
fn main() {}
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
+error[E0658]: unions with non-`Copy` fields are unstable
+ --> $DIR/bad-assoc-ty.rs:69:1
+ |
+LL | / union O<F> where F: Fn() -> _ {
+LL | |
+LL | |
+LL | | foo: F,
+LL | | }
+ | |_^
+ |
+ = note: see issue #55149 <https://github.com/rust-lang/rust/issues/55149> for more information
+ = help: add `#![feature(untagged_unions)]` to the crate attributes to enable
+
error[E0223]: ambiguous associated type
--> $DIR/bad-assoc-ty.rs:1:10
|
| ^ ^ not allowed in type signatures
| |
| not allowed in type signatures
+ |
+help: use type parameters instead
+ |
+LL | fn foo<X, T: K<T, T>>(x: X) {}
+ | ^^^ ^ ^
+
+error[E0121]: the type placeholder `_` is not allowed within types on item signatures
+ --> $DIR/bad-assoc-ty.rs:52:34
+ |
+LL | fn bar<F>(_: F) where F: Fn() -> _ {}
+ | ^ not allowed in type signatures
+ |
+help: use type parameters instead
+ |
+LL | fn bar<F, T>(_: F) where F: Fn() -> T {}
+ | ^^^ ^
+
+error[E0121]: the type placeholder `_` is not allowed within types on item signatures
+ --> $DIR/bad-assoc-ty.rs:55:19
+ |
+LL | fn baz<F: Fn() -> _>(_: F) {}
+ | ^ not allowed in type signatures
+ |
+help: use type parameters instead
+ |
+LL | fn baz<F, T: Fn() -> T>(_: F) {}
+ | ^^^ ^
+
+error[E0121]: the type placeholder `_` is not allowed within types on item signatures
+ --> $DIR/bad-assoc-ty.rs:58:33
+ |
+LL | struct L<F>(F) where F: Fn() -> _;
+ | ^ not allowed in type signatures
+ |
+help: use type parameters instead
+ |
+LL | struct L<F, T>(F) where F: Fn() -> T;
+ | ^^^ ^
+
+error[E0121]: the type placeholder `_` is not allowed within types on item signatures
+ --> $DIR/bad-assoc-ty.rs:60:30
+ |
+LL | struct M<F> where F: Fn() -> _ {
+ | ^ not allowed in type signatures
+ |
+help: use type parameters instead
+ |
+LL | struct M<F, T> where F: Fn() -> T {
+ | ^^^ ^
+
+error[E0121]: the type placeholder `_` is not allowed within types on item signatures
+ --> $DIR/bad-assoc-ty.rs:64:28
+ |
+LL | enum N<F> where F: Fn() -> _ {
+ | ^ not allowed in type signatures
+ |
+help: use type parameters instead
+ |
+LL | enum N<F, T> where F: Fn() -> T {
+ | ^^^ ^
+
+error[E0121]: the type placeholder `_` is not allowed within types on item signatures
+ --> $DIR/bad-assoc-ty.rs:69:29
+ |
+LL | union O<F> where F: Fn() -> _ {
+ | ^ not allowed in type signatures
+ |
+help: use type parameters instead
+ |
+LL | union O<F, T> where F: Fn() -> T {
+ | ^^^ ^
+
+error[E0121]: the type placeholder `_` is not allowed within types on item signatures
+ --> $DIR/bad-assoc-ty.rs:75:29
+ |
+LL | trait P<F> where F: Fn() -> _ {
+ | ^ not allowed in type signatures
+ |
+help: use type parameters instead
+ |
+LL | trait P<F, T> where F: Fn() -> T {
+ | ^^^ ^
+
+error[E0121]: the type placeholder `_` is not allowed within types on item signatures
+ --> $DIR/bad-assoc-ty.rs:80:38
+ |
+LL | fn foo<F>(_: F) where F: Fn() -> _ {}
+ | ^ not allowed in type signatures
+ |
+help: use type parameters instead
+ |
+LL | fn foo<F, T>(_: F) where F: Fn() -> T {}
+ | ^^^ ^
-error: aborting due to 20 previous errors
+error: aborting due to 29 previous errors
-Some errors have detailed explanations: E0121, E0223.
+Some errors have detailed explanations: E0121, E0223, E0658.
For more information about an error, try `rustc --explain E0121`.
//~^ ERROR expected identifier, found reserved identifier `_`
impl BadTrait<_> for BadStruct<_> {}
//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
-//~| ERROR the type placeholder `_` is not allowed within types on item signatures
-//~| ERROR the type placeholder `_` is not allowed within types on item signatures
fn impl_trait() -> impl BadTrait<_> {
//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
-//~| ERROR the type placeholder `_` is not allowed within types on item signatures
unimplemented!()
}
type X = Box<_>;
//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
-//~| ERROR the type placeholder `_` is not allowed within types on item signatures
struct Struct;
trait Trait<T> {}
impl Trait<usize> for Struct {}
type Y = impl Trait<_>;
//~^ ERROR the type placeholder `_` is not allowed within types on item signatures
-//~| ERROR the type placeholder `_` is not allowed within types on item signatures
fn foo() -> Y {
Struct
}
| ^ expected identifier, found reserved identifier
error: expected identifier, found reserved identifier `_`
- --> $DIR/typeck_type_placeholder_item.rs:170:19
+ --> $DIR/typeck_type_placeholder_item.rs:167:19
|
LL | struct BadStruct1<_, _>(_);
| ^ expected identifier, found reserved identifier
error: expected identifier, found reserved identifier `_`
- --> $DIR/typeck_type_placeholder_item.rs:170:22
+ --> $DIR/typeck_type_placeholder_item.rs:167:22
|
LL | struct BadStruct1<_, _>(_);
| ^ expected identifier, found reserved identifier
error: expected identifier, found reserved identifier `_`
- --> $DIR/typeck_type_placeholder_item.rs:175:19
+ --> $DIR/typeck_type_placeholder_item.rs:172:19
|
LL | struct BadStruct2<_, T>(_, T);
| ^ expected identifier, found reserved identifier
error: associated constant in `impl` without body
- --> $DIR/typeck_type_placeholder_item.rs:208:5
+ --> $DIR/typeck_type_placeholder_item.rs:203:5
|
LL | const C: _;
| ^^^^^^^^^^-
| help: provide a definition for the constant: `= <expr>;`
error[E0403]: the name `_` is already used for a generic parameter in this item's generic parameters
- --> $DIR/typeck_type_placeholder_item.rs:170:22
+ --> $DIR/typeck_type_placeholder_item.rs:167:22
|
LL | struct BadStruct1<_, _>(_);
| - ^ already used
LL | struct BadStruct<T>(T);
| ^ ^
-error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:159:32
- |
-LL | impl BadTrait<_> for BadStruct<_> {}
- | ^ not allowed in type signatures
-
-error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:159:15
- |
-LL | impl BadTrait<_> for BadStruct<_> {}
- | ^ not allowed in type signatures
-
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
--> $DIR/typeck_type_placeholder_item.rs:159:15
|
| ^^^ ^ ^
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:164:34
+ --> $DIR/typeck_type_placeholder_item.rs:162:34
|
LL | fn impl_trait() -> impl BadTrait<_> {
| ^ not allowed in type signatures
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:170:25
+ --> $DIR/typeck_type_placeholder_item.rs:167:25
|
LL | struct BadStruct1<_, _>(_);
| ^ not allowed in type signatures
| ^ ^
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:175:25
+ --> $DIR/typeck_type_placeholder_item.rs:172:25
|
LL | struct BadStruct2<_, T>(_, T);
| ^ not allowed in type signatures
| ^ ^
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:179:14
- |
-LL | type X = Box<_>;
- | ^ not allowed in type signatures
-
-error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:179:14
+ --> $DIR/typeck_type_placeholder_item.rs:176:14
|
LL | type X = Box<_>;
| ^ not allowed in type signatures
| ^^^ ^
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:164:34
- |
-LL | fn impl_trait() -> impl BadTrait<_> {
- | ^ not allowed in type signatures
-
-error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:186:21
- |
-LL | type Y = impl Trait<_>;
- | ^ not allowed in type signatures
-
-error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:186:21
+ --> $DIR/typeck_type_placeholder_item.rs:182:21
|
LL | type Y = impl Trait<_>;
| ^ not allowed in type signatures
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:195:14
+ --> $DIR/typeck_type_placeholder_item.rs:190:14
|
LL | type B = _;
| ^ not allowed in type signatures
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:197:14
+ --> $DIR/typeck_type_placeholder_item.rs:192:14
|
LL | const C: _;
| ^ not allowed in type signatures
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:199:14
+ --> $DIR/typeck_type_placeholder_item.rs:194:14
|
LL | const D: _ = 42;
| ^
| help: replace with the correct return type: `main::FnTest9`
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:204:14
+ --> $DIR/typeck_type_placeholder_item.rs:199:14
|
LL | type A = _;
| ^ not allowed in type signatures
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:206:14
+ --> $DIR/typeck_type_placeholder_item.rs:201:14
|
LL | type B = _;
| ^ not allowed in type signatures
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:208:14
+ --> $DIR/typeck_type_placeholder_item.rs:203:14
|
LL | const C: _;
| ^ not allowed in type signatures
error[E0121]: the type placeholder `_` is not allowed within types on item signatures
- --> $DIR/typeck_type_placeholder_item.rs:211:14
+ --> $DIR/typeck_type_placeholder_item.rs:206:14
|
LL | const D: _ = 42;
| ^
| not allowed in type signatures
| help: replace `_` with the correct type: `i32`
-error: aborting due to 71 previous errors
+error: aborting due to 66 previous errors
Some errors have detailed explanations: E0121, E0282, E0403.
For more information about an error, try `rustc --explain E0121`.