} else {
for item in &m.items {
let generics = tcx.generics_of(tcx.hir().local_def_id(item.hir_id));
- if generics.params.len() - generics.own_counts().lifetimes != 0 {
- let mut err = struct_span_err!(
+ let own_counts = generics.own_counts();
+ if generics.params.len() - own_counts.lifetimes != 0 {
+ let (kinds, kinds_pl, egs) = match (own_counts.types, own_counts.consts) {
+ (_, 0) => ("type", "types", Some("u32")),
+ // We don't specify an example value, because we can't generate
+ // a valid value for any type.
+ (0, _) => ("const", "consts", None),
+ _ => ("type or const", "types or consts", None),
+ };
+ struct_span_err!(
tcx.sess,
item.span,
E0044,
- "foreign items may not have type parameters"
- );
- err.span_label(item.span, "can't have type parameters");
- // FIXME: once we start storing spans for type arguments, turn this into a
- // suggestion.
- err.help(
- "use specialization instead of type parameters by replacing them \
- with concrete types like `u32`",
- );
- err.emit();
+ "foreign items may not have {} parameters",
+ kinds,
+ ).span_label(
+ item.span,
+ &format!("can't have {} parameters", kinds),
+ ).help(
+ // FIXME: once we start storing spans for type arguments, turn this
+ // into a suggestion.
+ &format!(
+ "replace the {} parameters with concrete {}{}",
+ kinds,
+ kinds_pl,
+ egs.map(|egs| format!(" like `{}`", egs)).unwrap_or_default(),
+ ),
+ ).emit();
}
if let hir::ForeignItemKind::Fn(ref fn_decl, _, _) = item.node {
--- /dev/null
+warning: the feature `const_generics` is incomplete and may cause the compiler to crash
+ --> $DIR/foreign-item-const-parameter.rs:1:12
+ |
+LL | #![feature(const_generics)]
+ | ^^^^^^^^^^^^^^
+ |
+ = note: `#[warn(incomplete_features)]` on by default
+
+error[E0044]: foreign items may not have const parameters
+ --> $DIR/foreign-item-const-parameter.rs:5:5
+ |
+LL | fn foo<const X: usize>();
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^ can't have const parameters
+ |
+ = help: replace the const parameters with concrete consts
+
+error[E0044]: foreign items may not have type or const parameters
+ --> $DIR/foreign-item-const-parameter.rs:7:5
+ |
+LL | fn bar<T, const X: usize>(_: T);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't have type or const parameters
+ |
+ = help: replace the type or const parameters with concrete types or consts
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0044`.