You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Jan 12, 2024. It is now read-only.
When a conditional includes nested conditionals that modify variables defined outside of the outer conditional scope, the outer conditional may incorrectly be lifted into a generated callable by the ConditionallyControlled rewrite step. See discussion with concrete examples in comments here #767 (comment).
To Reproduce
The easiest way to reproduce this is to use ClassicallyControlledSupportTests.qs from the qsharp-runtime repo. Add the following operation to the file:
operationMutableWithNesting() : Unit {
mutablex=0;
if (x==0) {
if (x<1) {
setx=1;
}
}
Message($"{x}");
}
And then recompile the repo. The compilation will succeed and produce generated C# files in the obj/qsharp/src folder. Investigate ClassicallyControlledSupportTests.g.cs, and observe that the outer if-statement is lifted into a callabe that is passed the x variable as a read-only argument even though the generated body performs an update of that variable. The C# will compile, but the behavior at runtime will be wrong, as the variable x will have the value zero after execution instead of the expected value of 1.
Expected behavior
Both the inner if-statement and the outer one should be recognized as not valid for lifting, so no lifted callables should be generated.