diff --git a/compiler/rustc_hir_analysis/src/check/compare_impl_item.rs b/compiler/rustc_hir_analysis/src/check/compare_impl_item.rs index 50f88eb970ab4..a668a1045757e 100644 --- a/compiler/rustc_hir_analysis/src/check/compare_impl_item.rs +++ b/compiler/rustc_hir_analysis/src/check/compare_impl_item.rs @@ -1723,6 +1723,7 @@ pub(super) fn compare_impl_const_raw( compare_number_of_generics(tcx, impl_const_item, trait_const_item, false)?; compare_generic_param_kinds(tcx, impl_const_item, trait_const_item, false)?; + check_region_bounds_on_impl_item(tcx, impl_const_item, trait_const_item, false)?; compare_const_predicate_entailment(tcx, impl_const_item, trait_const_item, impl_trait_ref) } @@ -1763,8 +1764,6 @@ fn compare_const_predicate_entailment<'tcx>( let impl_ct_predicates = tcx.predicates_of(impl_ct.def_id); let trait_ct_predicates = tcx.predicates_of(trait_ct.def_id); - check_region_bounds_on_impl_item(tcx, impl_ct, trait_ct, false)?; - // The predicates declared by the impl definition, the trait and the // associated const in the trait are assumed. let impl_predicates = tcx.predicates_of(impl_ct_predicates.parent.unwrap()); @@ -1866,6 +1865,7 @@ pub(super) fn compare_impl_ty<'tcx>( let _: Result<(), ErrorGuaranteed> = try { compare_number_of_generics(tcx, impl_ty, trait_ty, false)?; compare_generic_param_kinds(tcx, impl_ty, trait_ty, false)?; + check_region_bounds_on_impl_item(tcx, impl_ty, trait_ty, false)?; compare_type_predicate_entailment(tcx, impl_ty, trait_ty, impl_trait_ref)?; check_type_bounds(tcx, trait_ty, impl_ty, impl_trait_ref)?; }; @@ -1886,8 +1886,6 @@ fn compare_type_predicate_entailment<'tcx>( let impl_ty_predicates = tcx.predicates_of(impl_ty.def_id); let trait_ty_predicates = tcx.predicates_of(trait_ty.def_id); - check_region_bounds_on_impl_item(tcx, impl_ty, trait_ty, false)?; - let impl_ty_own_bounds = impl_ty_predicates.instantiate_own(tcx, impl_args); if impl_ty_own_bounds.len() == 0 { // Nothing to check. diff --git a/tests/ui/generic-const-items/compare-impl-item.rs b/tests/ui/generic-const-items/compare-impl-item.rs index 01e4477c698da..21c958a0abec2 100644 --- a/tests/ui/generic-const-items/compare-impl-item.rs +++ b/tests/ui/generic-const-items/compare-impl-item.rs @@ -6,9 +6,10 @@ trait Trait

{ const B: u64; const C: T; const D: usize; + const E<'a>: &'a (); - const E: usize; - const F: (); + const F: usize; + const G: (); } impl

Trait

for () { @@ -20,11 +21,13 @@ impl

Trait

for () { //~^ ERROR const `C` has 0 type parameters but its trait declaration has 1 type parameter const D: u16 = N; //~^ ERROR const `D` has an incompatible generic parameter for trait `Trait` + const E: &'static () = &(); + //~^ ERROR lifetime parameters or bounds on const `E` do not match the trait declaration - const E: usize = 1024 + const F: usize = 1024 where P: Copy; //~ ERROR impl has stricter requirements than trait - const F: () = (); //~ ERROR impl has stricter requirements than trait + const G: () = (); //~ ERROR impl has stricter requirements than trait } fn main() {} diff --git a/tests/ui/generic-const-items/compare-impl-item.stderr b/tests/ui/generic-const-items/compare-impl-item.stderr index 8610d8cba0004..3bf28e9da60f6 100644 --- a/tests/ui/generic-const-items/compare-impl-item.stderr +++ b/tests/ui/generic-const-items/compare-impl-item.stderr @@ -1,5 +1,5 @@ error[E0049]: const `A` has 1 type parameter but its trait declaration has 0 type parameters - --> $DIR/compare-impl-item.rs:15:13 + --> $DIR/compare-impl-item.rs:16:13 | LL | const A: (); | - expected 0 type parameters @@ -8,7 +8,7 @@ LL | const A: () = (); | ^ found 1 type parameter error[E0049]: const `B` has 1 const parameter but its trait declaration has 2 const parameters - --> $DIR/compare-impl-item.rs:17:13 + --> $DIR/compare-impl-item.rs:18:13 | LL | const B: u64; | ------------ ------------ @@ -19,7 +19,7 @@ LL | const B: u64 = 0; | ^^^^^^^^^^^^ found 1 const parameter error[E0049]: const `C` has 0 type parameters but its trait declaration has 1 type parameter - --> $DIR/compare-impl-item.rs:19:13 + --> $DIR/compare-impl-item.rs:20:13 | LL | const C: T; | - expected 1 type parameter @@ -28,7 +28,7 @@ LL | const C<'a>: &'a str = ""; | ^^ found 0 type parameters error[E0053]: const `D` has an incompatible generic parameter for trait `Trait` - --> $DIR/compare-impl-item.rs:21:13 + --> $DIR/compare-impl-item.rs:22:13 | LL | trait Trait

{ | ----- @@ -42,25 +42,34 @@ LL | impl

Trait

for () { LL | const D: u16 = N; | ^^^^^^^^^^^^ found const parameter of type `u16` +error[E0195]: lifetime parameters or bounds on const `E` do not match the trait declaration + --> $DIR/compare-impl-item.rs:24:12 + | +LL | const E<'a>: &'a (); + | ---- lifetimes in impl do not match this const in trait +... +LL | const E: &'static () = &(); + | ^ lifetimes do not match const in trait + error[E0276]: impl has stricter requirements than trait - --> $DIR/compare-impl-item.rs:26:12 + --> $DIR/compare-impl-item.rs:29:12 | -LL | const E: usize; - | -------------- definition of `E` from trait +LL | const F: usize; + | -------------- definition of `F` from trait ... LL | P: Copy; | ^^^^ impl has extra requirement `P: Copy` error[E0276]: impl has stricter requirements than trait - --> $DIR/compare-impl-item.rs:27:16 + --> $DIR/compare-impl-item.rs:30:16 | -LL | const F: (); - | ------------------------- definition of `F` from trait +LL | const G: (); + | ------------------------- definition of `G` from trait ... -LL | const F: () = (); +LL | const G: () = (); | ^^ impl has extra requirement `T: Eq` -error: aborting due to 6 previous errors +error: aborting due to 7 previous errors -Some errors have detailed explanations: E0049, E0053, E0276. +Some errors have detailed explanations: E0049, E0053, E0195, E0276. For more information about an error, try `rustc --explain E0049`.