Code change:
<!-- Thank you for finding an Internal Compiler Error! If possible, try to provide a minimal verifiable example. You can read "Rust Bug Minimization Patterns" for how to create smaller examples. -- <!-- If you're using the stable version of the compiler, you should also check if the bug also exists in the beta or nightly versions. --<!-- Include a backtrace in the code block by setting in your environment. E.g. . --<details<summary<strongBacktrace</strong</summary<p</p</details
Minimized a bit more:
It started ICE-ing in 1.41.0:
This compiles successfully without the bound. It also compiles if you change the bound to constrain the associated type:
I bisected it to be between and : I've tried to bisect between these commits, but I'm getting a compilation error in llvm.
It'll be , which changed the coherence rules to allow . The impl in this code is intentionally allowed under the new rules and should be fine, so it didn't really regress in that PR so much as it was newly permitted but likely surfaced a pre-existing bug. I tried to replicate this issue with a local trait but compiles successfully, so this does seem to involve the built-in trait and operator (the error message complains about the MIR statement which is a built-in index).
Further reduced to: , but not on 1.24.0 I agree with assessment:
So it could be considered a stable-to-stable regression? I don't how or who could add this label.
Yeah, I guess we could modify labels +regression-from-stable-to-stable although it's a regression from a very old stable
Assigning priority as discussed in the of the Prioritization Working Group. label -I-prioritize +P-medium

Related discussion:
text: <ins> // MIR for `fun` 0 mir_map fn fun(_1: &[T]) -> &T { debug it => _1;                      // in scope 0 at $DIR/issue-91633.rs:+0:12: +0:14 let mut _0: &T;                      // return place in scope 0 at $DIR/issue-91633.rs:+0:25: +0:27 let _2: &T;                          // in scope 0 at $DIR/issue-91633.rs:+2:10: +2:11 let _3: usize;                       // in scope 0 at $DIR/issue-91633.rs:+2:18: +2:19 let mut _4: usize;                   // in scope 0 at $DIR/issue-91633.rs:+2:15: +2:20 let mut _5: bool;                    // in scope 0 at $DIR/issue-91633.rs:+2:15: +2:20 scope 1 { debug f => _2;                   // in scope 1 at $DIR/issue-91633.rs:+2:10: +2:11 } bb0: { StorageLive(_2);                 // scope 0 at $DIR/issue-91633.rs:+2:10: +2:11 StorageLive(_3);                 // scope 0 at $DIR/issue-91633.rs:+2:18: +2:19 _3 = const 0_usize;              // scope 0 at $DIR/issue-91633.rs:+2:18: +2:19 _4 = Len((*_1));                 // scope 0 at $DIR/issue-91633.rs:+2:15: +2:20 _5 = Lt(_3, _4);                 // scope 0 at $DIR/issue-91633.rs:+2:15: +2:20 assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, _3) -> [success: bb1, unwind: bb2]; // scope 0 at $DIR/issue-91633.rs:+2:15: +2:20 } bb1: { _2 = &(*_1)[_3];                 // scope 0 at $DIR/issue-91633.rs:+2:14: +2:20 FakeRead(ForLet(None), _2);      // scope 0 at $DIR/issue-91633.rs:+2:10: +2:11 _0 = &(*_2);                     // scope 1 at $DIR/issue-91633.rs:+3:6: +3:7 StorageDead(_3);                 // scope 0 at $DIR/issue-91633.rs:+4:2: +4:3 StorageDead(_2);                 // scope 0 at $DIR/issue-91633.rs:+4:2: +4:3 return;                          // scope 0 at $DIR/issue-91633.rs:+4:3: +4:3 } bb2 (cleanup): { resume;                          // scope 0 at $DIR/issue-91633.rs:+0:1: +4:3 } } </ins>