mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 18:23:49 +00:00
exit out of compare_number_of_generics
early
This commit is contained in:
parent
6225e980bf
commit
4208c53ed6
@ -579,6 +579,27 @@ fn compare_self_type<'tcx>(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Checks that the number of generics on a given assoc item in a trait impl is the same
|
||||
/// as the number of generics on the respective assoc item in the trait definition.
|
||||
///
|
||||
/// For example this code emits the errors in the following code:
|
||||
/// ```
|
||||
/// trait Trait {
|
||||
/// fn foo();
|
||||
/// type Assoc<T>;
|
||||
/// }
|
||||
///
|
||||
/// impl Trait for () {
|
||||
/// fn foo<T>() {}
|
||||
/// //~^ error
|
||||
/// type Assoc = u32;
|
||||
/// //~^ error
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// Notably this does not error on `foo<T>` implemented as `foo<const N: u8>` or
|
||||
/// `foo<const N: u8>` implemented as `foo<const N: u32>`. This is handled in
|
||||
/// [`compare_generic_param_kinds`]. This function also does not handle lifetime parameters
|
||||
fn compare_number_of_generics<'tcx>(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
impl_: &ty::AssocItem,
|
||||
@ -589,6 +610,15 @@ fn compare_number_of_generics<'tcx>(
|
||||
let trait_own_counts = tcx.generics_of(trait_.def_id).own_counts();
|
||||
let impl_own_counts = tcx.generics_of(impl_.def_id).own_counts();
|
||||
|
||||
// This avoids us erroring on `foo<T>` implemented as `foo<const N: u8>` as this is implemented
|
||||
// in `compare_generic_param_kinds` which will give a nicer error message than something like:
|
||||
// "expected 1 type parameter, found 0 type parameters"
|
||||
if (trait_own_counts.types + trait_own_counts.consts)
|
||||
== (impl_own_counts.types + impl_own_counts.consts)
|
||||
{
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let matchings = [
|
||||
("type", trait_own_counts.types, impl_own_counts.types),
|
||||
("const", trait_own_counts.consts, impl_own_counts.consts),
|
||||
|
@ -3,7 +3,7 @@ trait Trait {
|
||||
}
|
||||
impl Trait for () {
|
||||
fn foo<const M: u64>() {}
|
||||
//~^ error: method `foo` has an incompatble generic parameter for trait
|
||||
//~^ error: method `foo` has an incompatible generic parameter for trait
|
||||
}
|
||||
|
||||
trait Other {
|
||||
@ -19,7 +19,7 @@ trait Uwu {
|
||||
}
|
||||
impl Uwu for () {
|
||||
fn baz<const N: i32>() {}
|
||||
//~^ error: method `baz` has an incompatible generic parameter for trait
|
||||
//~^ error: method `baz` has an incompatible const parameter type for trait
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,38 +1,26 @@
|
||||
error[E0049]: method `foo` has 0 type parameters but its trait declaration has 1 type parameter
|
||||
error[E0053]: method `foo` has an incompatible generic parameter for trait
|
||||
--> $DIR/mismatched_ty_const_in_trait_impl.rs:5:12
|
||||
|
|
||||
LL | fn foo<U>() {}
|
||||
| - expected 1 type parameter
|
||||
...
|
||||
LL | fn foo<const M: u64>() {}
|
||||
| ^^^^^^^^^^^^ found 0 type parameters
|
||||
|
||||
error[E0049]: method `foo` has 1 const parameter but its trait declaration has 0 const parameters
|
||||
--> $DIR/mismatched_ty_const_in_trait_impl.rs:5:12
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
note: the trait impl specifies `M` is a const parameter of type `u64`, but the declaration in trait `Trait::foo` requires it is a type parameter
|
||||
--> $DIR/mismatched_ty_const_in_trait_impl.rs:2:12
|
||||
|
|
||||
LL | fn foo<U>() {}
|
||||
| - expected 0 const parameters
|
||||
...
|
||||
LL | fn foo<const M: u64>() {}
|
||||
| ^^^^^^^^^^^^ found 1 const parameter
|
||||
| ^
|
||||
|
||||
error[E0049]: method `bar` has 1 type parameter but its trait declaration has 0 type parameters
|
||||
error[E0053]: method `bar` has an incompatible generic parameter for trait
|
||||
--> $DIR/mismatched_ty_const_in_trait_impl.rs:13:12
|
||||
|
|
||||
LL | fn bar<const M: u8>() {}
|
||||
| ----------- expected 0 type parameters
|
||||
...
|
||||
LL | fn bar<T>() {}
|
||||
| ^ found 1 type parameter
|
||||
|
||||
error[E0049]: method `bar` has 0 const parameters but its trait declaration has 1 const parameter
|
||||
--> $DIR/mismatched_ty_const_in_trait_impl.rs:13:12
|
||||
| ^
|
||||
|
|
||||
note: the trait impl specifies `T` is a type parameter, but the declaration in trait `Other::bar` requires it is a const parameter of type `u8`
|
||||
--> $DIR/mismatched_ty_const_in_trait_impl.rs:10:12
|
||||
|
|
||||
LL | fn bar<const M: u8>() {}
|
||||
| ----------- expected 1 const parameter
|
||||
...
|
||||
LL | fn bar<T>() {}
|
||||
| ^ found 0 const parameters
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error[E0053]: method `baz` has an incompatible const parameter type for trait
|
||||
--> $DIR/mismatched_ty_const_in_trait_impl.rs:21:12
|
||||
@ -46,7 +34,6 @@ note: the const parameter `N` has type `i32`, but the declaration in trait `Uwu:
|
||||
LL | fn baz<const N: u32>() {}
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0049, E0053.
|
||||
For more information about an error, try `rustc --explain E0049`.
|
||||
For more information about this error, try `rustc --explain E0053`.
|
||||
|
@ -6,7 +6,7 @@ trait Trait {
|
||||
|
||||
impl Trait for () {
|
||||
type Foo<const N: u64> = u32;
|
||||
//~^ error: associated type `Foo` has an incompatible const parameter type
|
||||
//~^ error: type `Foo` has an incompatible const parameter type
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,4 +1,4 @@
|
||||
error[E0053]: associated type `Foo` has an incompatible const parameter type for trait
|
||||
error[E0053]: type `Foo` has an incompatible const parameter type for trait
|
||||
--> $DIR/const_params_have_right_type.rs:8:14
|
||||
|
|
||||
LL | type Foo<const N: u64> = u32;
|
||||
|
Loading…
Reference in New Issue
Block a user