require type defaults to be after const generic parameters
as if this is currently possible. HA!
This commit is contained in:
parent
9e92106d45
commit
a95e6bb916
3 changed files with 46 additions and 6 deletions
|
@ -1118,13 +1118,26 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
|||
fn visit_generics(&mut self, generics: &'a Generics) {
|
||||
let mut prev_ty_default = None;
|
||||
for param in &generics.params {
|
||||
if let GenericParamKind::Type { ref default, .. } = param.kind {
|
||||
if default.is_some() {
|
||||
match param.kind {
|
||||
GenericParamKind::Lifetime => (),
|
||||
GenericParamKind::Type { default: Some(_), .. } => {
|
||||
prev_ty_default = Some(param.ident.span);
|
||||
} else if let Some(span) = prev_ty_default {
|
||||
self.err_handler()
|
||||
.span_err(span, "type parameters with a default must be trailing");
|
||||
break;
|
||||
}
|
||||
GenericParamKind::Type { .. } | GenericParamKind::Const { .. } => {
|
||||
if let Some(span) = prev_ty_default {
|
||||
let mut err = self.err_handler().struct_span_err(
|
||||
span,
|
||||
"type parameters with a default must be trailing",
|
||||
);
|
||||
if matches!(param.kind, GenericParamKind::Const { .. }) {
|
||||
err.note(
|
||||
"using type defaults and const parameters \
|
||||
in the same parameter listing is currently not possible",
|
||||
);
|
||||
}
|
||||
err.emit();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
8
src/test/ui/const-generics/defaults/wrong-order.rs
Normal file
8
src/test/ui/const-generics/defaults/wrong-order.rs
Normal file
|
@ -0,0 +1,8 @@
|
|||
#![feature(const_generics)] //~ WARN the feature `const_generics` is incomplete
|
||||
|
||||
struct A<T = u32, const N: usize> {
|
||||
//~^ ERROR type parameters with a default must be trailing
|
||||
arg: T,
|
||||
}
|
||||
|
||||
fn main() {}
|
19
src/test/ui/const-generics/defaults/wrong-order.stderr
Normal file
19
src/test/ui/const-generics/defaults/wrong-order.stderr
Normal file
|
@ -0,0 +1,19 @@
|
|||
error: type parameters with a default must be trailing
|
||||
--> $DIR/wrong-order.rs:3:10
|
||||
|
|
||||
LL | struct A<T = u32, const N: usize> {
|
||||
| ^
|
||||
|
|
||||
= note: using type defaults and const parameters in the same parameter listing is currently not possible
|
||||
|
||||
warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/wrong-order.rs:1:12
|
||||
|
|
||||
LL | #![feature(const_generics)]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
= note: see issue #44580 <https://github.com/rust-lang/rust/issues/44580> for more information
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
Loading…
Reference in a new issue