mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-03 22:02:51 +01:00
An interface A requiring another interface B means that an impl of A must verify that the self-type also impls B. The instructions created from this can involved a lookup that the self-type impls A, which end up finding the impl being defined. This is not problematic of itself, but it is problematic if these lookup instructions become part of the impl's generic definition. When we find a specific of that `impl as A` during impl lookup of A, and we resolve the specific definition, those lookup instructions are replayed. Doing so does another lookup for `impl as A`, which creates an infinitely recursive loop. To break this loop we move the lookup instructions done to verify that the self-type impls B outside of the definition of `impl as A`. This prevents them from being specialized. But it doesn't prevent us from diagnosing monomorphization errors properly. They just get diagnosed at the use of that invalid specific, instead of inside the verification of `impl as B` in the definition of `impl as A`.