Стандарт по N4567 запрещает некоторые виды повторного объявления имени, ранее объявленного в условии следующим образом - в соответствии со стандартом (§3.3.3/4):
Имена, объявленные в for-init-statement, for-range-declaration и в условии if, while, for и switch, являются локальными для оператора if, while, for или switch (включая управляемый оператор) и не должен быть повторно объявлен в последующем условии этого оператора, а также в самом удаленном блоке (или для оператора if) любого из внешних блоков управляемой инструкции; см. 6.4.
Однако, учитывая тот факт, что следующий код компилируется нормально,
int main(void) {
if (int i=10)
if (int i=20)
;
return 0;
}
мне кажется непонятным, что именно означает "последующее условие этого утверждения".