Ну, это непростая задача, я согласен. Плавающий контракт означает, что программу можно понять так, а можно этак. Компилятор по факту(и в силу правил семантики языка) выбирает какой-то определенный путь, и выдает ошибку в соответствии с ним, хотя фактически ты мог иметь ввиду что-то совершенно иное(то есть пойти по иному пути). Фактически нам нужен более умный компилятор, который более глубоко способен понимать суть того, что ты пытался неявно выразить. Повторюсь, что это непростая исследовательская задача, но тут есть пространство для исследования, как мне кажется.