diff options
| author | Aaron Hill <aa1ronham@gmail.com> | 2019-06-06 22:23:28 -0400 |
|---|---|---|
| committer | Aaron Hill <aa1ronham@gmail.com> | 2019-06-22 16:03:17 -0400 |
| commit | 0fa945e184c9903ed204a7aa49dac9f9da77ae42 (patch) | |
| tree | aa3d6cdab8003a2589398ebc86a1031ed597059a /src/rustllvm/RustWrapper.cpp | |
| parent | 9d0960a6f8fbd561b2f5d9fb54ba49d533f61832 (diff) | |
| download | rust-0fa945e184c9903ed204a7aa49dac9f9da77ae42.tar.gz rust-0fa945e184c9903ed204a7aa49dac9f9da77ae42.zip | |
Change how we compute yield_in_scope
Compound operators (e.g. 'a += b') have two different possible evaluation orders. When the left-hand side is a primitive type, the expression is evaluated right-to-left. However, when the left-hand side is a non-primitive type, the expression is evaluated left-to-right. This causes problems when we try to determine if a type is live across a yield point. Since we need to perform this computation before typecheck has run, we can't simply check the types of the operands. This commit calculates the most 'pessimistic' scenario - that is, erring on the side of treating more types as live, rather than fewer. This is perfectly safe - in fact, this initial liveness computation is already overly conservative (e.g. issue #57478). The important thing is that we compute a superset of the types that are actually live across yield points. When we generate MIR, we'll determine which types actually need to stay live across a given yield point, and which ones cam actually be dropped. Concretely, we force the computed HIR traversal index for right-hand-side yield expression to be equal to the maximum index for the left-hand side. This covers both possible execution orders: * If the expression is evalauted right-to-left, our 'pessismitic' index is unecessary, but safe. We visit the expressions in an ExprKind::AssignOp from right to left, so it actually would have been safe to do nothing. However, while increasing the index of a yield point might cause the compiler to reject code that could actually compile, it will never cause incorrect code to be accepted. * If the expression is evaluated left-to-right, our 'pessimistic' index correctly ensures that types in the left-hand-side are seen as occuring before the yield - which is exactly what we want
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
0 files changed, 0 insertions, 0 deletions
