contract test {
    function f() pure public returns (uint) {
        uint x = 7;
        {
            x = 3; // This should still assign to the outer variable
            uint x;
            x = 4; // This should assign to the new one
        }
        return x;
    }
    function g() pure public returns (uint x) {
        x = 7;
        {
            x = 3;
            uint x;
            return x; // This returns the new variable, i.e. 0
        }
    }
    function h() pure public returns (uint x, uint a, uint b) {
        x = 7;
        {
            x = 3;
            a = x; // This should read from the outer
            uint x = 4;
            b = x;
        }
    }
    function i() pure public returns (uint x, uint a) {
        x = 7;
        {
            x = 3;
            uint x = x; // This should read from the outer and assign to the inner
            a = x;
        }
    }
}
// ----
// f() -> 3
// g() -> 0
// h() -> 3, 3, 4
// i() -> 3, 3