mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
When transforming instructions with symbolic constant values into the eval block, we previously special-cased `bind_symbolic_name` (and `symbolic_binding_pattern`) because they are places where symbolicness is introduced, rather than propagated from operands, and just copied them into the eval block. However, `bind_symbolic_name` can be dependent on other symbolic constants, because it can have a type that is dependent. In this case, the copy in the eval block would not have its type properly adjusted to refer to the type within the eval block. Fix this by performing substitution into `bind_symbolic_name` rather than copying it directly, and instead, detect cases where substitution determined that the instruction was unchanged despite having a symbolic constant value, and force it to be rebuilt in that case. I've not found any way that the previous behavior actually caused problems, or affected the observable behavior of the toolchain. The type of these instructions in the eval block doesn't make much difference to anything because they get immediately replaced by their corresponding argument values when we run the eval block. But this came up and caused some test output churn when I was making a different change, and it seems like a fix to our representation even if it's not changing behavior, so I'm splitting it out so it can be handled separately.