Correct the polymorphic extern fn error for const parameters
This commit is contained in:
parent
4894123d21
commit
14e6947fa4
@ -1511,20 +1511,39 @@ pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item) {
|
|||||||
} else {
|
} else {
|
||||||
for item in &m.items {
|
for item in &m.items {
|
||||||
let generics = tcx.generics_of(tcx.hir().local_def_id(item.hir_id));
|
let generics = tcx.generics_of(tcx.hir().local_def_id(item.hir_id));
|
||||||
if generics.params.len() - generics.own_counts().lifetimes != 0 {
|
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),
|
||||||
|
};
|
||||||
let mut err = struct_span_err!(
|
let mut err = struct_span_err!(
|
||||||
tcx.sess,
|
tcx.sess,
|
||||||
item.span,
|
item.span,
|
||||||
E0044,
|
E0044,
|
||||||
"foreign items may not have type parameters"
|
"foreign items may not have {} parameters",
|
||||||
|
kinds,
|
||||||
|
);
|
||||||
|
err.span_label(
|
||||||
|
item.span,
|
||||||
|
&format!("can't have {} parameters", kinds),
|
||||||
);
|
);
|
||||||
err.span_label(item.span, "can't have type parameters");
|
|
||||||
// FIXME: once we start storing spans for type arguments, turn this into a
|
// FIXME: once we start storing spans for type arguments, turn this into a
|
||||||
// suggestion.
|
// suggestion.
|
||||||
err.help(
|
err.help(&format!(
|
||||||
"use specialization instead of type parameters by replacing them \
|
"use specialization instead of {} parameters by replacing \
|
||||||
with concrete types like `u32`",
|
them with concrete {}{}",
|
||||||
);
|
kinds,
|
||||||
|
kinds_pl,
|
||||||
|
if let Some(egs) = egs {
|
||||||
|
format!(" like `{}`", egs)
|
||||||
|
} else {
|
||||||
|
"".to_string()
|
||||||
|
},
|
||||||
|
));
|
||||||
err.emit();
|
err.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
10
src/test/ui/const-generics/foreign-item-const-parameter.rs
Normal file
10
src/test/ui/const-generics/foreign-item-const-parameter.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#![feature(const_generics)]
|
||||||
|
//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
fn foo<const X: usize>(); //~ ERROR foreign items may not have const parameters
|
||||||
|
|
||||||
|
fn bar<T, const X: usize>(_: T); //~ ERROR foreign items may not have type or const parameters
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,27 @@
|
|||||||
|
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: use specialization instead of const parameters by replacing them 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: use specialization instead of type or const parameters by replacing them with concrete types or consts
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0044`.
|
Loading…
x
Reference in New Issue
Block a user