# bye bye normalizes-to The old solver does not support the concept of normalizes-to, we always have the fallback to equating as a rigid projection behavior. It should be safe to maintain that behavior with the new solver as well and then maybe change it at some point in the future. ## how projection goals work in the new solver One-step normalization can either assemble no candidates, keep the `term` unconstrained, or actually constrain it in some way. ### how projection goals work in the old solver If we fail to project, equate the `term` with a rigid projection. In case of ambiguity, we stall. We make inference progress if selection results in a single candidate. We do not evaluate nested goals during selection if there is only a single candidate, which is different in the new solver. If selection succeeds ignoring nested goals, but fails once we evaluate them, this means that there was a single impl candidate and no candidates from the `ParamEnv`. This case would error in the old solver and result in a 'rigid projection' in the new one. Given that such a projection is not WF we error either way. ### issue `AMBIG w constraints -> ERROR`: do not want to emit an error like "failed to normalize `<partially inferred assoc ty>` to `<rigid projection>`". This should only happen if the projection is not well-formed :thinking_face: ### issue `Projection` unconstrained term hack. How can the parent goal differentiate between "normalizes to itself" and "failed to normalize". One should result in overflow, the other one should not. idea: `normalizes-to` which only expects and infer var as it's term ## structurally normalizing in the solver ## alias-relate With `Projection`, it should be possible to use `structurally_normalize_ty(lhs) == structurally_normalize_ty(rhs)`. This has good perf :3 ## structurally normalizing outside of the solver ## deeply normalizing outside of the solver